1.6. Циклы - StriderAJR/StudentCpp GitHub Wiki
Циклы невероятно важны для любого языка программирования. Они очень сильно экономят время программиста на выполнении рутинных задач, потому что цикл позволяет выполнять один и тот же кусок кода много раз. Для разных целей применяют разные циклы.
В языке С++ предусмотрено три различных цикла:
- Цикл с предусловием
while
; - Цикл с постусловием
do-while
; - Цикл-счетчик
for
;
Первый цикл, который мы рассмотрим - цикл с предусловием.
Этот цикл вначале, перед каждой итерацией (а итерация - это один проход цикла от начала до конца) делает проверку условия, а после выполняет код в теле цикла.
Общая конструкция цикла выглядит так:
while (условие) { тело_цикла }
Цикл выполняется до тех пор, пока уловие истинно. Т.е. это может быть функция, возращающая true/false, или операция сравнения (a == b), например. Ниже приведен пример цикла, в котором считается необходимоe кол-во плащей для уточек.
#pragma once
#include <iostream>
using namespace std;
namespace Cycles
{
int calculateCloaks(int ducksLeft) {
int cloaksAmount = 0; // Кол-во плащей, которых необходимо сделать.
while (ducksLeft != 0) { // Цикл выполнять до тех пор, пока не останется уток без плащей.
cloaksAmount++; // Добавляем один плащ к заказу.
ducksLeft--; // На одну бедную уточку без плаща меньше.
}
return cloaksAmount;
}
Второй цикл - цикл с постусловием. Цикл, который сначала делает, а потом думает.
Конструкция:
do { тело_цикла } while (условие);
Цикл выполнит код как минимум один раз. А если быть точным - сначала выполняет код, а уже после выполняет проверку условия. Правила для него такие же, как и для предыдущего цикла. Ниже покажу пример из жизни - мы ведь должны решать настоящие задачи, верно?
Допустим, что ваш хороший друг - владелец пекарни. Он пообещал сделать скидку на каждое пирожное 10%. И еще он пообещал, что без пирожного вас не оставит, а предоставит хотя бы одно пирожное от себя.
int calculatePuns(int moneyLeft) {
int totalPuns = 0; // Общее кол-во булочек, которое мы получим.
int price = 10; // Цена за булочку с учетом скидки.
do {
totalPuns++; // Кладём одну булочку себе.
moneyLeft -= price; // Вычитаем цену за одну булочку из общего кол-ва наших денег.
} while (moneyLeft > 0);
return totalPuns;
}
Ну и последний на сегодня цикл - цикл-счетчик.
Очень полезен, когда нужно выполнить что-то определенное кол-во раз. Кажется самым сложным для начинающих, но поверьте, что в нем нет ничего сложного, если запомнить его структуру и попрактиковаться.
Выглядит цикл так:
for (объявляем_переменные_счетчика; условие выхода из цикла; действие_после_итерации) { тело_цикла }
Допустим, что вам нужно 100 раз сложить '2 + 2', а считать ну так лениво...
int calculateSum() {
int sum = 0; // Наша сумма.`
for (int count = 0; count < 100; count++)
{
sum += 2 + 2;
}
return sum;
}
int main() {
// Вызвать цикл с предусловием.
cout << "Сколько потребуется плащей на 10 уток? Точно! Нужно: "
<< calculateCloaks(10) << endl;
// Мы богаты и у нас есть 100 рублей!
cout << "На 100 рублей мы можем купить: "
<< calculatePuns(100)
<< " пирожных! Невероятно!" << endl;
// У нас совсем не осталось денег с покупки плащей для уток :(
cout << "У нас нет денег, но нам все равно обещали одну булочку, верно?" << endl
<< "Проверим. На 0 рублей у нас будет: "
<< calculatePuns(0)
<< " булочка! Ураа!" << endl;
// Сколько будет 100 раз сложить 2 и 2? Вот так сразу не ответите, а я уже посчитал!
cout << "100 раз по 2 + 2 будет: "
<< calculateSum() << endl;
// И немного баловства
for (int i = 0; i < 10; i++) // Цикл1 выполнится 10 раз
cout << i << " ";
cout << endl;
for (int i = 0, j = 3; i < 10 && j > 0; i++, j--) // Цикл2 выполнится всего 3 раза
cout << "yes" << " ";
cout << endl;
for (int i = 10; i > -5; i = (i - 4) / 2 - 1) // Цикл3 выполнится 4 раза
cout << i << " ";
cout << endl;
for (int i = 1; ; i++) // Цикл4 неизвестно когда завершится
{
cout << "Try out #" << i << ". Input even number: ";
int n;
cin >> n;
if (n == 0)
{
cout << "CHEATER!" << endl;
i++;
continue;
}
if (n % 2 == 0)
{
cout << "Ok." << endl;
break;
}
else
cout << "No. The number is not even. Try again." << endl;;
}
for (;;) // Цикл5 бесконечен: нет ни начала, ни конца
{
cout << "Are tired? y/n ";
char c;
cin >> c;
if (c == 'y')
break;
if (c != 'y' && c != 'n')
cout << "Oops! Be careful what you are saying." << endl;
}
while (true) // Цикл6 бесконечен. Условие выхода - всегда истина
{
cout << "Day of Hedgehog. Are tired? y/n ";
char c;
cin >> c;
if (c == 'y')
break;
if (c != 'y' && c != 'n')
cout << "Oops! Be careful what you are saying." << endl;
}
char c;
cout << "MAKE IT STOP! Are tired? y/n ";
cin >> c;
while (c != 'y') // Цикл7 тупая вариация на тему цикла6
{
cout << "MAKE IT STOP! Are tired? y/n ";
cin >> c;
}
`do` // Цикл8 правильная реализация цикла с вопросом об остановке
`{
cout << "KMP... Are you not tired? y/n ";
cin >> c;
} while (c != 'y');
int a = 10, b = 4;
double result;
do
{
result = ((double)a / b) * 2 - 3;
cout << "a / b * 2 - 10 = " << result << endl;
a = result, b = result / 3;
} while (result > 0);
return 0;
}
}`
Мы объявляем локальную переменную count. Пока эта переменная меньше 100, будет выполняться код в цикле, а после каждого выполнения кода (итерации) значение переменной-счетчика будет увеличиваться на 1.
int calculateSum() {
int sum = 0; // Наша сумма.`
for (int count = 0; count < 100; count++) {