Программа на C ++ не войдет в цикл - PullRequest
4 голосов
/ 24 июня 2011

Хорошо, вот часть моего кода, которая вызывает у меня проблему.То, что я хочу, это сделать оценку, решить, является ли она действительной оценкой, и затем продолжать спрашивать действительное число, если это не так.Тем не менее, он даже не входит в цикл, так что ... какой-нибудь совет?Я немного программировал, но я все еще довольно нов, поэтому дополнительные объяснения - это здорово!Также я впервые использую логические значения в цикле for.

for (bool b_valid=false; b_valid=false ; )
{
cin >> n_grade;
b_valid = true;
    if (n_grade>100 || n_grade<0)
        {
            cout << "Invalid grade: Re-enter a number between 0-100 : " << endl;
            cin >> n_grade;
            b_valid = false;
        }
}

Ответы [ 7 ]

15 голосов
/ 24 июня 2011

Ваше состояние - назначение: b_valid=false.Значение будет равно false, и цикл никогда не будет выполнен.Вы имели в виду

for(bool b_valid = false; b_valid == false; )
                                 ^^^^ 

Существует стиль кодирования, который предписывает, чтобы константа сравнения была первым аргументом, например if(false == b_valid).В этом случае, если вы случайно наберете =, вы получите ошибку компилятора.В любом случае многие компиляторы выдают предупреждение в тех случаях, когда вы написали присваивание, в котором было использовано логическое выражение.Либо ваш не был таким изощренным, или вы просто проигнорировали предупреждение.

11 голосов
/ 24 июня 2011

Я с уважением не согласен с другими (крайне печально) ответами.

Не сравнивайте логическое значение с true или false.

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

Просто проверьте само значение.То есть напишите ! b_valid.

Кроме того, использование здесь цикла for явно вводит в заблуждение.Используйте while вместо:

while (! b_valid) {
    …
}
8 голосов
/ 24 июня 2011

Вы использовали присваивание в условии цикла ('='), оно должно быть '==':

for (bool b_valid=false; false==b_valid; )
3 голосов
/ 24 июня 2011
for( a; b; c ) { body; }

- это то же самое (за исключением области действия), что и

a;
while (b) {
   body;
   c;
}

Давайте сделаем это для вашего кода:

bool b_valid=false;
while (b_valid = false) { // uh-oh

Нам не нужно идти дальше.Это задание, а не сравнение.Он устанавливает b_valid в false и затем проверяет, верно ли это.Поскольку этого никогда не происходит, цикл никогда не запускается.

Но то, что вы действительно хотели, это цикл do / while:

bool b_valid;
do {
    cin >> n_grade;
    if ( n_grade>100 || n_grade<0 ) {
        cout << "Invalid grade: Re-enter a number between 0-100 : " << endl;
        // let the next pass through the loop re-read n_grade
        b_valid = false;
    }
    else {
        b_valid = true;
    }
} while (!b_valid);

Цикл do-while всегда выполняетсяхотя бы один раз.

2 голосов
/ 24 июня 2011

Оператор сравнения на равенство ==. Сейчас ваше состояние b_valid=false, которое просто возвращает false.

1 голос
/ 24 июня 2011

Вы можете просто перестроить код в цикл while.Например:

bool b_valid = false;
while( !b_valid )
{
    cin >> n_grade;
    b_valid = true;
    if (n_grade>100 || n_grade<0)
    {
        cout << "Invalid grade: Re-enter a number between 0-100 : " << endl;
        cin >> n_grade;
        b_valid = false;
    }
}
1 голос
/ 24 июня 2011

= является оператором присваивания
== оператор сравнения

Итак, ограничение цикла for ничего не проверяет ...

В качестве альтернативы используйте цикл while:

bool b_valid = false;
cin >> n_grade;
while(!b_valid){
   if(n_grade>100 || n_grade<0) {
      b_valid = true;
   } else {
      cout << "Invalid grade: Re-enter a number between 0-100 : " << endl;
      cin >> n_grade;   
   }
}
...