无法解决问题

时间:2018-11-16 04:48:14

标签: c++ database user-input

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

我尝试将ans更改为 string ,实现一个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;
            }
        }
    }
}

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

2 个答案:

答案 0 :(得分:2)

  1. 您的代码中的goto语句使该程序真正spaghetti 结构 that is not good

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

  2. 第二,如果您没有输入任何persons并选择 选项1}}。您仍将1的属性输出为 person至少初始化为零。记住属性是 目前尚未初始化。访问未初始化的 变量将调用undefined behavior。因此, 在执行选项count中的代码之前,先提供支票(类似if(count > 0)。

  3. 除此之外,请记住 std::endl刷新输出缓冲区,而1不刷新。因此,大多数 您might wanna use just \n的情况。

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

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

std::vector

答案 1 :(得分:1)

如上所述,使用“ 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();
}