Нужна помощь, чтобы остановить цикл - PullRequest
0 голосов
/ 09 октября 2019
#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;

int main()

{
    int age = 0, age0_18 = 0, age19_30 = 0, age31_40 = 0, age41_60 = 0, age61_ = 0, numberofattendees = 0, sum = 0, snacks = 0, snack1_2 = 0, snack2_3 = 0, snack3_4 = 0, snack4_5 = 0,snack5_6 = 0, snack7_ = 0,numberofsnacks = 0;
    int total;
    int Total;


    cout <<"    " "==========================" << endl;
    cout <<"      " "THEATER STATS PROGRAM" << endl;
    cout <<"    " "==========================" << endl;
    cout << endl;
    cout << "Movie theater snacks available for purchase" << endl;
    cout << "==========================================" << endl;
    cout << "1 - Soft Drink (such as Coca Cola, ICCEE, Mineral Water etc...)" << endl;
    cout << "2 - Popcorn" << endl;
    cout << "3 - Nachos" << endl;
    cout << "4 - Soft drink & Popcorn" << endl;
    cout << "5 - Soft drink & Nachos" << endl;
    cout << "6 - Organic and Gluten-free snacks" << endl;
    cout << "7 - None" << endl;
    cout << "==========================================" << endl;
    cout << endl;

    while (age != -1)

            {
                numberofattendees++;
                numberofsnacks++;

                if (age >= 0)
                {
                    sum = sum + age;
                }
                if (age >= 0 && age <= 18)
                {
                    age0_18++;
                }
                if (age >= 19 && age <= 30)
                {
                    age19_30++;
                }
                if (age >= 31 && age <= 40)
                {
                    age31_40++;
                }
                if (age >= 41 && age <= 60)
                {
                    age41_60++;
                }
                if (age >= 61)
                {
                    age61_++;
                }
                if (snacks >= 0)
                {
                    sum = sum + Total;
                }
                if (snacks >= 1 && snacks <= 2)
                {
                    snack1_2++;
                }
                if (snacks >= 2 && snacks <= 3)
                {
                    snack2_3++;
                }
                if (snacks >= 3 && snacks <= 4)
                {
                    snack3_4++;
                }
                if (snacks >= 4 && snacks <=5)
                {
                    snack4_5++;
                }
                if (snacks >= 6 && snacks <=7)
                {
                    snack5_6++;
                }
                if (snacks >= 7)
                {
                        snack7_++;
                }
                cout << "Enter age of attendee (-1 to quit): ";
                cin >> age;
                cout << "Movie theater snack purchased (Select 1-7): ";
                cin >> snacks;
                while (snacks < 1 || snacks > 7)
                {
                    cout << "Invalid selection, please choose from 1 - 7" << endl;
                }
                cout << "---------------------------------------------" << endl;
                {}

            }
                cout << "Movie theater snack purchased (Select 1-7): ";
                cin >> snacks;
                cout << "---------------------------------------------" << endl;

                cout << endl;
                cout <<"==========================" << endl;
                cout <<"  " "THEATER STATS PROGRAM" << endl;
                cout <<"==========================" << endl;
                cout << endl;
                cout << "age 0 to 18: " << age0_18 << endl;
                cout << endl;
                cout << "age 19 to 30: " << age19_30 << endl;
                cout << endl;
                cout << "Age 31 to 40: " << age31_40 << endl;
                cout << endl;
                cout << "age 41 to 60: " << age41_60 <<endl;
                cout << endl;
                cout << "Over 60: " << age61_ << endl;
                cout << endl;

                total = sum / numberofattendees;

                cout << "The average age was " << total << endl;
                cout << endl;
                cout << "The youngest person in attendance was " << endl;
                cout << endl;
                cout << "The oldest person in attendance was " << endl;
                cout << endl;


            return 0;       
}

Программа спрашивает пользователя, сколько ему лет в кинотеатре, а также какую закуску они решают получить.

Что я пытаюсь сделать, так это показать программесообщение об ошибке, когда пользователь вводит номер, который не находится между 1-7 для закусочной части. У меня есть это, чтобы показать сообщение, но я не могу заставить его остановиться. (Это означает, что оно будет показывать сообщение, когда вводится что-то отличное от 1-7, но оно бесконечно.)

Как / что я делаю неправильно или что я включил, что неправильно?

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

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Я воздерживаюсь от ответа Свиниша, чтобы продемонстрировать, что это отличное место для использования функции:

bool getSnacks(int & snacks)
{
    cout << "Movie theater snack purchased (Select 1-7): ";
    cin >> snacks;
    if (snacks < 1 || snacks > 7)
    {
        cout << "Invalid selection, please choose from 1 - 7" << endl;
        return false;
    }
    return true;
}

Цикл while теперь становится

while (!getSnacks(snacks))
{
    // does absolutely nothing!
}

или более компактным, но странно выглядящий

while (!getSnacks(snacks));

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

bool getBoundedInt(int & val,
                   int min,
                   int max,
                   const std::string & prompt)
{
    cout << " Please select " << prompt << " (Select "<< min << "-" << max << "): ";
    cin >> val;
    if (val < min || val > max)
    {
        cout << "Invalid selection, please choose from << min << " - " << max << endl;
        return false;
    }
    return true;
}

И вы можете использовать эту функцию для получения всех видов информации, например

while (!getBoundedInt(snacks, 1, 7, "snack"));
while (!getBoundedInt(movie, 1, 9, "movie"));
while (!getBoundedInt(seat, 1, 42, "seat"));

Следующаяшаг будет заключаться в том, чтобы переместить цикл в функцию, чтобы функция не возвращалась, пока пользователь не предоставит приемлемое значение

int getBoundedInt(int min,
                   int max,
                   const std::string & prompt)
{

    cout << " Please select " << prompt << " (Select "<< min << "-" << max << "): ";
    int val;
    while (true)
    {
        cin >> val;
        if (val < min || val > max)
        {
            cout << "Invalid selection, please choose from << min << " - " << max << endl;
        }
        else
        {
            return val;
        }
    }
}

Теперь использование действительно простое:

snack = getBoundedInt(1, 7, "snack");
movie = getBoundedInt(1, 9, "movie");
seat = getBoundedInt(1, 42, "seat");

Но что, если пользователь вводит что-то совершенно недействительное, например, «резиновые бамперы Babybuggy»? Вам также понадобится некоторая защита около cin >> val;, чтобы входные данные могли быть преобразованы в целое число.

Ваше приключение по проверке ввода (это поисковый запрос, который вы можете исследовать для получения дополнительной информации и идей) только началось.

1 голос
/ 09 октября 2019
cout << "Movie theater snack purchased (Select 1-7): ";
cin >> snacks;
while (snacks < 1 || snacks > 7)
{
    cout << "Invalid selection, please choose from 1 - 7" << endl;
}

Проблема в том, что цикл while никогда не изменяет значение snacks. Таким образом, условие для входа в цикл всегда выполняется, что делает его бесконечным. Вместо этого он должен быть одноразовым, если проверяется, и вопрос о том, какая закуска должна быть в цикле do / while, чтобы вы могли снова задать вопрос и получить новые значения для snack. Я выбираю do / while, потому что мне нужно хотя бы один раз спросить.

do {
    cout << "Movie theater snack purchased (Select 1-7): ";
    cin >> snacks;
    if (snacks < 1 || snacks > 7)
        cout << "Invalid selection, please choose from 1 - 7" << endl;
} while (snacks < 1 || snacks > 7);

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

Что касается возраста, быстрый взгляд на ваш код показывает, что вы не проверяете возраст, пока не начнете цикл while снова. Поэтому имеет смысл попросить вас перекусить, тело цикла просто продолжает выполняться. Одно из изменений, которое вы можете сделать, - установить внешний цикл на бесконечность и выполнить проверку возраста сразу после того, как вы его приобретете.

while(1) {
    // ...
    cout << "Enter age of attendee (-1 to quit): ";
    cin >> age;
    if (age == -1)
        break;  // interrupts your loop and kicks you out immediately
    // ...
}

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

...