Циклы в программировании имеют очень большой вес. При написании кода некоего алгоритма бывает необходимо повторить какой-то этап несколько раз. Можно повторить один и тот же фрагмент несколько раз, но что делать если таких фрагментов нужно несколько тысяч?
Область применения циклов очень велика потому, что в них и заключается ключевая суть применения программирования и использования компьютеров для расчётов в целом — точность.
Для повышения точности определённого расчёта бывает необходимо просчитать результат выражения миллион раз постоянно внося мелкие корректировки в расчёт исходя из определённых условий. Миллион раз править их руками очень не удобно, поэтому этот процесс программируют используя циклические алгоритмы (алгоритмы использующие циклы) и заставляют компьютер вносить все поправки и считать значение выражения.
Существует три вида циклов
1. Безусловный цикл (for())
2. Цикл с предусловием (while())
3. Цикл с постусловием(do … while())
Код, который находится в фигурных скобках ({}) после служебного слова (наименования используемого самим языком, в данном случае for, while, do), называется кодом находящимся в теле цикла.
В любом цикле используется счётчик — переменная, которая выступает в роли контроля количества проходов цикла.
For (безусловный цикл)
Этот тип циклов бывает полезен в тех случаях, когда мы заранее знаем количество проходов цикла (количество повторяющихся фрагментов кода).
В данном случае счётчик всегда увеличивается на 1.
Например, вывести на экран все числа от 1 до 100.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); //нам необходим счётчик, который будет "говорить" сколько раз нужно произвести повтор for (int i = 0; i <= 100; i++) { //в данном цикле мы можем объявить переменную прямо в скобках цикла std::cout << i << std::endl; //выводим значение переменной } system("pause"); return 0; } |
While (цикл с предусловием)
Данная разновидность циклов бывает эффективна, когда нам нужно повторить, но согласно какому-то условию. Тут нам придётся прописывать счётчик самостоятельно.
Например вывести все чётные числа от 1 до 100.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); int i = 0; //первоначальное значение счётчика while (i < 100) { //обозначение цикла, в скобках основное условие цикла std::cout << i << std::endl; //выводим значения i = i + 2; //увеличиваем значение счётчика на 2 } system("pause"); return 0; } |
Вы заметили, что 100 не попало в вывод? Фокус прост: условие цикла (i < 100), условие не строгое, а наращивание (увеличение) счётчика происходит после того, как вывели значение на экран, то есть на моменте, когда у нас вывелось 98 наш счётчик увеличился на 2 и пошла проверка цикла, i < 100 — да, меньше. На этом моменте наш цикл завершается и программа идёт выполняться дальше по коду.
do … While() (цикл с постусловием)
Этот цикл ещё более специфичный. Его особенность заключается в том, что он всегда выполняется хотя бы один раз. Достигается этот эффект путём проверки условия после полного прохода цикла, а не до прохода как это происходит в for() или while(). Во всём остальном он идентичен циклу while().
Рассмотрим тот же пример, что и для while(), только преобразуем его под do…while() и изменим условие.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); int i = 0; //первоначальное значение счётчика do { //обозначение начала цикла std::cout << i << std::endl; //на вывод попадёт 0 i = i + 2; //увеличиваем значение счётчика на 2 } while (i > 100); //условие цикла проверяется после прохода system("pause"); return 0; } |
Согласно условию i должна быть больше ста, но на вход мы получаем 0, который увеличивается на 2, но 2 меньше 100, поэтому цикл завершается и программа работает дальше по коду. Цикл выполнился один раз, так как проверка условия цикла стоит после тела цикла.
Тонкости при работе с циклами
При работе с циклами бывает необходимо вставить блок с определённым условием, организовать вечный цикл (мы можем не знать сколько раз нам будет нужно выполнить какое-то действие), но из цикла нужно как-то всё таки выйти, иначе программа нам будет выполнять определённое действие до тех пор, пока у нас не закончится память компьютера (когда происходит некий расчёт, то под значение отводится определённый фрагмент памяти компьютера), здесь нам поможет оператор break, а также можно создавать вложенные циклы.
Пример с break и вечным циклом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); int i = 0; //первоначальное значение счётчика int g = 1; //переменная, значение которой будем выводить do { //обозначение начала цикла std::cout << g << std::endl; //выводим g if (g == 200) { //если g равно 200, выйти из ближайшего цикла break; } g++; //наращиваем переменную, которую выводим } while (i < 1); //условие цикла, где i не меняется, следовательно i всегда меньше 1, так как i=0 system("pause"); return 0; } |
Уберите break и Ваш цикл никогда не закончится.
Пример с вложенным циклом (for())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); for (int i = 0; i <= 10; i++) { //верхний цикл for (int j = 0; j <= 10; j++) { //вложенный цикл, если j > 10, то вложенный цикл завершается //делается отступ и счётчик верхнего цикла увеличивается на 1, а счётчик вложенного обнуляется std::cout << i + j << "\t"; //выводим сумму i и j, они постоянно меняются } std::cout << std::endl; //отступ } system("pause"); return 0; } |
Пример с вложенным циклом (while())
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); int i = 0, j = 0; //переменные счётчиков while (i < 10) { //верхний цикл while (j < 10) { //вложенный цикл, если j > 10, то вложенный цикл завершается std::cout << i + j << "\t"; //выводим сумму i и j, они постоянно меняются j++; //наращиваем счётчик для вложенного цикла на 1 //как только счётчик достигает 10, вложенный цикл завершается и i увеличивается на 1 } //сейчас j равно 10, после выполнения условия вложенного цикла, то есть больше вложенный цикл не сработает std::cout << "\n"; i++; //наращиваем счётчик для верхнего цикла на 1 } system("pause"); return 0; } |
Чтобы исправить образовавшуюся проблему (вложенный цикл срабатывает лишь пока j не равно 10) нам необходимо обнулить j после достижения им значения 10.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> int main() { setlocale(LC_ALL, "Russian"); int i = 0, j = 0; //переменные счётчиков while (i < 10) { //верхний цикл while (j < 10) { //вложенный цикл, если j > 10, то вложенный цикл завершается std::cout << i + j << "\t"; //выводим сумму i и j, они постоянно меняются j++; //наращиваем счётчик для вложенного цикла на 1 //как только счётчик достигает 10, вложенный цикл завершается и i увеличивается на 1 } j = 0; //обнуляем j после вложенного цикла //сейчас j равно 0, после выполнения условия вложенного цикла std::cout << "\n"; i++; //наращиваем счётчик для верхнего цикла на 1 } system("pause"); return 0; } |
Запомните: переменная созданная в теле цикла, существует только в пределах этого тела.
То есть, если вы объявили переменную с именем z в теле цикла, то при обращении к переменной z в другом месте кода компилятор выдаст ошибку, так как этой переменной не существует.
Как Вы сами убедились — циклы играют чуть ли не ключевую роль в программировании.
Таким образом мы познакомились с циклами языка программирования C++ 🙂