Циклы и ветвления в языке C++
Цикл позволяет выполнить заданную последовательность действий несколько раз подряд. Все циклы могут быть вложенными друг в друга.
Цикл с предусловием while
Условие проверяется перед выполнением тела цикла. Если условие ложно, то цикл не выполнится.
Цикл с постусловием do-while
Условие проверяется после выполнения тела цикла. Цикл выполнится как минимум один раз.
Цикл for
Цикл с заранее заданными условиями и количеством итераций.
В цикле for задаются три блока параметров, разделенных точкой с запятой:
- первый блок — это инициализация счетчиков цикла, выполняется только один раз
- второй блок — это проверка условий цикла, выполняется каждую итерацию; тело цикла выполняется, если условия — истинны
- третий блок — изменение счетчиков, также выполняется каждую итерацию цикла.
В блоках можно использовать несколько параметров через запятую.
Любой блок оператора for может отсутствовать.
Переменные, объявленные в цикле, существуют только внутри цикла. В старых версиях языка C++ переменные сохранялись после выхода из цикла.
Цикл по диапазону
В стандарте C++11 появились новые виды циклов — range-based циклы, в которых переменная пробегает по всем значением контейнера. Контейнер должен поддерживать методы begin() и end() — это может быть vector, list, set, map и массив. Цикл по диапазону не дает возможности узнать индекс текущего элемента, так как в большинстве контейнеров не существует индекса, как такового.
Если требуется модифицировать элементы контейнера, то в цикле следует использовать ссылки.
Управление выполнением циклов
Прервать выполнение цикла можно с помощью команды break
С помощью команды continue можно сразу перейти к следующей итерации цикла
Ветвления
Ветвления позволяют выполнять различные участки кода в зависимости от заданных условий.
Конструкция if—else
Оператор if позволяет выполнить блок кода, если условие истинно.
Оператор if-else позволяет выполнить первый блок кода, если условие истинно, и второй блок, если условие ложно.
Однострочные блоки можно указывать без фигурных скобок
Последовательное указание условий можно сделать через конструкцию else if.
Конструкция switch. case
Блоки кода выполняются в зависимости от указанных значений
Если в блоке не указан break, то будет выполнен следующий блок
Может быть указан блок defaul, выполняющийся если ни одно из значений не подошло
В блоке case может объявляться переменная без инициализации
Если требуется объявить и инициализировать переменные внутри блока case, то можно использовать вложенный блок кода
Программируем просто
Циклы for обычно используются когда есть конкрентое понятие — счетчик итераций, и мы знаем сколько раз должно выполниться тело цикла. Как раз дя этого и есть 3 секции. В других случаях используются оставшиеся циклы. К примеру бесконечный цикл в языке Си выглядит так:
Также существуют операторы перехода — break, continue, return, goto
break — завершает выполнение цикла.
continue — выполняет переход в конец тела цикла(то есть после выполнения этого оператора, все что после него игнорируется, происходит переход в конец цикла, и далее начинается новая итерация). В примере ниже, цикл бесконечный, так как при выполнении условия i>2 происходит переход в конец тела цикла, то есть игнорируется увеличение счетчика, а условием выхода из цикла является i==11.
return — завершает выпонение не то что цикла, а целой функции. Если функция типа void то нужно вызвать просто return; иначе вернуть выражение того типа каким является тип функции.
goto — оператор перехода, использование которого я крайне не рекомендую, если на это нет серьезных причин. Причина в том, что использование этого оператора, без веских на то оснований, может затруднять чтение исходного кода программы, затрудняет его понимание, и т.д. что приводит к ошибкам.
Переход осуществляется в рамках одной функции, из одной функции перейти в другую с помощью goto нельзя. Ниже можете ознакомится с циклом for и его аналогом с помощью оператора goto:
C++ — Урок 004. Условия и циклы
C++ предоставляет стандартный набор операторов для условий выбора и циклов.
Ключевыми словами, относящимися к конструкциями условий ветвления кода, являются:
- if
- else
- switch
- case
- break
- default
Ключевыми словами, относящимися к конструкциям циклов, являются:
- do
- while
- break
- continue
- for
- 1. Операторы условий
- 1. Оператор if
- 2. Оператор else
- 3. Операторы switch, case, break, default
- 1. Оператор while
- 2. Оператор do
- 3. Оператор break
- 4. Оператор continue
- 5. Оператор for
Операторы условий
Оператор if
Конструкция условия с использованием оператора if формируется следующим образом:
В данном случае условие помещено в скобках после оператора if. В данной конструкции код return true; будет выполняться в том случае, если x будет больше 0. следующая строка return false; уже не относится к коду который будет выполняться при выполнении условия. В конструкциях условия при выполнении данного условия будет выполняться только одна строка кода, если код не обрамлён в фигурные скобки, то есть если не сформировано тело кода выполняемого при условии. Рассмотрим два варианта кода:
Первый вариант:
В данном коде return true; будет выполняться всегда, поскольку к коду выполняемому при условии относится только строка x = 0;
Второй вариант:
В данном коде return true; будет выполняться только при выполнении условия x > 0 .
Оператор else
Оператор else используется совместно с оператором if для формирования последовательности условий.
Оператор else может использоваться как для добавления нового условия, если не выполнилось предыдущее условие — конструкция else if. Так и в качестве завершающего кода в последовательности условий, если предыдущие условия не выполнились. Также возможен вариант без применения фигурных скобок для тела кода в том случае, если код умещается в одну строку.
Операторы switch, case, break, default
Конструкция switch case используется для выбора ветвления кода, в условии которого применяется выбор по целочисленным значениям. Это означает, что switch case может применяться для просто целочисленных значений, перечислений и выбора по коду символа.
В выше представленном коде переменная x проверяется на равенство числам 0, 50, 100. Оператор default выполняет выбор кода, который выполняется в том случае, если ни одно из условий не подошло. Заметьте также, что в блоке кода с case 50: добавлен оператор break , этот оператор выполняет выход из условия, тогда как оператор return выполняет выход из функции. Если не добавлять оператор break, то выполнение кода продолжится и в блоке case 100: . Благодаря этой особенности конструкции switch case имеется возможность объединения условий, для которых необходимо выполнить один и тот же код. Например:
Таким образом для x равного 0, 50, 100 функция вернёт true, тогда как для всех остальных значений функция будет возвращать false.
Также код для выбора case в этой конструкции можно оборачивать в блоки кода, что позволит ограничить область видимости и использовать объявление переменных с одинаковыми именами.
Таким образом, ограничив область видимости, мы получаем возможность использовать переменные с одинаковыми именами в условиях case. Но не забывайте, что за пределами области видимости, ограниченной фигурными скобками переменная y в данном случае существовать не будет.
Операторы циклов
Оператор while
Оператор while повторяет код в своём теле до тех пор, пока выполняет условие. Например:
В данном коде i будет равно 10 после выполнения цикла.
Оператор do
Оператор do используется совместно с оператором while и позволяет выполнить тело цикла хотя бы один раз, до того, как будет выполнена проверка условия цикла. Например:
В данном коде переменная I изначально не соответствует условию и в обычном цикле while код тела цикла не выполнился, но поскольку здесь используется do-while цикла, то проверка будет произведена после выполнения тела цикла. В результате вывод std::cout будет следующим:
Вы можете спросить, почему в выводе присутствует 0? Ведь это не подходит по условию. Опять же из-за того, что проверка выполняется после выполнения кода в теле цикла. То есть выполнилось тело цикла, а потом уже выполнилась проверка, по результату которой цикла завершает свою работу.
Оператор break
Как и в конструкции switch case, в циклах может использоваться этот оператор. Это необходимо для того, чтобы выйти из цикла, раньше, чем выполнится условие цикла. Например:
В данном искусственном примере получился бы вечный цикл из-за того, что переменная i уменьшается вместо увеличения, а по условию цикла выход будет произведён только в том случае, если i будет больше 50. Но благодаря оператору break и условию проверки на отрицательное значение переменной i выполнение программы выйдет из этого цикла, как только i станет меньше 0.
Оператор continue
Данный оператор позволяет прервать итерацию цикла и начать новую итерацию цикла до выполнения всего кода в теле цикла. Например:
При выполнении данного кода мы получим следующий вывод:
То есть вывод числа 3 будет пропущен.
Оператор for
Циклы с оператором for позволяют объединить инициализацию переменных, условие и изменение этих переменных.
То есть следующий цикл while
Будет эквивалентен следующему циклу for:
Плюсом данного цикла for будет в том, что переменная I будет в локальной области видимости цикла for.
Циклы for могут инициализироваться несколькими переменными одного типа. Например:
Также условие может быть объявлением, инициализацией переменной. Например:
Учитывая стандарт C++11, в качестве типа переменной может использоваться оператор auto , который позволяет выводить тип переменной из инициализатора:
Также интересным моментом является то, что инициализатором, условием и блоком изменения может быть выражение:
Начиная со стандарта C++11, для циклов for добавлена возможность итераций по контейнерам, поддерживающим итерацию. Например, контейнер vector из стандартной библиотеки: