Невозможно решить проблему - PullRequest
0 голосов
/ 16 ноября 2018

В разделе добавления пользователя в приведенном ниже коде я не могу набрать символы для вопроса "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;
            }
        }
    }
}

Если бы вы могли мне помочь, я был бы благодарен

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Как уже упоминалось выше, использование "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();
}
0 голосов
/ 16 ноября 2018
  1. Операторы goto в вашем коде делают программу действительно хорошей Спагетти структура и , которая не хороший .

    Поэтому вместо goto подумайте о других параметрах, таких как бесконечный цикл while, который прервется, когда пользователь введет n или переместится код функции.

  2. Во-вторых, что делать, если вы не ввели persons и выбираете опция 1. Вы по-прежнему выводите атрибуты person как count инициализируется как минимум нулем. Помните, что атрибуты не инициализирован на данный момент. Доступ к неинициализированному переменные будут вызывать undefined поведение . Следовательно, предоставьте проверку (что-то вроде if(count > 0)) перед выполнением кода в опции 1.

  3. В дополнение к этому, помните, что std::endl сбрасывает буфер вывода, а '\n' - нет. Поэтому большинство случаи, которые вы могли бы использовать только \n.

  4. Последнее, но не менее важное: используйте std::vector вместо использования массивов в стиле C с некоторым заранее определенным размером. Что делать, если у пользователя более 10 * 10 входов? Решение на 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 << "\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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...