Сумма и среднее
Теперь, когда вы умеете проходить по массиву, посмотрим, для чего такие циклы нужны чаще всего. Первый шаблон — сложить всё. Вы знаете его по уроку о циклах; с массивом вы складываете его элементы. Допустим, у вас есть цены товаров в корзине, и нужна общая сумма:
int prices[] = {120, 45, 300, 85};
int count = sizeof(prices) / sizeof(prices[0]);
int total = 0;
for (int i = 0; i < count; i++) {
total += prices[i];
}
printf("Итого: %d\n", total);Это выведет:
Итого: 550Переменная total накапливает сумму. Она начинается с 0, перед циклом, потому что пока вы ничего не сложили, сумма равна нулю. В каждой итерации total += prices[i] добавляет одну цену: после первой итерации total равно 120, затем 165, 465 и наконец 550. printf стоит после цикла, когда сумма уже готова. Внутри цикла он выводил бы каждую промежуточную сумму.
Среднее — это сумма, делённая на число значений. Здесь остерегайтесь целочисленного деления: total и count оба типа int, поэтому total / count равно 137, а не 137.5, как 7 / 2 равно 3. На этом сайте вы часто заметите это по сообщению об ошибке. Если вывести результат с помощью %.2f, как в printf("Среднее: %.2f\n", total / count);, программа не скомпилируется:
main.c:10:31: error: format specifies type 'double' but the argument has type 'int' [-Werror,-Wformat]Для %.2f нужно десятичное число, а total / count — целое. Под сообщением Clang предлагает %.2d, но это не поможет: дробная часть всё равно потеряется. Вместо этого превратите сумму в double до деления с помощью (double):
double average = (double)total / count;
printf("Среднее: %.2f\n", average);Это выведет:
Среднее: 137.50(double)total делает из total десятичное число, а десятичное число, делённое на целое, даёт десятичное число. Важно, куда вы ставите (double). Запись (double)(total / count) сначала делит два целых числа и только потом превращает 137 в 137.00: слишком поздно. То же относится к double average = total / count;. Переменная имеет тип double, но деление уже отбросило .5.
Задание
- 1
В массиве
pointsхранятся ваши баллы за четыре теста. Создайте переменнуюtotalсо значением0. Затем переберитеpointsцикломforи прибавьте каждый элемент кtotalс помощью+=. - 2
После цикла выведите сумму в виде
Итого: 94. - 3
В конце программы создайте переменную
averageтипаdoubleсо средним значением и выведите её с одним знаком после запятой:Среднее: 23.5. Если ваша программа выводитСреднее: 23.0, ещё раз прочитайте о целочисленном делении.