Напишите программу на C, которая читает 5 чисел и считает количество положительных чисел и выводит среднее значение всех положительных значений. - PullRequest
0 голосов
/ 29 сентября 2019

я ввел первое число: 14, второе число: 63, третье число: 78, четвертое число: 45, пятое число: 21, и я получил 44,00 вместо 44,20. Где я ошибся?

#include<stdio.h>
int main() {
int i,numbers[5],total=0,count=0;
float average ;
printf("\nInput the first number:");
scanf("%d", &numbers[0]);
printf("\nInput the second number:");
scanf("%d", &numbers[1]);
printf("\nInput the third number:");
scanf("%d", &numbers[2]);
printf("\nInput the fourth number:");
scanf("%d", &numbers[3]);
printf("\nInput the fifth number:");
scanf("%d", &numbers[4]);
for (i = 0; i < 5; i++) {
    if (numbers[i] > 0) {
        count++;
        total += numbers[i];
    }
}
average = total / count;
printf("\n The number of positive numbers:%d\n", count);
printf("\n The average of all positive value is %.2f\n", average);
return 0;
 }

Ответы [ 4 ]

2 голосов
/ 29 сентября 2019

Хотя в повторяющихся строках кода нет ничего плохого, это определенно не литература.Если вы сталкиваетесь с выполнением одной и той же вещи 5 раз, и единственное изменение - это один или два индекса в выходных данных - вы должны думать циклично.Здесь вы можете расширить цикл, включив в него запрос ввода, а также обработку суммирования положительных чисел, и все это можно сделать без необходимости сохранять входные значения в массиве.

Все, что вам нужноподдерживать в цикле это sum из положительных значений.После выхода из цикла вы можете вычислить среднее значение на основе количества введенных положительных значений.

В целом, вы можете сделать что-то похожее на:

#include <stdio.h>

#define NNUM 5      /* if you need a constant, #define one (or more) */

int main (void) {

    int n = 0,      /* no. of positive value counter */
        sum = 0,    /* sum of all positive values */
        val;        /* each input value */
    double avg;     /* floating-point number to hold average */

    for (int i = 0; i < NNUM; i++) {    /* loop NNUM times */
        printf ("enter no. %d: ", i+1); /* prompt for input */
        if (scanf ("%d", &val) != 1) {  /* validate EVERY user input */
            fputs ("error: invalid integer input.\n", stderr);
            return 1;
        }
        if (val > 0) {      /* check if val is positive */
            sum += val;     /* add val to sum */
            n++;            /* increment pos value count */
        }
    }
    avg = (double)sum / n;  /* compute average (note cast) */

    printf ("\nThe number of positive numbers       : %d\n"
            "The average of all positive value is : %.2f\n", n, avg);
}

ПримерИспользуйте / Выведите

$ ./bin/avgposnum
enter no. 1: 14
enter no. 2: 63
enter no. 3: 78
enter no. 4: 45
enter no. 5: 21

The number of positive numbers       : 5
The average of all positive value is : 44.20

или с несколькими отрицательными значениями:

$ ./bin/avgposnum
enter no. 1: -10
enter no. 2: 10
enter no. 3: 0
enter no. 4: 20
enter no. 5: -20

The number of positive numbers       : 2
The average of all positive value is : 15.00

Просмотрите все и дайте мне знать, если у вас есть дополнительные вопросы.

1 голос
/ 29 сентября 2019

В вашем average = total / count; вы делаете целочисленное деление на целочисленное, что возвращает целочисленный результат.

Используйте оператор приведения, чтобы временно использовать одну из ваших переменных в качестве числа с плавающей запятой.

Как это:

average = (float) total / count;
0 голосов
/ 29 сентября 2019

total / count - целочисленное деление.Оставшаяся часть отношения теряется до присвоения объекту float average.

. Вместо этого выполните деление с плавающей запятой.


В общем случае код должен избегать приведений.Используйте их экономно.Приведение может легко скрыть проблемы.

Рассмотрим более мягкие способы, такие как введение константы с плавающей запятой в вычислениях.

1.0 * total / count

Здесь также не требуется небольшая float по сравнению с Cрабочая лошадка с плавающей запятой типа double.Различные большие int значения не будут сохранены точно в float.

Обратите внимание, что printf("%.2f\n", average); преобразует average в двойное число, прежде чем передать его в printf().

Осторожнодля / 0

printf("\n The number of positive numbers:%d\n", count);
if (count) {
  double average = 1.0 * total / count;
  printf("\n The average of all positive value is %.2f\n", average);
} else {
  printf("\n No positive values\n");
}
0 голосов
/ 29 сентября 2019

Вот более простой код.

#include <stdio.h>
int main()
{
    int n=5,a,total=0,count=0;
    float average;
    while(n--){
        scanf("%d",&a);
        if(a>0){
            printf("%d\n",a);
            total+=a;
            count++;
        }
    }
    printf("%d  %d\n",total,count);
    average=(float)total/count;
    printf("%f",average);
}

Среднее и число являются целыми числами.Таким образом, их деление также является целым числом.Используйте оператор приведения

average=(float)total/count

или

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