Почему l oop не ломается? - PullRequest
1 голос
/ 06 апреля 2020

Я написал это простое меню, которое работает, пока я не решу выйти. Каждая функция выбора просто отображает сообщение о том, что она была выбрана. Каждая функция помещается в оператор switch, который через некоторое время (true) l oop. Предполагается, что он сломается после запуска функции, но я получаю бесконечное значение l oop. Я попробовал это с другими, если заявления, и это работало должным образом. Я хочу использовать переключатель, потому что он выглядит чистым и простым в управлении. Подскажите пожалуйста ошибку logi c и я ее исправлю.

#include <iostream>
#include <limits>


bool validation(int testChoice, int minC, int maxC, std::string message)
{
    bool invalid = false;

    if ((std::cin.fail())|| (testChoice >maxC) || (testChoice < minC))
    {
        std::cout << message <<std::endl;
        invalid = true;
    std::cin.clear();
    std::cin.ignore(INT_MAX, '\n');
    }
    return invalid;
}

int menu()
{
   bool flag = true;
   int testChoice;
   int minC = 1, maxC = 8;
   do
   {
        std::cout <<"Which test to run?: \n";
        std::cout <<"1.  Test1 \n";
        std::cout <<"2.  Test2 \n";
        std::cout <<"3.  Test3 \n";
        std::cout <<"4.  Test4 \n";
        std::cout <<"5.  Test5 \n";
        std::cout <<"6.  Test6 \n";
        std::cout <<"7.  test7 \n";
        std::cout <<"8.  Quit \n";
        std::cout <<"Pick one: ";
        std::string message = "1-8 only: ";
        std::cin >> testChoice;
       flag = validation(testChoice, minC, maxC, message);
   }
   while(flag);
   return testChoice;
}
void test1()
{
    std::cout <<"Test 1 was chosen\n";
}
void test2()
{
    std::cout <<"Test 2 was chosen\n";
}
void test3()
{
    std::cout <<"Test 3 was chosen\n";
}
void test4()
{
    std::cout <<"Test 4 was chosen\n";
}
void test5()
{
    std::cout <<"Test 5 was chosen\n";
}
void test6()
{
    std::cout <<"Test 6 was chosen\n";
}
void test7()
{
    std::cout <<"Test 7 was chosen\n";
}
int toRun(int testChoice) //Pass in the return value from menu
{
   while (true)
   {

    switch(testChoice)
    {
        case 1:
        test1();
        break;

        case 2:
        test2();
        break;

        case 3:
        test3();
        break;

        case 4:
        test4();
        break;

        case 5:
        test5();
        break;

        case 6:
        test6();
        break;

        case 7:
        test7();
        break;
        case 8:
        return 0;

    }
   }
}
int main ()
{
    int choice = menu();
    toRun(choice);
    return 0;
}





Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

Обратите внимание, что break внутри switch сломает только коммутатор, но не весь while l oop!

Оператор switch прерывается после выполнения тестового примера, но l oop продолжается, потому что это условие true и в другом месте нет оператора break или return, кроме return in case 8. Это единственный случай, когда ваш код будет работать правильно.

Я пробовал его с другими операторами if, и он работал правильно.

Это потому, что в этом break Сценарий сломает ваш while l oop вместо взлома case, как в случае оператора switch.

Решение:

Удалите это время -l oop в целом, и держите в нем только содержимое. Вам не нужно все oop там, внутри меню происходит реальное зацикливание (что делает пока l oop). Кроме того, добавьте соответствующие операторы возврата для каждого случая. В настоящее время только case 8 имеет оператор возврата. Более того, я не вижу, чтобы вы использовали возвращаемое значение toRun. Вы также можете просто сделать это void и вообще избегать этих операторов возврата.

2 голосов
/ 06 апреля 2020

Вы не запрашиваете новый ввод внутри вашего while (true), поэтому он никогда не попадет в оператор return, если он изначально не получил 8. Чтобы это исправить, просто обновите переменную testChoice внутри l oop. Возможное решение:

int toRun() // No parameter needed now
{
   while (true)
   {
       int testChoice = menu();
       switch(testChoice)
       {
           …

Если вы хотите, чтобы он запускался только один раз, то полностью удалите while l oop.

...