#c #loops
Вопрос:
Эта программа запрашивает у пользователя оценки викторины и сохраняет их в массиве. Пользователь может ввести максимум 10 оценок, но может ввести и меньше. Программа должна проверить ошибку: если пользователь вводит недопустимую оценку, программа должна выполнять цикл до тех пор, пока пользователь правильно не введет допустимую оценку
#include lt;stdio.hgt; #define N 10 /* number of students in class */ int main() { int quiz[N], /* array of quiz grades */ grade, /* used to read in one grade */ last, /* index of last element used */ i, /* loop variable */ ib /* input buffer */; char c; last = -1; printf("Enter the quiz grade: "); while (ib=scanf("%d",amp;grade) amp;amp; lastlt;N-1) { if(ib == 0 ){ printf("Please enter a valid quiz grade: "); while((c=getchar())!='n' amp;amp; c!=EOF); } else if(grade gt;= 0 amp;amp; grade lt;= 10) { last ; quiz[last] = grade; } else{ printf("Enter a quiz grade between 0 and 10"); } } }
Этот код не останавливается на количестве введенных оценок, а скорее заполняет массив последней оценкой до тех пор, пока ее размер не станет N.
Кроме того, когда пользователь вводит нецифровый ввод, программа останавливается, когда она должна предложить пользователю ввести допустимую оценку
Комментарии:
1. «не работает» никогда не является хорошим описанием проблемы. Пожалуйста, укажите точные данные, ожидаемый результат и фактический результат.
2. Если «не работает» означает «не компилируется», это довольно нормально, вы не объявляете переменную
sum
, и финал}
отсутствует3.
getchar
неосознанно возвращаетint
не achar
.c
должно бытьint
, иначе это не выдержитEOF
.4. Я только что отредактировал свой вопрос. Надеюсь, это более понятно
5. Не пытайтесь проверять вводимые пользователем данные с
scanf
помощью . Это не может быть сделано должным образом,scanf
не создано для этого. Если вы введете, скажемabc
,scanf
вернет 0 в вашем случае, потому что он не смог отсканировать число. ТогдаABC
он все равно будет находиться во входном буфере.
Ответ №1:
По крайней мере, одна ошибка здесь:
while (ib=scanf("%d",amp;grade) amp;amp; lastlt;N-1)
Предположим, что scanf
возвращает ноль (т. е. ib
становится нулем), то вышесказанное совпадает с:
while (0 amp;amp; lastlt;N-1)
что то же самое, что
while (0)
это означает, что ваш цикл останавливается, когда вводится что-то, не являющееся числом.
Также обратите внимание, что из-за вышесказанного, ib
не может быть нуля при выполнении:
if(ib == 0 ){ // So this code can't be reached printf("Please enter a valid quiz grade: "); while((c=getchar())!='n' amp;amp; c!=EOF); }
Чтобы решить эту проблему, вы можете scanf
вывести условие из while
состояния. Нравится:
while (lastlt;N-1) { ib=scanf("%d",amp;grade); if(ib != 1 ) // Notice this change { if (ib == EOF) exit(1); // Check for fatal input error printf("Please enter a valid quiz grade: "); while((c=getchar())!='n' amp;amp; c!=EOF); if (c == EOF) exit(1); // Check for fatal input error } else { ... } }
Также измените char c;
на int c;
as getchar
возвращает an int
, чтобы обработать EOF
Комментарии:
1. Я вижу! Что же тогда должно войти в цикл? Я хочу предложить пользователю ввести ввод до тех пор, пока он не достигнет N