Хотя цикл не зацикливается - PullRequest
1 голос
/ 08 октября 2011

Здесь я настраиваю цикл while, в котором я вводю номер выбора 1 или 2. Если я выбираю 1 или 2, он выбирает 1 или 2 независимо от того, что я выберу;если я выберу число ниже 1 или выше 2, оно переходит к оператору else, который просит пользователя ввести снова.Но если пользователь вводит, проблема заключается в том, что он не вернется к началу, если выберет правильное число 1 или 2;он просто завершит цикл и не перейдет к правильному предложению if.Почему это?Я чувствую, что напал на него правильно.

int menus (int selection)
{
    while ( selection > 2 ||  selection < 1)
    {
        if (selection == 1)
        {
            cout << " 1 " << endl;
        }
        if (selection == 2)
        {
        cout << " 2 " << endl;
        }
        else
            cout << "You didnt choose 2 or 3. Choose again";
        cin >> selection;
    }
    return 0;
}

Ответы [ 8 ]

3 голосов
/ 08 октября 2011

Ваши условия цикла искажены.

Вы проходите цикл, только если выбрано 3, 4, 5, ... (из-за selection > 2) или если selection равно 0, -1, -2, ... (из-за selection < 1).Таким образом, вы никогда не попадете ни в if;вы идете на else.Затем вы безоговорочно вводите новый выбор перед повторением цикла.Если вы сейчас введете правильное значение, цикл завершится.Вы также можете заметить, что ваше сообщение не соответствует тому, что вы хотите, чтобы пользователь предоставил.

Ваш код при правильном отступе выглядит примерно так:

int menus (int selection)
{
    while (selection > 2 || selection < 1)
    {
        if (selection == 1)
        {
            cout << " 1 " << endl;
        }
        else if (selection == 2)
        {
            cout << " 2 " << endl;
        }
        else
            cout << "You didn't choose 1 or 2. Choose again: ";
        cin >> selection;
    }
    return 0;
}

Если вы действительноесли пользователь выберет 1 или 2 и вернет свой выбор, вам нужно что-то более похожее на:

int menus (int selection)
{
    while (selection > 2 || selection < 1)
    {
        cout << "You didn't choose 1 or 2. Choose again: ";
        cin >> selection;
    }
    if (selection == 1)
        cout << " 1 " << endl;
    else if (selection == 2)
        cout << " 2 " << endl;
    return selection;
}

По-прежнему существуют проблемы типа «что происходит в EOF?»с этим надо иметь дело.И печать может быть упрощена, конечно:

int menus (int selection)
{
    while (selection > 2 || selection < 1)
    {
        cout << "You didn't choose 1 or 2. Choose again: ";
        cin >> selection;
    }
    cout << " " << selection << " " << endl;
    return selection;
}
2 голосов
/ 08 октября 2011

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

Следовательно, измените код на:

int menus (int selection)
{
  while (true)
 {
  if (selection == 1 || selection == 2)
  {
     cout << selection << endl;
     break;
  }
  else
  {
     cout << "You didnt choose 1 or 2. Choose again";
     cin >> selection;
  }
 }

 return 0;
}
2 голосов
/ 08 октября 2011

использование

do{

}while( selection > 2 ||  selection < 1);

вместо while.

2 голосов
/ 08 октября 2011

Ваш цикл while исключает значения, которые вы хотите проверить внутри цикла!

while ( selection > 2 ||  selection < 1)
{
if (selection == 1)
{
    // Impossible!! selection isn't > 2 or < 1.
}

Вы можете сделать это вместо:

while (1)
{
    switch (selection) {
        case 1:
        case 2:
            cout << " " << selection << " " << endl;
            return 0;
        default:
            cout << "You didnt choose 1 or 2. Choose again";
            cin >> selection;
    }
}

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

2 голосов
/ 08 октября 2011

Внимательно посмотрите на ваше условие while: оно будет зацикливаться только в том случае, если значение selection больше двух или меньше 1. Затем вы проверяете, выбрано ли значение 1 или 2 - то, что вы только что исключили. Также в цикле нет команды ввода.

1 голос
/ 08 октября 2011

Если они выбирают действительное число, это число больше не соответствует условным требованиям вашего цикла.Вам будет проще зацикливание на буле, которое вы можете установить, если пользователь слишком часто терпит неудачу, иначе вы можете использовать do{ /* get the input, count it or ask them to fix it */ }while(selection == 1 || selection == 2);, который прекратит зацикливание, когда число станет недействительным

1 голос
/ 08 октября 2011

Звоните int menus() внутри, как это:

else{
cout << "You didnt choose 2 or 3. Choose again";
cin >> selection;
menus(selection);
}
0 голосов
/ 08 октября 2011

Если вы введете 1 или 2, он даже не войдет в цикл, поскольку ни 1, ни 2 не больше 2 или меньше 1, они равны.

Это должно исправить это:

while ( selection >= 2 ||  selection <= 1) //equals while(true)

Обратите внимание, что вы должны также использовать оператор else if на втором if, иначе он не будет работать правильно.

else if (selection == 2)
{
    cout << " 2 " << endl;
    break; // this leaves the loop
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...