Функциональный цикл с пользовательским вводом c++

Итак, я получил задание создать программу, которая позволяет пользователю выбирать три любимых направления по порядку. Это повторяется до тех пор, пока пользователь не решит остановиться. Как только пользователь решает прекратить работу, программа затем отображает общее количество голосов, полученных для каждого пункта назначения, в соответствии с предпочтениями пользователей. У одного пользователя будет три предпочтения, и если программа повторяется четыре раза, это означает, что записываются предпочтения четырех пользователей. Таким образом, в этом случае записано всего 12 предпочтений.

Я попытался ограничить ввод для работы цикла, но, похоже, он будет работать только с решением, которое не требуется в начале программы, которое я хочу полностью удалить.

Кроме того, я попытался ограничить вывод для каждого из решений, но он будет выполняться только один раз, а затем перейду к следующему выбору. Есть ли способ получить постоянное приглашение на ввод, которое будет продолжаться только после действительного ввода.

Наконец, есть ли способ улучшить код, используя операторы switch / break вместо if / else?

Вот мой код:

cout << "Do you want to go forth with this program?\nType y to confirm. The 
program will exit if anything else is entered: ";
cin >> Decision;    


    while (Decision=="y") 
    {

        cout << "\n\nNow please enter the code for which your destination corresponds to: " << endl;    //first decision
        cin >> Choice1;   

            if (Choice1 == 1) 
            {
                LasVegas1++;        
            }

            else if (Choice1 == 2) 
            {
                Tokyo1++;
            }

            if (cin.fail())
            {     
            cout << "Please enter a valid choice" << endl;
            continue;
            }

        cout << " \nNow please enter the second code: " << endl;    //second decision
        cin >> Choice2;

            if (Choice2 == 1) 
            {
                LasVegas2++;        
            }

            else if (Choice2 == 2) 
            {
                Tokyo2++;
            }

            else 
            {
                cout << "\nError! Please enter a valid code as shown above!\n";
                cout << "\nNow please enter the second code: ";
                cin >> Choice2;
            }




        cout << " \nNow please enter the third code: " << endl;  //third decsion
        cin >> Choice3;

            if (Choice3 == 1) 
            {
                LasVegas3++;        
            }

            else 
            {
                cout << "\nError! Please enter a valid code as shown above!\n";
                cout << "\nNow please enter the third code: ";
                cin >> Choice3;
            }


        cout << " \nDo you wish to select three more destinations? (Y/N): " << endl;
        cin >> Decision;

    }

Вам не нужно перечислять все одиннадцать вариантов, чтобы проиллюстрировать проблему.

molbdnilo 10.08.2018 15:21

И я почти уверен, что вы недавно узнали о векторах или массивах. И, возможно, цикл "do-while".

molbdnilo 10.08.2018 15:22

К сожалению, я еще не начал с векторов или массивов в этом отношении. Есть ли способ обхода этого вопроса?

Dat boi 10.08.2018 15:26

Оператор switch не сделает его более читаемым, но он потребует меньше ввода, на мой взгляд, вы должны определить некоторую константу для мест #define LasVegas 1, тогда вы можете сделать if(choice == LasVegas), что, на мой взгляд, очень улучшит код

Mitch 10.08.2018 15:33

Почему вы хотите иметь отдельные переменные для rome1, rome2 и rome3?

GBlodgett 10.08.2018 15:35

Поскольку Рим можно выбирать трижды в одну петлю? Я сделал это для всех мест

Dat boi 10.08.2018 15:38

Но почему вы хотите, чтобы они были разделены? Я бы подумал, что вам просто нужно иметь один rome, чтобы он показывал, что он был выбран три раза

GBlodgett 10.08.2018 15:38

По сути, мой вывод должен показывать, какое место было выбрано, сколько раз и в каком выборе в таблице. Например, если сначала был выбран Рим, он будет напечатан при выборе 1, Париж - при выборе 2 и т. д.

Dat boi 10.08.2018 15:42
1
8
129
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я бы поместил все переменные вашего города в array, а затем преобразовал ваши три набора кода в for loop. Что-то типа:

for(int i = 0; i < 3; i++) {
    if(Choice1 == 0) {
       rome[i]++;
    }
    //etc

Таким образом, вам не нужно будет повторять один и тот же код три раза. Также вам понадобится только одна переменная Choice. (Вы можете просто сбрасывать его на каждой итерации цикла)

Кроме того, вы можете реализовать оператор switch, чтобы немного очистить код:

switch(Choice1) {  
        case 1:
            LasVegas1++;        
            break;

        case 2:
            Tokyo1++;
            break;

        case 3:
            London1++;
            break;

        case 4:
            Paris1++;
            break;

        case 5:
            Dubai1++;
            break;

        case 6:
            Mumbai1++;
            break;

       case 7:
            NewYork1++;
            break;

        case 8: 
         Sydney1++;
         break;

        case 9:
            Auckland1++;
            break;

        case 10:
            Rome1++;
         break;

        case 11:
            Other1++;
           break;
      }

Хорошо, похоже, ваш код работает, но у меня есть еще две трудности. Я должен отформатировать свой вывод, который будет выглядеть примерно так: Rome Choice1 [x] Choice2 [x] Choice3 [x]; Paris Choice1 [x] и т. д. В формате таблицы, где x - сколько раз он был выбран, но ваш код завершается после одного цикла из трех вводов. Он должен повторяться столько раз, сколько захочет пользователь. Можно ли также добавить постоянное сообщение об ошибке, которое будет продолжаться только при правильном вводе?

Dat boi 10.08.2018 16:27

@Datboi То, что я опубликовал, не должно быть полным кодом. У вас все еще должен быть цикл while, который продолжается, пока пользователь вводит y.

GBlodgett 10.08.2018 16:39

Да, вы могли бы улучшить с помощью оператора switch. Также вам следует изучить то, что называется циклом do while.

Ответ принят как подходящий

Его можно значительно упростить, используя «Выключатель» и «Сломать».

Как и код, который я написал. Взгляни :

ввод символов;

int выбор;

void Permission () {

cout << "Do you want to go forth with this program ?                     (y to confirm)" << flush;
cin >> input;
cout << endl;

}

недействительным Decision1 () {

if (input == 'y') {

    cout << "Now please enter the code for which your destination corresponds to : " << flush;
    cin >> choice;

    switch (choice) {
    case 1: 
        cout << "LasVegas " << endl;
        break;
    case 2:
        cout << "Tokyo " << endl;
        break;
    case 3:
        cout << "London " << endl;
        break;
    case 4:
        cout << "Paris " << endl;
        break;
    case 5:
        cout << "Dubai " << endl;
        break;
    case 6:
        cout << "Mumbai " << endl;
        break;
    case 7:
        cout << "New York " << endl;
        break;
    case 8:
        cout << "Sydney " << endl;
        break;
    case 9:
        cout << "Auckland " << endl;
        break;
    case 10:
        cout << "Rome " << endl;
        break;
    case 11:
        cout << "Other " << endl;
        break;
    default:
        cout << "Invalid option. Enter Again : " << flush;
        cin >> choice;
    }
    cout << endl;
}

}

void Decision2 () {

cout << "Now please enter the second code: " << flush;
cin >> choice;

switch (choice) {

case 1:
    cout << "LasVegas " << endl;
    break;
case 2:
    cout << "Tokyo " << endl;
    break;
case 3:
    cout << "London " << endl;
    break;
case 4:
    cout << "Paris " << endl;
    break;
case 5:
    cout << "Dubai " << endl;
    break;
case 6:
    cout << "Mumbai " << endl;
    break;
case 7:
    cout << "New York " << endl;
    break;
case 8:
    cout << "Sydney " << endl;
    break;
case 9:
    cout << "Auckland " << endl;
    break;
case 10:
    cout << "Rome " << endl;
    break;
case 11:
    cout << "Other " << endl;
default:
    cout << "Invalid option. Enter Again : " << flush;
    cin >> choice;
}
cout << endl;

}

недействительным Decision3 () {

cout << "Now please enter the third code: " << flush;
cin >> choice;

switch (choice) {
case 1:
    cout << "LasVegas " << endl;
    break;
case 2:
    cout << "Tokyo " << endl;
    break;
case 3:
    cout << "London " << endl;
    break;
case 4:
    cout << "Paris " << endl;
    break;
case 5:
    cout << "Dubai " << endl;
    break;
case 6:
    cout << "Mumbai " << endl;
    break;
case 7:
    cout << "New York " << endl;
case 8:
    cout << "Sydney " << endl;
    break;
case 9:
    cout << "Auckland " << endl;
    break;
case 10:
    cout << "Rome " << endl;
    break;
case 11:
    cout << "Other " << endl;
    break;
default:
    cout << "Invalid option. Enter Again : " << flush;
    cin >> choice;
}
cout << endl;

}

int main () {

Permission();
Decision1();
Decision2();
Decision3();

system("PAUSE");
return 0;

}

Я не знаю, как получить цикл по умолчанию, когда пользователь вводит неправильную опцию. Однажды я смог дать "cin". Обновите эту проблему, если знаете, как это сделать.

Это уменьшило повторный ввод пользователя, и не требовалось получать конкретные переменные страны, такие как струнный рим ...... и так далее.

Sanyam 10.08.2018 18:29

И, пожалуйста, дайте мне знать, сможете ли вы получить цикл для ввода пользователя по умолчанию ... поскольку я смог получить cin только один раз

Sanyam 10.08.2018 18:30

Я нашел исправление для петли дефолта. На самом деле это не цикл, но он будет снова и снова спрашивать пользователя о правильном вводе, если ввод не из списка 1-11. Вы можете добавить оператор перейти к, чтобы вернуть значение по умолчанию в начальную точку функции. Сначала вам нужно будет создать этикетку. Пометьте точку, в которую будет переходить goto. Например: lable: "код в этой части" goto label ;.

Sanyam 12.08.2018 09:01

Вот ссылка на код: coliru.stacked-crooked.com/a/93b683af2dc64534 Надеюсь, это поможет .......

Sanyam 12.08.2018 09:13

Другие вопросы по теме