Сумма и среднее
Теперь вы умеете проходить по вектору, и можно посмотреть, для чего циклы нужны чаще всего. Первый шаблон — сложение всего подряд. Допустим, у вас есть цены вещей в корзине, и нужна общая сумма:
std::vector<int> prices = {120, 45, 300, 85};
int total = 0;
for (int price : prices) {
total += price;
}
std::cout << "Сумма: " << total << std::endl;Сумма: 550Переменная total собирает сумму. Она начинается с 0, потому что пока ничего не сложено, сумма равна нулю. На каждой итерации total += price добавляет одну цену: после первой итерации total равно 120, затем 165, 465 и наконец 550.
Важно, где стоит каждая строка:
int total = 0;стоит перед циклом, чтобы выполниться только один раз. Внутри блока цикла она на каждой итерации создавала бы новую переменнуюtotalсо значением 0. А после циклаtotalвообще не существовало бы: переменная, созданная в блоке, существует только в этом блоке, и Clang сообщил быerror: use of undeclared identifier 'total'.std::coutстоит после цикла, когда сумма уже готова. Внутри цикла он вывел бы все промежуточные суммы: 120, 165, 465 и 550.
Среднее — это сумма, делённая на количество значений, а количество значений — это размер вектора. Но остерегайтесь целочисленного деления. После цикла выше такой код выведет:
double average = total / prices.size();
std::cout << "Среднее: " << average << std::endl;Среднее: 137Настоящее среднее — 137,5. И total, и prices.size() — целые числа, поэтому / делит их как целые и отбрасывает .5, как 7 / 2 даёт 3. Сохранение результата в double не помогает: деление к этому моменту уже выполнено. Выход — с самого начала собирать сумму в double. Десятичное число, делённое на целое, даёт десятичное число:
std::vector<int> prices = {120, 45, 300, 85};
double total = 0;
for (int price : prices) {
total += price;
}
std::cout << "Сумма: " << total << std::endl;
double average = total / prices.size();
std::cout << "Среднее: " << average << std::endl;Сумма: 550
Среднее: 137.5double, в котором лежит целое число, выводится без десятичной точки, поэтому сумма по-прежнему 550. И пишите prices.size(), а не число 4: когда вы добавите в вектор ещё одну цену, среднее останется верным.
Задание
- 1
В векторе
pointsлежат ваши баллы за четыре контрольные. Создайте переменнуюtotalсо значением0. Затем пройдите поpointsцикломforи добавьте каждое значение кtotalс помощью+=. - 2
После цикла выведите сумму в виде
Сумма: 94. - 3
В конце программы создайте переменную
averageтипаdoubleсо средним:total, делённое на размер вектора. Выведите его в видеСреднее: 23.5. Если ваша программа выводитСреднее: 23, перечитайте часть про целочисленное деление.