Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Философия программирования на C++: краткий обзор циклов


Добрый день, уважаемые подписчики.
Для начала несколько новостей. Сегодняшний выпуск будет посвящен циклам, и этот выпуск будет скорее всего последним, сделанным в виде статьи. Дальше мы собираемся попробовать выпуск рассылки меньшего размера, но чаще. Напоминаю, что рассылка тестовая, поэтому часто будут такие эксперименты в выпуске рассылки. Кроме того теперь вы можете присылать все свои комментарии, замечания, вопросы на наш новый e-mail: thinkingc@qt-prog.ru .

Вначале коротко о циклах, для чего они нужны и небольшой пример.
Цикл - конструкция, позволяющая выполнить команду или блок команд несколько раз. Один шаг цикла называется итерацией.
Например, нам надо вывести цифры от 0 до 9. Можно сделать просто - увеличиваем число на 1 и выводим. Вот так:
#include "iostream"
using namespace std;
int main(){
    int i = 0;
    cout << i <<" ";
    i = i+1;
    cout << i <<" ";
    i = i+1;
    cout << i <<" ";
    //И так далее, всего 10 раз
    //..
}

Неудобно, столько кода и куча повторений. И вот тут пригодится цикл:
#include "iostream"
using namespace std;
int main(){
    int i = 0;
    while(i <= 9) { //Действия повторяются до тех пор, пока истинно условие
        cout << i << " ";
        i = i+1;
    }
}


Итак, что же здесь происходит. когда программа доходит до строчки while(i <= 9), проверяется условие в скобках, и если оно истинно (true), то начинает выполняться блок внутри фигурных скобок. После того, как блок будет пройден, опять проверяется условие. И если опять условие возвращает true, то снова начинает выполняться блок цикла. Фактически цикл работает как условный оператор if, который повторяется до тех пор, пока условие истинно. Поэтому все, что относилось к условию в условных операторах, сохраняется и здесь (имеется в виду тип bool и его использование в условиях, см. предыдущие выпуски).
Такая форма записи очень удобно читается: while (i <= 9) - это значит "пока i меньше либо равно 9".

Существуют 3 вида цикла - цикл while с предусловием, цикл while с постусловием, цикл for.

Цикл while с предусловием имеет следующий синтаксис:
while (условие)
    оператор;

Под оператором, как и раньше, понимается одиночный оператор или блок операторов в фигурных скобках. Цикл выполняет оператор до тех пор, пока условие истинно. Таким образом, если условие ложно в самом начале работы цикла, то оператор ни разу не выполнится. Пример данного цикла мы уже рассматривали в самом начале.

Перейдем к циклу while с постусловием.
Его синтаксис:
do
    оператор;
while (условие);

Оператор выполняется до тех пор, пока условие истинно. Но, так как условие проверяется в конце, оператор выполнится хотя бы 1 раз. То есть сначала выполняется блок, а потом проверяется условие выхода из цикла.

Пример:
#include "iostream"
using namespace std;
int main(){
    int i = 2;
    do {
        cout << i << " ";
        i = i+2;
    } while(i < 0);//условие неверно, но цикл выполнится 1 раз
}


Последний вид цикла - цикл for. Его основное назначение - выполнять блок "для каждого из значений". Например, for(int i = 0; i <= 9; i = i + 1) означает "для всех i от 0 до 9 с шагом 1". Сейчас расскажем, почему так.
Данный вид циклов имеет более сложный вид:
for (оператор инициализации; условие; выражение)
    оператор;

Все аргументы цикла являются обязательными, но они могут быть просто пустыми. Например, допустимо такое его применение: for ( ; ; ).
Итак, как же работает цикл for. Перед входом в цикл выполняется оператор инициализации (мы так его называем только потому, что его используют чаще всего для этой цели, но на самом деле здесь может находиться любой оператор). Больше он нигде не использутеся. Внутри этого оператора можно инициализировать переменные и вообще делать что угодно. Но мы бы не рекомендовали там писать всю программу, ведь в итоге код должен получиться удобочитаемым, поскольку пишется он один раз, а читается 100 раз. После этого проверяется условие, если оно ложно, цикл не выполняется, если истинно, то выполняется блок цикла. После выполнения блока цикла выполняется <выражение>. Там тоже может находиться все, что угодно (с помощью оператора запятая ','), но мы бы не рекомендовали использовать его для сложных конструкций (как правило сюда пишут операторы инкремента/декремента).
Пример использования for:
#include "iostream"
using namespace std;
int main(){
    for (int i =0; i <=10;i = i+2)
        cout << i << " "; //Выведутся числа 0, 2, 4,..,10
}


На самом деле, цикл for и while взаимозаменяемы, их можно выразить друг через друга.
Например,
for (оператор инициализации;выражение1;выражение2)
    оператор

эквивалентно
оператор инициализации;
while (выражение1){
    оператор;
   
выражение2;
}

Итак, выполнение циклов зависит от истинности условия. Но существует возможность прервать выполнение цикла или перейти на следующую итерацию.
Для этой цели существуют операторы break и continue. break просто выходит из цикла, а continue переходит к следующей итерации (с проверкой условия).
Пример их использования:
#include "iostream"
using namespace std;
int main(){
    int i = 2;
    while ( i < 100){
        i = i+1;
        if ( i == 50) //когда i станет 50, цикл завершится
            break;
        if ( i == 20) //пропускаем значение 20
            continue;
        
    }
}

На этом на сегодня всё. Если у Вас имеются вопросы или хотите оставить отзыв о рассылке - пишите нам на почту thinkingc@qt-prog.ru, мы обязательно ответим.


В избранное