Циклы и ветвления в языке 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;
}