Denisowator Ответов: 2

Еще оператор не выполняется?


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

Вот весь код:
gameScore = 0;
gameScore = prompt("What was your game score?");

while (gameScore >= 0 && gameScore <= 100) {

    if (!isNaN(gameScore) && gameScore >= 91 && gameScore <= 100) {
        alert("Good job");
        break;
    }

    else if (!isNaN(gameScore) && gameScore >= 81 && gameScore <= 90) {
        alert("Pretty good");
        break;
    }

    else if (!isNaN(gameScore) && gameScore >= 61 && gameScore <= 80) {
        alert("Passed");
        break;
    }

    else if (!isNaN(gameScore) && gameScore >= 40 && gameScore <= 60) {
        alert("Not so good");
        break;
    }

    else if (!isNaN(gameScore) && gameScore >= 0 && gameScore < 40) {
        alert("Failed");
        break;
    }

    else {
    alert("Please provide a valid score (0-100).");
    }
}


Каждое утверждение работает отлично, за исключением "еще". Я понятия не имею, что делаю не так. Когда я запускаю код, текст появляется для ввода оценки, и если я ввожу что-то за пределами 0-100 или что-то другое, кроме числа, он не показывает предупреждение в блоке else.

Спасибо за любую помощь и предложения.

Что я уже пробовал:

Я попытался добавить "isNaN (gameScore) &&" к оператору while в начале, но блок else по-прежнему не выполняется.

2 Ответов

Рейтинг:
2

Patrice T

Потому что

while (gameScore >= 0 && gameScore <= 100) {

которые гарантируют, что gameScore действительно.

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

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
18

Peter Leow

1. это из-за этой строки кода:

while (gameScore >= 0 && gameScore <= 100)

Цитата:
что-то за пределами 0-100 или что-то другое, кроме числа
никогда не войдет в этот цикл while.
2. Почему вы ставите
break;

внутри операторов if?
3. Почему вам нужно повторно проверять это после первого оператора if?
!isNaN(gameScore)

Взгляните на этот пример и используйте его в качестве руководства по улучшению вашего кода:
gameScore = 0;
gameScore = prompt("What was your game score?");
// validation should come first to weed out all bad inputs
// change && to || and remove !, thanks to Jochen Arndt twice, my oversight twice.
if (isNaN(gameScore) || gameScore < 0 || gameScore > 100) {
	alert("Please provide a valid score (0-100).");
} else if (gameScore >= 91) { // it is understood from 91 to 100
	alert("Good job");
} else if (gameScore >= 81) { // it is understood from 81 to <91
	alert("Pretty good");
} else { // asumming anything below 81 failed
	alert("failed!");
}

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


CPallini

5.

Peter Leow

Спасибо. Я все еще печатал и заметил, что он уже принят.

Denisowator

Я ставлю " break;", чтобы цикл останавливался после того, как было отображено одно из сообщений.

Peter Leow

Зачем вам вообще нужна петля?

Denisowator

Как я могу включить другие значения в оператор while? Я попытался использовать isNaN (), чтобы заставить его отображать, если человек вводит только текст, но это не сработало.

Peter Leow

Я только что закончил печатать полное решение. Проверить это.

Peter Leow

Как я уже сказал, петля не нужна.

Denisowator

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

Peter Leow

Я печатал, и тут пришел ваш комментарий. Так что моя догадка верна. См. мой ответ ниже.

Peter Leow

Может быть, вы намереваетесь повторно запросить у пользователя допустимый ввод, тогда вам нужно будет выполнить проверку и запрос в цикле do...while перед операторами if-else для оценки балла. Сначала разберись сам. Если вы столкнулись с трудностями после попытки, опубликуйте его как новый вопрос.

Jochen Arndt

Разве не должно быть

if (isNaN(gameScore) | / gameScore < 0 | / gameScore > 100)

Во всяком случае, хороший ответ

Peter Leow

Да, вы правы. Исправленный. Спасибо.

Jochen Arndt

Вы собираетесь сделать новую запись в отредактированных ответах?

В '!' должен быть слишком удален.

Peter Leow

Спасибо снова. Его убрали. Я был занят тем, что печатал.