#c
#c
Вопрос:
Я пытаюсь создать программу, которая будет принимать положительный ввод пользователей для количества значений, затем сканировать значения пользователей и указывать эти значения (которые могут быть отрицательными), но если пользователь вводит какие-либо буквы, программа должна пропустить их в списке значений. Я также не могу понять, как заставить программу пропустить отрицательное число для количества значений, если оно случайно введено (в первом примере -4 случайно введено для количества значений и пропущено, затем 4 используется для количества значений, за которыми следует каждое значение). Я был бы признателен за помощь!
Вот что у меня есть до сих пор:
#include lt;stdio.hgt; #include lt;ctype.hgt; int main() { int i; double userVal; double userNum; double min = 0; double max = 0; double sum = 0; double average; scanf("%lf", amp;userVal); for (i = 1; i lt;= userVal; i) { scanf("%lf", amp;userNum); sum = userNum; if (i == 1 || min gt; userNum) min = userNum; if (i == 1 || max lt; userNum) max = userNum; } average = sum / userVal; printf("The minimum value is %g, the maximum value is %g, and the average value is %g.n", min, max, average); return 0; }
Изображение вывода: https://i.stack.imgur.com/8q4YC.png
Комментарии:
1. Для букв проверьте возвращаемое значение от
scanf
. Это количество успешных сканирований. Если это не1
так, то прочитайте всю строку и выбросьте.2. Выбросьте с
%*[^n]%*c
собой .3. Ваше среднее значение неверно, это
sum / count
неsum / userVal
так .4. @Blindy
userVal
— это граф. Не очень хорошее имя переменной, и, вероятно, оно должно быть целым числом, но неважно!5. Используйте «while(!scanf(«%lf», amp;userVal) amp;amp; userVal
Ответ №1:
Вы можете (и должны) использовать возврат из scanf
. Он возвращает количество успешных сканирований. Он также возвращает EOF, если произошла ошибка.
#include lt;stdio.hgt; #include lt;stdlib.hgt; #include lt;float.hgt; // helper function to read all characters up to and including a new line void consume_line() { int c; while ((c = getchar()) != 'n') { // Error?? if (c == EOF) { // Handle error. Maybe exit program? puts("ERROR"); exit(0); } } } int main() { int count; double min = DBL_MAX; double max = DBL_MIN; double sum = 0; do { // Read an int. If failure, discard input if (scanf("%d", amp;count) != 1) { consume_line(); count = -1; } } while (count lt;= 0); // Loop until count gt; 0 int count2 = count; // Use a copy since count is needed later while (count2 gt; 0) { double userNum; if (scanf("%lf", amp;userNum) == 1) { // Success sum = userNum; count2--; if (min gt; userNum) min = userNum; if (max lt; userNum) max = userNum; } else { // Failure consume_line(); } } double average = sum / count; printf("The minimum value is %g, the maximum value is %g, and the average value is %g.n", min, max, average); return 0; }