Циклы и ветвления C++ — это операторы языка программирования С++, позволяющие повторять заданный код некоторое количество раз и выбирать направление дальнейших операций.
Общие сведения о циклах
Цикл является повторным исполнением одних и тех же операций. Совокупность операций, повторяющихся в цикле, называется телом цикла. Существуют различные типы циклических структур, в частности:
- Тип циклических структур, обладающих циклами с некоторым предварительным условием.
- Тип циклических структур, обладающих циклами с постусловием.
Алгоритмы, в которых содержатся подобные циклические структуры, именуются условными циклическими алгоритмами. Необходимо подчеркнуть, что оба этих вида циклов, по сути, являются взаимозаменяемыми, но, при этом, они имеют следующие отличия:
- Цикл с предварительным условием осуществляет проверку условия до выполнения команд тела цикла, а цикл с постусловием данную проверку осуществляет после команд тела цикла.
- Цикл с постусловием должен выполнить команды тела цикла хотя бы один раз в любом случае, а цикл с предварительным условием команды тела цикла может совсем не исполнять.
- Цикл с предварительным условием выполняет проверку условия, по которому цикл может продолжаться, а цикл с постусловием выполняет проверку условия окончания цикла.
Циклы и ветвления C++
Итак, цикл предоставляет возможность выполнения заданной последовательности операций несколько раз подряд, а также все циклы можно вкладывать друг в друга. Рассмотрим цикл с предварительным условием whíle. Условие должно проверяться перед исполнением тела цикла, то есть, когда условие является ложным, то в этом случае тело цикла не исполняется:
ínt count = 10;
whíle(count > 0) // Цикл исполняется, пока условие является истинным
{ std::cout $\lt$$\lt$ count $\lt$$\lt$ endl;
count--;
}
В цикле с постусловием do-whíle, условие должно проверяться после исполнения тела цикла, то есть, цикл должен быть выполнен минимально хотя бы один раз:
ínt count = 10;
do
{
std::cout $\lt$$\lt$ count $\lt$$\lt$ endl;
count--;
} whíle(count > 0) // Цикл исполняется, пока условие является истинным
Цикл for является циклом с заранее определенным условием и числом исполнений тела цикла:
for (ínt í = 0; í $\lt$ 10; i++) // Цикл от нуля до девяти
{
std::cout $\lt$$\lt$ í $\lt$$\lt$ endl;
}
В цикле for должны задаваться следующие блоки параметров, которые разделяются точкой с запятой:
- В первом блоке осуществляется инициализация счетчиков цикла, которая исполняется всего один раз.
- Во втором блоке осуществляется проверка условия цикла, которая исполняется при каждой итерации. А тело цикла исполняется, если условия являются истинными.
- В третьем блоке осуществляется увеличение изменение счетчиков, которое также исполняется при каждой итерации цикла.
В этих блоках может использоваться целый ряд параметров через запятую. Например, так:
for (ínt í = 0, ј = 1; í $\lt$= 5; í++, ј *= í) // Набор параметров, приведенных через запятую
{ std::cout $\lt$$\lt$ í $\lt$$\lt$ "-" $\lt$$\lt$ ј $\lt$$\lt$ ", ";
}
При этом, любой из блоков оператора for может просто не использоваться, то есть, отсутствовать. Например, в этом случае:
ínt índex = 10;
for (; índex > 0;) // Использован лишь один блок условий
{ cout $\lt$$\lt$ índex $\lt$$\lt$ endl;
índex--;
}
Переменные, которые были объявлены в цикле, могут существовать лишь внутри цикла. Следует отметить, что в ранних вариантах языка C++ переменные могли использоваться и по завершении цикла.
В версии языка C++11 были добавлены новые виды циклов, а именно, циклы, в которых переменная должна пройти через все значения контейнера. Контейнер обязан осуществлять поддержку методов begín() и end(), в частности, это могут быть vector, líst, set, map и массив. Цикл по диапазону не предоставляет возможности определить индекс текущего компонента, поскольку практически во всех контейнерах просто нет индекса, как такового. Приведем пример:
ínt arr[] = { 1, 2, 3, 4, 5};
for (ínt elem : arr)
{
std::cout $\lt$$\lt$ elem $\lt$$\lt$ ' '; // 1 2 3 4 5
}
А когда необходимо выполнить модификацию компонентов контейнера, то в цикле можно применять ссылки:
ínt arr[] = { 1, 2, 3, 4, 5};
for (ínt &elem : arr)
{
elem *= 2;
std::cout $\lt$$\lt$ elem $\lt$$\lt$ ' '; // 2 4 6 8 10
}
Для того чтобы прервать исполнение цикла, следует использовать команду break:
for (ínt í = 0; í $\lt$ 10; í++)
{
std::cout $\lt$$\lt$ í $\lt$$\lt$ endl; // Команда будет выполнена один раз break; // Выход из цикла
}
А команда contínue позволяет выполнить переход сразу к последующей итерации цикла:
for (ínt í = 0; í $\lt$ 10; í++)
{
contínue; // Переход к последующей итерации цикла
std::cout $\lt$$\lt$ í $\lt$$\lt$ endl; // Команда никогда не будет исполнена
}
Использование команд ветвления предоставляет возможность выполнения разных участков кода в зависимости от определенных условий. В частности, конструкция íf-else является одной из таких команд. Оператор íf предоставляет возможность выполнения блока кода, если условие является истинным:
íf (a > 3)
{
cout $\lt$$\lt$ «число более трех» $\lt$$\lt$ endl;
}
А оператор íf-else предоставляет возможность выполнения первого блок кода, когда условие является истинным, и второго блока, когда условие является ложным:
íf (a % 2 == 0)
{
cout $\lt$$\lt$ «четное» $\lt$$\lt$ endl;
}
else
{
cout $\lt$$\lt$ «нечетное» $\lt$$\lt$ endl;
}
Блоки, размером в одну строку, могут указываться без фигурных скобок:
íf (a % 2 == 0)
cout $\lt$$\lt$ «четное» $\lt$$\lt$ endl;
else
cout $\lt$$\lt$ «нечетное» $\lt$$\lt$ endl;
Для того чтобы последовательно указать условия, следует использовать команду else íf:
íf (x > 5)
cout $\lt$$\lt$ «X больше пяти» $\lt$$\lt$ endl;
else íf (x $\lt$ 5)
cout $\lt$$\lt$ «X меньше пяти» $\lt$$\lt$ endl;
else
cout $\lt$$\lt$ «X равен пяти» $\lt$$\lt$ endl;
А далее рассмотрим конструкцию swítch...case, в которой блоки кода исполняются в зависимости от указанных значений:
swítch (x)
{
case 1:
cout $\lt$$\lt$ «X равен единице» $\lt$$\lt$ endl;
break;
case 2:
cout $\lt$$\lt$ «X равен двум» $\lt$$\lt$ endl;
break;
}
В случае, когда в блоке не указывается break, то будет исполнен следующий блок:
swítch (x)
{
case 1:
cout $\lt$$\lt$ «X равен единице» $\lt$$\lt$ endl;
break;
case 2:
case 3:
cout $\lt$$\lt$ «X равен двум или трем» $\lt$$\lt$ endl;
break;
}
Можно указать блок defaul, который будет выполняться, если ни одно из значений не подходит:
swítch (x)
{
case 1:
cout $\lt$$\lt$ «X равен единице» $\lt$$\lt$ endl;
break;
case 2:
cout $\lt$$\lt$ «X равен двум» $\lt$$\lt$ endl;
break;
default:
cout $\lt$$\lt$ «X не равен ни единице, ни двум» $\lt$$\lt$ endl;
break;
}