Циклы и ветвления в языке C++
Циклы
Цикл позволяет выполнить заданную последовательность действий несколько раз подряд. Все циклы могут быть вложенными друг в друга.
Цикл с предусловием while
Условие проверяется перед выполнением тела цикла. Если условие ложно, то цикл не выполнится.
int count = 10; while(count > 0) // Цикл выполняется, пока условие истинно { std::cout << count << endl; count--; }
Цикл с постусловием do-while
Условие проверяется после выполнения тела цикла. Цикл выполнится как минимум один раз.
int count = 10; do { std::cout << count << endl; count--; } while(count > 0) // Цикл выполняется, пока условие истинно
Цикл for
Цикл с заранее заданными условиями и количеством итераций.
for (int i = 0; i < 10; i++) // Цикл от 0 до 9 { std::cout << i << endl; }
В цикле for задаются три блока параметров, разделенных точкой с запятой:
- первый блок - это инициализация счетчиков цикла, выполняется только один раз
- второй блок - это проверка условий цикла, выполняется каждую итерацию; тело цикла выполняется, если условия - истинны
- третий блок - изменение счетчиков, также выполняется каждую итерацию цикла.
В блоках можно использовать несколько параметров через запятую.
for (int i = 0, j = 1; i <= 5; i++, j *= i) // Несколько параметров через запятую { std::cout << i << "-" << j << ", "; }
Любой блок оператора for может отсутствовать.
int index = 10; for (; index > 0;) // Указан только один блок условий { cout << index << endl; index--; }
Переменные, объявленные в цикле, существуют только внутри цикла. В старых версиях языка C++ переменные сохранялись после выхода из цикла.
Цикл по диапазону
В стандарте C++11 появились новые виды циклов - range-based циклы, в которых переменная пробегает по всем значением контейнера. Контейнер должен поддерживать методы begin() и end() - это может быть vector, list, set, map и массив. Цикл по диапазону не дает возможности узнать индекс текущего элемента, так как в большинстве контейнеров не существует индекса, как такового.
int arr[] = { 1, 2, 3, 4, 5}; for (int elem : arr) { std::cout << elem << ' '; // 1 2 3 4 5 }
Если требуется модифицировать элементы контейнера, то в цикле следует использовать ссылки.
int arr[] = { 1, 2, 3, 4, 5}; for (int &elem : arr) { elem *= 2; std::cout << elem << ' '; // 2 4 6 8 10 }
Управление выполнением циклов
Прервать выполнение цикла можно с помощью команды break
for (int i = 0; i < 10; i++) { std::cout << i << endl; // Команда выполнится один раз break; // Выход из цикла }
С помощью команды continue можно сразу перейти к следующей итерации цикла
for (int i = 0; i < 10; i++) { continue; // Переход к следующей итерации цикла std::cout << i << endl; // Команда никогда не выполнится }
Ветвления
Ветвления позволяют выполнять различные участки кода в зависимости от заданных условий.
Конструкция if-else
Оператор if позволяет выполнить блок кода, если условие истинно.
if (a > 3) { cout << "число больше 3" << endl; }
Оператор if-else позволяет выполнить первый блок кода, если условие истинно, и второй блок, если условие ложно.
if (a % 2 == 0) { cout << "четное" << endl; } else { cout << "нечетное" << endl; }
Однострочные блоки можно указывать без фигурных скобок
if (a % 2 == 0) cout << "четное" << endl; else cout << "нечетное" << endl;
Последовательное указание условий можно сделать через конструкцию else if.
if (x > 5) cout << "X больше 5" << endl; else if (x < 5) cout << "X меньше 5" << endl; else cout << "X равен 5" << endl;
Конструкция switch...case
Блоки кода выполняются в зависимости от указанных значений
switch (x) { case 1: cout << "X равен 1" << endl; break; case 2: cout << "X равен 2" << endl; break; }
Если в блоке не указан break, то будет выполнен следующий блок
switch (x) { case 1: cout << "X равен 1" << endl; break; case 2: case 3: cout << "X равен 2 или 3" << endl; break; }
Может быть указан блок defaul, выполняющийся если ни одно из значений не подошло
switch (x) { case 1: cout << "X равен 1" << endl; break; case 2: cout << "X равен 2" << endl; break; default: cout << "X не равен 1 и 2" << endl; break; }
В блоке case может объявляться переменная без инициализации
switch (x) { case 1: int a; // объявление переменной a = 1; // присваивание значения break; case 2: a = 2; // переменная видна, если она объявлена в блоке выше break; default: break; }
Если требуется объявить и инициализировать переменные внутри блока case, то можно использовать вложенный блок кода
switch (x) { case 1: { int a = 1; // объявление и инициализация переменной break; } case 2: int a; // переменная, объявленная во вложенном блоке выше, здесь не видна a = 2; break; default: break; }
Комментарии (0)