无法解决问题



在下面代码的添加用户部分,我无法为"Add another person?(y/n): "问题键入任何字符。它只是跳回到进入年龄。我该如何解决这个问题?

我试图将ans更改为字符串,实现while循环以强制显示问题,以及许多其他事情。似乎什么都不起作用,我已经尝试了两个小时的

#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
int main()
{
char ans;
int people;
int option;
int count = 0;
struct data
{
string name;
int age;
char gender;
string comments;
}person[100];
// homescreen 
homescreen:
cout << "Welcome to the Data Base!" << endl;
cout << endl;
// displaying all people
for (int list = 0; list < count; list++)
{
cout << list << ".) " << person[list].name << endl;
}
cout << endl;
cout << "[1] View Person" << endl;
cout << "[2] Add Person" << endl;
cout << "[3] Edit Person" << endl;
cout << "[4] Delete Person" << endl;
cout << "[5] Exit" << endl;
cout << "Choose Option: ";  cin >> option;
// using options
while (option != 5)
{
if (option == 1)
{
view:
for (int list2 = 0; list2 < count; list2++)
{
cout << list2 << ".) " << person[list2].name << endl;
}
cout << endl;
cout << "Enter number of person you want: ";  cin >> people;
system("cls");
cout << "Name: " << person[count].name << endl;
cout << "Age: " << person[count].age << endl;
cout << "Gender: " << person[count].gender << endl;
cout << "Comments: " << person[count].comments << endl << endl;
cout << "View another person?(y/n): ";      cin >> ans;
if (ans == 'y')
{
system("cls");      goto view;
}
else if (ans == 'n')
{
system("cls");      goto homescreen;
}
}
if (option == 2)
{
add:
system("cls");
cout << "Name: ";  cin >> person[count].name;
system("cls");
cout << "Age: ";  cin >> person[count].age;
system("cls");
cout << "Gender(M/F/H): ";  cin >> person[count].gender;
system("cls");
cout << "Comments: ";  cin >> person[count].comments;
count++;
system("cls");
cout << "Add another person?(y/n): ";   cin >> ans;
if (ans == 'y')
{
system("cls");
goto add;
}
else if (ans == 'n')
{
system("cls");
goto homescreen;
}
}
}
}

如果你有人能帮我,我将不胜感激

  1. 代码中的goto语句使程序变得非常优秀意大利面结构和不是良好。

    因此,考虑其他选项而不是goto,例如无限而一旦用户进入n或移动就会中断的循环函数的代码。

  2. 其次,如果您没有输入任何persons并选择选项1。您仍然将person的属性输出为CCD_ 10至少初始化为零。记住的属性是此时未初始化。访问未初始化的变量将调用未定义的行为因此在执行选项1中的代码之前提供一个检查(类似于if(count > 0(。

  3. 除此之外,请记住std::endl刷新输出缓冲区,而'n'不刷新。因此你可能想用的箱子n

  4. 最后但并非最不重要的是,使用std::vector,而不是使用预定义大小的C样式数组。如果用户有超过100的输入,该怎么办?C++中的解决方案是std::vector,它可以随着存储的自动处理而动态扩展

以下是您的程序的一个可能的解决方案,其中的注释将引导您完成我上面提到的事情。

#include <iostream>
#include <string>
#include <vector>
#include <windows.h>
struct Data
{
std::string name;
int age;
char gender;
std::string comments;
Data(const std::string& n, int a, char g, const std::string& c) // provide a Constructor
:name(n), age(a), gender(g), comments(c)
{}
};
void debugMsg(const std::string& msg)
{
system("cls");
std::cout << "nntt" << msg << "nn";
Sleep(3000);
}
int main()
{
std::vector<Data> person; // use std::vector to store the datas
while (true)  // loop: 1
{
system("cls");
std::cout << "Welcome to the Data Base! nn";
std::cout << "[1] View Personn";
std::cout << "[2] Add Personn";
std::cout << "[3] Edit Personn";
std::cout << "[4] Delete Personn";
std::cout << "[5] Exitn";
std::cout << "Choose Option: ";  
int option;  std::cin >> option; 
switch (option) // use switch to validate the options
{
case 1:
{
while (true)   // loop - 2 -> case 1
{
// if no data available to show -> just break the loop 2 and return to the outer loop(i.e, loop 1) 
if (person.empty()) { debugMsg("No person available to show ....going to main manu...."); break; }
// otherwise: displaying all people
for (std::size_t index = 0; index < person.size(); ++index) 
std::cout << index << ".) " << person[index].name << "n";
std::cout << "nEnter number of person you want: ";  
std::size_t index;  std::cin >> index;
// if the index is not valid -> just break the loop 2 and return to the outer loop(i.e, loop 1) 
if (index < 0  || index >= person.size()) { debugMsg("Sorry, wrong index!... returning to the main menu......");  break; }
system("cls");
std::cout << "Name: " << person[index].name << std::endl;
std::cout << "Age: " << person[index].age << std::endl;
std::cout << "Gender: " << person[index].gender << std::endl;
std::cout << "Comments: " << person[index].comments << std::endl << std::endl;
std::cout << "View another person?(y/n): ";      
char ans;  std::cin >> ans;
if (ans == 'y') { system("cls");    continue; } // just continue looping
else if (ans == 'n') { break; }                 // this will break the loop 2 and return to the outer loop(i.e, loop 1)                 
else { debugMsg("Sorry, wrong option!... returning to the main menu......");  break; }
}
} break;
case 2:
{
while (true)   // loop - 3 -> case 2
{
system("cls");
std::string name, comments; int age; char gender;
std::cout << "Name: ";           std::cin >> name;
std::cout << "Age: ";            std::cin >> age;
std::cout << "Gender(M/F/H): ";  std::cin >> gender;
std::cout << "Comments: ";       std::cin >> comments;
// simply construct the Data in person vector in place
person.emplace_back(name, age, gender, comments);
std::cout << "nnAdd another person?(y/n): ";
char ans;  std::cin >> ans;
if (ans == 'y') { system("cls"); continue; }
else if (ans == 'n') { system("cls"); break; } // same as case 1
else { debugMsg("Sorry, wrong option!... returning to the main menu......"); break; }
}
} break;
case 3: { /*code*/ debugMsg("Sorry, Not implemented!... returning to the main menu......"); } break;
case 4: { /*code*/ debugMsg("Sorry, Not implemented!... returning to the main menu......"); } break;
case 5: return 0; // if its 5, just retun the main
default: break;
}
}
return 0;
}

如上所述,使用"goto"是一种糟糕的风格,因此我建议稍微构建一下程序。下面是我的版本。当然,我没有添加任何检查和控制,作者将能够自己完成这项工作。但主要逻辑应该起作用。当然,最好使用矢量而不是静态数组。

#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
enum options { OPT_VIEW = 1, OPT_ADD = 2, OPT_EDIT = 3, OPT_DELETE = 4, OPT_EXIT = 5 };
struct data
{
string name;
int age;
char gender;
string comments;
};
class App
{
private:
data person[100];
int  count = 0;
public:  
App();
void Run();
int HomeScreen();
void View();
void Add();
};
App::App() : count(0)
{}
void App::Run()
{
int option = HomeScreen();
while(option != OPT_EXIT)
{
switch(option)
{
case OPT_VIEW:
View();
break;
case OPT_ADD:
Add();
break;
}
option = HomeScreen();
}
}
int App::HomeScreen()
{
int option = 0;
cout << "Welcome to the Data Base!" << endl;
cout << endl;
// displaying all people
for(int list = 0; list < count; list++)
{
cout << list << ".) " << person[list].name << endl;
}
cout << endl;
cout << "[1] View Person" << endl;
cout << "[2] Add Person" << endl;
cout << "[3] Edit Person" << endl;
cout << "[4] Delete Person" << endl;
cout << "[5] Exit" << endl;
cout << "Choose Option: ";  cin >> option;
return option;
}
void App::View()
{
char ans = 0;
do
{
int people = 0;
for(int list2 = 0; list2 < count; list2++)
{
cout << list2 << ".) " << person[list2].name << endl;
}
cout << endl;
cout << "Enter number of person you want: ";  cin >> people;
system("cls");
cout << "Name: " << person[people].name << endl;
cout << "Age: " << person[people].age << endl;
cout << "Gender: " << person[people].gender << endl;
cout << "Comments: " << person[people].comments << endl << endl;
cout << "View another person?(y/n): ";      cin >> ans;
}
while(ans == 'y');
system("cls");
}
void App::Add()
{
char ans = 0;
do
{
system("cls");
cout << "Name: ";  cin >> person[count].name;
system("cls");
cout << "Age: ";  cin >> person[count].age;
system("cls");
cout << "Gender(M/F/H): ";  cin >> person[count].gender;
system("cls");
cout << "Comments: ";  cin >> person[count].comments;
count++;
system("cls");
cout << "Add another person?(y/n): ";   cin >> ans;
}
while(ans == 'y');
system("cls");
}
int main()
{
App program;
program.Run();
}

相关内容

  • 没有找到相关文章

最新更新