Усреднение элементов в массиве

#arrays #c #linux #function #intermediate-code

Вопрос:

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

 #include lt;stdio.hgt; int main() {  int grades[6];  int average;  int sum = 0;  printf("Please enter your five test scores:n");  scanf("%d", amp;grades[0]);  scanf("%d", amp;grades[1]);  scanf("%d", amp;grades[2]);  scanf("%d", amp;grades[3]);  scanf("%d", amp;grades[4]);  scanf("%d", amp;grades[5]);    sum = sum   grades[6];   average = sum / 5;  printf("The average of the students test scores is %d:n", average);    return 0; }  

Комментарии:

1. Вам нужно суммировать grades[0] grades[5] , но ваш код просто учитывает grades[6] (которого, кстати, не существует). Как бы вы сделали это на бумаге? Вы также должны использовать цикл для чтения оценок; представьте, как выглядел бы ваш код, если бы у вас был массив из 100 оценок.

2. «Пожалуйста, введите свои пять результатов теста» , за которыми следуют шесть сканирований.

3. Вы также можете добиться этого, используя одну int переменную, а grades[6] не добавляя к ней входные данные внутри цикла. Временная сложность все равно будет O(n).

Ответ №1:

Вы должны суммировать все оценки, а затем разделить их на количество (в вашем случае это 6, а не 5, потому grades что массив состоит из 6 элементов). Вот пример кода:

 #include lt;stdio.hgt; int main() {  int grades[6];  int average;  int sum = 0;  printf("Please enter your six test scores:n");  scanf("%d", amp;grades[0]);  scanf("%d", amp;grades[1]);  scanf("%d", amp;grades[2]);  scanf("%d", amp;grades[3]);  scanf("%d", amp;grades[4]);  scanf("%d", amp;grades[5]);    for (int i = 0; i lt; 6; i  )  sum = sum   grades[i];   average = sum / 6;  printf("The average of the students test scores is %d:n", average);    return 0; }  

Комментарии:

1. Ух ты , спасибо тебе. Мне стыдно, что я этого не расслышал!

Ответ №2:

Я пытаюсь добавить элементы в массив.

Возможно, это уже неверный путь в отношении заголовка (и кода), где речь идет об усреднении элементов в массиве.

Как вы создадите массив, зависит от вас; я выбираю самый простой способ. Важным решением является: одинаковы ли размер массива и количество значений? Вот что n_grades делает. Четыре нуля в инициализации массива иллюстрируют разницу.

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

Неприятная проблема со средними значениями-это скрытое переполнение. Очень маловероятно в этой ситуации, но существует более надежный (и элегантный) алгоритм. (double) Приведение-неэлегантная часть, но она необходима, потому что деление происходит между двумя целыми числами. Тем не менее, это компактное ядро:

 for (i = 0; i lt; n_grades; i  )  aver  = (double) grades[i] / n_grades;  

соответствует математической формуле:

 ilt;n A = Sum G_i/n  i=0  

(«Сумма» — это большая Сигма)

 #include lt;stdio.hgt; int main() {  int grades[] = {10,10,9,10,11,11,0,0,0,0};   int n_grades = sizeof grades / sizeof*grades; // use all elements  //n_grades = 6; // use only first n elements   double aver = 0;    for (int i = 0; i lt; n_grades; i  )  aver  = (double) grades[i] / n_grades;   printf("The average of the students test scores is %f (n= %d):n",   aver, n_grades);   return 0; }  

Теперь он печатает:

 The average of the students test scores is 6.100000 (n= 10):  

или без комментариев, т. е. ограничено 6 классами::

 The average of the students test scores is 10.166667 (n= 6):  

Ответ №3:

Вы предполагаете, что grades[6] в нем содержится сумма всех значений в grades массиве, что, конечно, неверно.

Вам нужно что-то вроде:

 for (int i = 0; i lt; 6; i  )  sum = sum   grades[i];