#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];