#c #while-loop #double #scanf
#c #цикл while #double #scanf
Вопрос:
У меня возникли проблемы с распечаткой количества введенных элементов и среднего значения этой программы, и я должен использовать цикл while, можете ли вы помочь мне понять, что я делаю неправильно.
#include <stdio.h>
int main(void) {
double n;
int counter = 0;
double sum = 0.0, average;
scanf("%lf", amp;n);
while (1 != scanf("%lf", amp;n)) {
counter ;
scanf("%lf", amp;n);
sum = sum n;
printf("%d", counter);
average = sum / counter;
printf("%lf", average);
}
return 0;
}
Вот как это должно выглядеть
Ввод: 2.2 2.4 1.5 1.1 3.3 5.5 Q
Вывод: 6 2.666667
Комментарии:
1. итак, как это выглядит сейчас?
2. Почему так много
scanf
вызовов? Вы понимаете, что каждыйscanf
из них будет использовать один из входных данных? И поскольку вы не используете результат каждогоscanf
, некоторые из входных данных будут отброшены.3.
while(1 != scanf("%lf", amp;n))
приведет к остановке цикла, как только будет сопоставлен ввод. Это действительно то, что вы хотите? Я предполагаю, что вы имели в виду сделать==
, а не!=
.4. И
printf
вызовы, вероятно, должны быть вне цикла. То есть результаты должны быть показаны в конце. То же самое дляaverage
вычисления — его нужно выполнить только один раз вне цикла, а не для каждого ввода.5. О, хорошо, теперь я вижу, что я поместил только один scanf, и он показывает прогресс, и я помещу вызовы print вне цикла, чтобы посмотреть, работает ли он еще
Ответ №1:
Вы должны прочитать значения в цикле, проверить, scanf()
возвращает 1
ли он для успешного преобразования, обновить sum
и counter
внутри тела while
цикла и вывести среднее значение и количество после окончания цикла.
Вот измененная версия:
#include <stdio.h>
int main(void) {
int counter = 0;
double n, sum = 0.0;
while (scanf("%lf", amp;n) == 1) {
counter ;
sum = sum n;
}
if (counter == 0) {
printf("no valuesn");
} else {
printf("%d %fn", counter, sum / counter);
}
return 0;
}
Комментарии:
1. возможно, стоит проверить счетчик, чтобы избежать деления на ноль, но в остальном короткое и простое решение.
Ответ №2:
В вашем коде слишком много избыточности:
double n;
int counter = 0;
double sum = 0.0, average;
// you do not need the following initial read
// (see reconstructed while condition)
scanf("%lf", amp;n);
// replace the following line with "while (1)"
while (1 != scanf("%lf", amp;n)) {
// sth like the following if block is to be inserted to check end of input
if (scanf("%lf", amp;n) == 0) {
break;
}
counter ; // ok
// you do not need the following line
// if block takes care of the input
scanf("%lf", amp;n);
sum = sum n; // ok
// better pull the remaining lines out of the while loop
printf("%dn", counter); // better to insert 'n' here
average = sum / counter;
printf("%lfn", average); // and here 'n'
}
return 0;
И, кстати, для приведенного выше кода ваш макет ввода должен был быть :
2.2
2.4
1.5
1.1
3.3
5.5
Q
Рабочий пример может быть, например;
int main(void) {
double n;
int counter = 0;
double sum = 0.0, average;
while (1) {
if (scanf("%lf", amp;n) == 0) {
break;
}
counter ;
sum = sum n;
}
printf("%dn", counter);
average = sum / counter;
printf("%lfn", average);
return 0;
}
Комментарии:
1. Ваш ответ немного сбивает с толку. Показанный код сохраняет некоторые неправильные части (с комментариями), а затем добавляет некоторый код, который частично помогает. Было бы лучше представить полностью рабочее решение, а не смесь неправильного и исправленного кода.
2. Я подумал, что для нее / него было бы лучше восстановить код самостоятельно, чем писать рабочий код; но я это сделаю.
3. Это тоже может быть хорошо. В этом случае не добавляйте / не изменяйте биты исходного кода. Сохраните исходный код в точности таким, как у OP, а затем добавьте комментарии к этому коду, указывающие на проблемы. Это сочетание сбивает с толку.
4.
if (scanf("%lf", amp;n) == 0)
не удастся определить конец файла, если до этого не произойдет сбой преобразованияEOF
. Используйтеwhile (scanf("%lf", amp;n) == 1)