Я запутался в своем выводе, который дает самое близкое среднее значение суммы чисел, введенных пользователем. (Округляет десятичное число до целого числа) - PullRequest
0 голосов
/ 21 февраля 2019

Завершите следующую программу, чтобы найти самое близкое к среднему число в массиве.Например, массив {2, 4, 6, 3, 9, 10} имеет среднее значение 5,666667, а самое близкое число к среднему в массиве равно 6. Обратите внимание, что ближайшее число может быть больше или меньше среднего.

#include <stdio.h>
#include <math.h>
int main()
{
    int i;
    double num[6],average, sum=0, closest;
    printf("Enter 6 doubles\n"); //2,4,6,9,3,10

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

    //professor's code
    for (i=0; i<6; i++)
        sum += num[i]; //sum=34

    average=sum/6; //5.6666667
    closest = num[0]; //why are we even using this??? //initialize?

    for (i=0; i<6; i++)
        if(fabs(num[i]-average) < fabs(closest-average)) //|6-5.7|<|0-5.7|-> 0.7<5.7->true 
            closest = num[i]; // why is it giving 6?? 
   //where is it being rounded to the closest number??

    //professor's code ends     


    printf("Closest is %lf\n", closest);
    return(0);

}

//Output:
//Closest is 6

1 Ответ

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

Ваши комментарии к заголовку и коду предполагают, что вы думаете, что программа (всегда) возвращает целое число, наиболее близкое к среднему значению ее входных данных.Это не.Он возвращает вход , который является ближайшим к среднему значению всех входов.Конечно, это будет целое число, если все входные данные являются целыми числами, но вы вводите их как числа с плавающей запятой, поэтому они не обязательно должны быть целыми числами.Следовательно, выходные данные не обязательно должны быть единичными.

Например, если эти входные данные представлены в вашей программе:

1 2 2 2 2 1,8

, он примет их и выдаст

Ближайшее - 1.800000

.Кроме того, выходной сигнал не обязательно должен быть особенно близким к среднему.Например, попробуйте эти входные данные:

1 1 1 1 1 1000000

.Вы должны получить

Ближайший 1.000000

.Это целое число, но оно не соответствует среднему значению примерно 166666.

Что касается вопросов, встроенных в код:

    closest = num[0]; //why are we even using this??? //initialize?

Цикл, следующий сразу за этимв коде ищет входы, которые ближе к среднему, чем closest.Это бессмысленно, если closest не было присвоено значение, и это потенциально может привести к неверному результату, если closest не содержит значение, равное одному из входов.Конечно, при closest, начинающемся с того же значения, что и num[0], результат будет таким же, если цикл начнет тестирование с индекса 1 вместо индекса 0.

   //where is it being rounded to the closest number??

Это не округлено.В этот момент closest уже содержит значение, равное одному из входов.Его не нужно округлять, и на самом деле округление во многих случаях даст результат, которого нет среди входных данных.

...