1.6. Циклы - StriderAJR/StudentCpp GitHub Wiki

Циклы

Циклы невероятно важны для любого языка программирования. Они очень сильно экономят время программиста на выполнении рутинных задач, потому что цикл позволяет выполнять один и тот же кусок кода много раз. Для разных целей применяют разные циклы.

В языке С++ предусмотрено три различных цикла:

  1. Цикл с предусловием while;
  2. Цикл с постусловием do-while;
  3. Цикл-счетчик 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++) {
⚠️ **GitHub.com Fallback** ⚠️