Сумма в цикле
Циклы умеют не только выводить. Очень часто они складывают много значений. Согласно известной истории, юный Карл Фридрих Гаусс, позже великий математик, должен был сложить в школе все числа от 1 до 100. Цикл справляется с этим в одно мгновение:
int total = 0;
for (int i = 1; i <= 100; i++) {
total += i;
}
printf("Итого: %d\n", total);Итого: 5050Переменная total накапливает сумму. Она начинается с 0, потому что пока вы ничего не сложили, сумма равна нулю. В каждой итерации total += i добавляет одно число: после первой итерации total равно 1, потом 3 (1 + 2), 6 (1 + 2 + 3), 10, а в конце 5050.
Важно, где стоит каждая строка:
int total = 0;стоит перед циклом, чтобы выполниться только один раз. Внутри блока цикла она создавала бы новую переменнуюtotalсо значением 0 в каждой итерации. А после циклаtotalвообще не существовала бы: переменная, созданная в блоке, существует только в этом блоке, как и переменнаяiциклаfor. Компилятор сообщил быerror: use of undeclared identifier 'total'.printfстоит после цикла, когда сумма уже готова. Внутри цикла он выводил бы каждую промежуточную сумму: 1, 3, 6, 10 и так далее, сто строк.
Среднее — это сумма, делённая на количество значений. Остерегайтесь целочисленного деления. Вот среднее чисел от 1 до 10:
int total = 0;
for (int i = 1; i <= 10; i++) {
total += i;
}
double average = total / 10;
printf("Среднее: %.1f\n", average);Среднее: 5.0Сумма равна 55, поэтому настоящее среднее — 5,5. Но и total, и 10 — целые числа, так что / делит их как целые и отбрасывает дробную часть .5, как 7 / 2 даёт 3. Сохранить результат в double не помогает, потому что к этому моменту деление уже выполнено. Преобразуйте сумму в double до деления:
int total = 0;
for (int i = 1; i <= 10; i++) {
total += i;
}
double average = (double)total / 10;
printf("Среднее: %.1f\n", average);Среднее: 5.5(double)total превращает сумму в десятичное число, а десятичное число, делённое на целое, даёт десятичное число. Ставьте (double) прямо перед total. Запись (double)(total / 10) преобразовала бы только результат целочисленного деления, и вы снова получили бы 5.0.
Задание
- 1
Вы проходите шестидневный марафон по отжиманиям: 5 отжиманий в первый день и каждый следующий день на 5 больше, как и выводит программа в редакторе. Сколько всего отжиманий вы сделаете? Перед циклом создайте переменную
totalсо значением0. В цикле прибавляйте к ней с помощью+=отжимания этого дня,day * 5. После цикла выведите сумму в видеИтого: 105. - 2
В конце программы создайте переменную
averageтипаdoubleсо средним количеством отжиманий в день:total, делённое на6. Выведите её с помощью%.1fв видеСреднее: 17.5. Если ваша программа выводитСреднее: 17.0, ещё раз прочитайте о целочисленном делении.