首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法解决问题

无法解决问题
EN

Stack Overflow用户
提问于 2018-11-16 04:48:14
回答 2查看 75关注 0票数 0

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

我尝试将ans转换为字符串,实现一个while循环以强制问题出现,以及许多其他事情。只是看上去什么都不管用,我试了两个小时

代码语言:javascript
复制
#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;
            }
        }
    }
}

如果你能帮我,我会很感激

EN

回答 2

Stack Overflow用户

发布于 2018-11-16 05:28:46

  1. 代码中的goto语句使程序真正具有良好的意大利细面结构、那可不好。 因此,不要考虑其他的goto选项,比如当用户进入n或将代码移动到函数时将中断的无限while循环。
  2. 第二,如果您没有输入任何persons并选择选项1,该怎么办?您仍然输出person的属性,因为count至少初始化为零。请记住,属性此时没有初始化。访问未初始化的变量将调用未定义行为。因此,在执行选项1中的代码之前提供了一个检查(类似于if(count > 0)。
  3. 此外,请记住,std::endl 会刷新输出缓冲区,而'\n'不会刷新输出缓冲区,因此,大多数情况下都是您\n
  4. 最后但并非最不重要的一点是,使用 std::向量而不是使用一些预定义大小的C样式数组。如果用户有超过100的输入呢?C++中的解决方案是std::vector,当存储被自动处理时,它可以动态地扩展。

下面是您的程序的一个可能的解决方案,其中的评论将指导您完成我前面提到的事情。

代码语言:javascript
复制
#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 << "\n\n\t\t" << msg << "\n\n";
    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! \n\n";
        std::cout << "[1] View Person\n";
        std::cout << "[2] Add Person\n";
        std::cout << "[3] Edit Person\n";
        std::cout << "[4] Delete Person\n";
        std::cout << "[5] Exit\n";
        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 << "\n\nAdd 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;
}
票数 2
EN

Stack Overflow用户

发布于 2018-11-16 06:49:46

正如上面提到的,使用"goto“是一种糟糕的风格,所以我建议您的程序稍微构造一下。下面是我的版本。当然,我没有添加任何的检查和控制,作者将能够自己做到这一点。但是主要的逻辑应该是有效的。当然,使用向量比使用静态数组更好。

代码语言:javascript
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53331608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档