Напишите программу на C, которая многократно считывает удвоения из stdin, пока больше не останется для чтения, а затем выводит среднее количество элементов

#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)