В программировании на C почему мой printf не печатает после цикла? - PullRequest
0 голосов
/ 17 февраля 2019

Мне нужно напечатать сумму и среднее значение массива пользовательского ввода.Поэтому, если пользователь вводит 2,4,6,9,10, он должен напечатать 6. Однако после завершения цикла мой printf ничего не печатает.

Даже если я помещу printf внутри массива, он печатает только 0.

#include <stdio.h>
#include <math.h>

int main()
{
    int i;
    double num[6],average, sum=0, closest;
    printf("Enter 6 doubles\n");

    for (i=0; i<6; i++)
    {
    scanf("%lf",&num[i]);
    sum += num[i];

    }
    average = sum/i;
    printf("Average %d", average); 
}

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Этот вопрос не является дубликатом, но я нашел ответ на StackOverflow здесь

Поток stdout буферизован, поэтому будет отображаться только то, что находится в буфере, после того, как он достигнетперевод строки (или когда это сказано).У вас есть несколько вариантов немедленной печати:

Печатайте в stderr, вместо этого используйте fprintf:

fprintf(stderr, "I will be printed immediately");

Сбрасывайте stdout всякий раз, когда вам это нужно, используя fflush:

printf("Buffered, will be flushed"); fflush(stdout); // Will now print everything in the stdout buffer

Вы также можете отключить буферизацию на stdout, используя setbuf:

setbuf(stdout, NULL);

Что касается вашего кода, вот несколькопримечания:

  • Как описано в man 3 printf спецификатор преобразования f уже преобразован в двойные значения с плавающей запятой, поэтому нет необходимости в флаге модификатора длины.
  • Среднее значение равнотакже удваивается, так что если вы напечатаете его как целое число %d, вы потеряете вещественную часть, рассмотрите также использование %f.
0 голосов
/ 18 февраля 2019

следующий предложенный код:

  1. использует правильную подпись для main()
  2. исправляет формат, используемый в вызове, к printf()
  3. добавляет'\ n' к строке формата в 'printf ()', поэтому данные выводятся сразу, а не после выхода из программы
  4. дает «магические» числа (IE 6) значимых имен
  5. правильнопроверяет ошибки ввода / вывода и обрабатывает любую такую ​​ошибку
  6. устраняет ненужные переменные
  7. не включает заголовочные файлы, содержимое которых не используется
  8. документы, почему каждый заголовочный файл включен
  9. правильно ограничивает область действия локальной переменной 'i'
  10. , безошибочно компилирует
  11. выполняет желаемую функциональность

и теперь предлагаемый код:

#include <stdio.h>   // printf(), scanf(), perror()
//#include <math.h>
#include <stdlib.h>  // exit(), EXIT_FAILURE


#define MAX_ENTRIES 6

int main( void )
{
    //int i;
    // double num[6];
    double num;
    double average;
    double sum=0.0;
    // double closest;

    printf("Enter %d doubles\n", MAX_ENTRIES );

    for (int i=0; i< MAX_ENTRIES; i++)
    {
        if( scanf( "%lf", &num ) != 1 )
        {
            fprintf( stderr, "scanf for number failed\n" );
            exit( EXIT_FAILURE );
        }

        sum += num;
    }

    average = sum / MAX_ENTRIES;
    printf("Average %f\n", average); 
}

типичный прогон кода приводит к:

Enter 6 doubles
1.0
2.0
3.0
4.0
5.0
6.0
Average 3.500000
0 голосов
/ 17 февраля 2019

Есть несколько вещей, которые вам нужно сделать в коде.Вы должны убедиться, что они вводят 6 цифр (в вашем первом сообщении вы только перечислите 5, это создаст проблемы).Я изменил печать, чтобы использовать это, и удалил некоторые переменные, которые вы не используете.

#include <stdio.h>
#include <math.h>

int main()
{
    int i;
    double sum = 0;

    printf("Enter 6 doubles\n");
    for (i = 0; i < 6; i++)
    {
        double value;
        scanf("%lf", &value);
        sum += value;
    }

    printf("Average = %f", sum / i);
}

Введите 6 двойных:

2 4 6 9 10 10

Среднее = 6,833333

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...