Минимальная, Максимальная, Средняя программа на языке Си

#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; }