Что такое блок ассоциированный с оператором
Что такое блок ассоциированный с оператором
Следующий «слой» конструкций языка программирования – операторы. Они создают то, что в обыденном сознании ассоциируется с понятием алгоритм – описание последовательности действий, выполняемых программой, или логика ее работы. Это, в свою очередь, ассоциируется с понятием «блок-схема», что, в целом, довольно близко к истине. На этом уровне языки программирования проявляют завидное единообразие, поскольку количество видов управляющей логики программы ограничено. В Си/Си++ реализован общий для большинства языков программирования «джентльменский набор» управляющих конструкций:
· линейная последовательность действий ;
· условная конструкция (если-то-иначе);
· конструкция повторения (цикл) ;
· переход (и его разновидности).
Сразу же отметим, что этот набор является функционально избыточным, и для записи любого алгоритма достаточно только три вида.
· элементы блок-схемы соответствуют основным компонентам системы команд компьютера с размещением программы в линейной памяти (см. 1.2) – командам обработки данных, проверки условий и безусловных (условных) переходов;
· блок-схемы являются естественным инструментом технологии «исторического» программирования, базирующейся на развертке процесса выполнения проектируемой программы во времени (см. 3.2).
Блок-схема содержит элементы трех видов:
Принцип вложенности и структурированные блок-схемы
Рис.15.1. Структурированные конструкции и блок-схема
Операторы линейной последовательности действий
for (i=0; i // Обычный цикл
for (i=0; A[i]!=0 && i // Цикл с пустым оператором
Рис.15.2. Линейная последовательность операторов
В соответствии с принципом вложенности элементами последовательности могут быть не только элементарные действия (простые операторы), но и вложенные синтаксические конструкции, которые на текущем уровне также выполняются последовательно друг за другом.
В Си используется другой принцип: если составной частью управляющей конструкции является единственный оператор, то он никак синтаксически не выделяется. Если же составной частью является последовательность операторов, то она заключается в фигурные скобки ( <>) и образует блок.
Условные операторы
Единственный условный оператор имеет две разновидности: с else и без него.
Операторы цикла
for (i=0; i тело цикла для i…
Операторы перехода
· оператор генерации исключения throw используется в Си++ как средство обработки ошибок, выполняя, в том числе, и действия, эквивалентные оператору return (см. 12.2)
for (i=0; i m1: i++) // иллюстрация выполнения continue, break, return
if (A[i]==0) continue; // goto m1;
if (A[i]==-1) return; // goto m2;
if (A[i] break; // goto m3;
Оператор switch
case 1: n=n+2; break; // m1: n=n+2; goto mend;
case 2: n=0; break; // m2: n=0; goto mend;
case 4: n++; break; // m4: n++; goto mend;
default: n=-1; // mdef: n=-1;
sign=0; // Ветвь для значения c, равного ‘+’,
case ‘-‘: sign=1; // для значения ‘-‘
Еще один «джентльменский набор»
Набор управляющих конструкций алгоритма может быть различным и избыточным. Но минимально необходимой является триада: для архитектурно-ориентированной логики – это действие, условие, переход. Структурированные конструкции – последовательность, выбор (ветвление), повторение (цикл) – также обладают необходимой полнотой. Но на практике встречается еще одна, довольно экзотическая триада: последовательность, ветвление и рекурсия. Являясь технологическим приемом программирования (см. 7.1), она способна, как минимум, заменить конструкцию повторения (цикл). Существуют языки программирования (ПРОЛОГ), а также математические формализмы (формальные грамматики, частично-рекурсивные функции), опирающиеся на эту триаду.
Технология структурного программирования
Функциональное программирование (ПРОЛОГ), представление синтаксиса в формальных грамматиках (трансляторы), частично-рекурсивные функции (теория алгоритмов)
Подводные камни
Особенность синтаксиса Си состоит в том, что последовательности управляющих конструкций, отличающиеся буквально на один символ, могут быть синтаксически правильными, но давать различные последовательности выполнения действий в программе. Это касается, прежде всего, тела цикла, где обнаруживается максимальное количество ошибок программирования (но то же самое можно отнести и к составным частям условного оператора). Итак, тело цикла может иметь четыре различных варианта реализации :
· простой (первичный) оператор – выражение, ограниченное символом «;»;
· единственный оператор, имеющий произвольную внутреннюю структуру своего тела – условный, цикл, переключатель;
· составной оператор – блок, содержащий последовательность операторов, объединенную скобками « <>».
Отсюда следует, что символ «точка с запятой» нельзя расставлять «для надежности», он может выступить в качестве пустого оператора, отрезав заголовок цикла от его настоящего тела. Аналогично, при усложнении тела цикла в процессе модификации программы (вместо одного оператора – последовательность из нескольких) не нужно забывать объединять получающиеся последовательности в блоки. Иначе к телу цикла будет отнесен только первый из них.
for (int s=0,i=0; i // Сорок раз по разу
for ( int s =0, i =0; i i ++) ; // Ни разу сорок раз
s = s + A [ i ]; // Один раз – после (со значением A [40] вне массива)
Урок №47. Блоки стейтментов (составные операторы)
Обновл. 13 Сен 2021 |
На этом уроке мы рассмотрим блоки стейтментов в языке С++.
Блоки стейтментов
Блоки стейтментов (или «составные операторы») — это группа стейтментов, которые обрабатываются компилятором как одна инструкция. Блок начинается с символа < и заканчивается символом >, стейтменты находятся внутри. Блоки могут использоваться в любом месте, где разрешено использовать один стейтмент. В конце составного оператора точка с запятой не ставится.
Вы уже видели пример блоков при написании функций, поскольку тело функции является блоком:
Вложенные блоки
Хотя функции не могут быть вложены в другие функции, блоки могут быть вложены в другие блоки:
При использовании вложенных блоков, блок, который содержит внутри себя другой блок, называется внешним блоком, а тот, который содержится внутри этого блока — внутренний/вложенный блок.
Блоки и операторы if
Enter an integer: 3
3 is a positive integer (or zero)
Double this number is 6
Количество уровней вложенности блоков
Можно даже размещать вложенные блоки внутри других вложенных блоков:
Уровень вложенности функции (или «глубина вложенности функции») — это максимальное количество блоков, которые могут находиться в любой точке функции (включая внешний блок). В вышеприведенной функции main() есть 4 блока, но уровень вложенности равен 3.
По факту, ограничений на количество вложенных блоков нет. Однако не рекомендуется делать больше 3 уровней вложенности (максимум 4). Если ваша функция нуждается в большем количестве уровней вложенности, то эту функцию лучше разбить на несколько подфункций!
Заключение
Блоки стейтментов позволяют выполнить сразу несколько стейтментов там, где можно использовать лишь один. Они чрезвычайно полезны, когда нужно выполнить сразу несколько инструкций вместе.
Поделиться в социальных сетях:
Программные блоки циклов и алгоритмических структур
Управление операторами Lego Education EV3
В оранжевой закладке палитры редактора Lego EV3 находятся блоки «Управление операторами». Это алгоритмические структуры, без которых невозможно создавать программы. С их помощью происходит запуск кода, переключение, прерывание, зацикливание и прочее. Еще их называют блоками последовательности действий. В верхней части пиктограмм расположена узкая оранжевая горизонтальная полоса.
блоки управления операторами Lego Education EV3
Всего во вкладке «Управление операторами» находится пять иконок слева направо:
«Начало»
Он всегда расположен в начале и служит для запуска программы на выполнение. На пиктограмме изображена стрелка зеленого цвета. Без него код работать не будет и другие значки не будут активными. В окне редактора если значка «Начало» нет или он не соединен с другими, остальные фрагменты программы выглядят немного замутненными.
программный блок «Начало»
Если добавить еще одну или несколько пиктограмм «Начало» в окно редактора Lego, то можно создать несколько параллельных программ, работающих независимо друг от друга. При отладке каждую подпрограмму можно запустить отдельно. Но при запуске на выполнение все параллельные ветки работают одновременно и автономно.
«Ожидание»
На значке нарисованы песочные часы. С помощью ожидания можно ждать наступления какого-нибудь события. Если это событие наступит, то происходит переход программы к другой части.
Всего есть тринадцать вкладок с типами сенсоров, кнопками, счетчиками и т.д. в блоке ожидания EV3:
У каждой закладки есть режимы сравнения, изменения или обновления, которые имеют свои подпункты. В целом это мощный инструмент, позволяющий создавать сложные программы, зависящие от конкретных условий.
Для того чтобы повторить нужную последовательность кода определенное число раз при соблюдении нужных условий в редакторе Lego Education EV3 предусмотрен программный блок. Фактически он представляет собой контейнер с визуальным кодом. Проверка условий происходит после однократного выполнения кода. Конструкция «Цикл» является алгоритмической структурой типа «while» с постусловием.
Фрагмент программы внутри контейнера будет повторяться. Блоки, не входящие в него повторяться не будут. По завершению произойдет переход к следующим блокам, которые не входят в цикл. Иконка цикла расположена третьей по счету слева во вкладке «Управление операторами». Управление режимами находится в правом нижнем углу пиктограммы.
программный блок «Цикл» Lego Mindstorms-EV3
Всего есть шестнадцать закладок. Тринадцать из них такие же, как и у блока «Ожидание». Добавлены еще три пункта:
В левой части иконки расположен вывод «Параметры цикла». С его помощью можно выполнить подсчет числа повторений, времени, логического значения, типов сравнения, порогового значения и прочее. Введенное значение зависит от заданного режима или от переданного по шине данных значения от выводов других блоков.
Циклы можно вкладывать друг в друга. Если в конструкцию добавляются фрагменты, то размер значка увеличивается. Также размер пиктограммы можно изменять с помощью маркеров, находящихся на границах изображения. Это очень похоже на изменения размера картинки в документе Word.
«Переключатель»
Находится четвертым слева в оранжевой закладке алгоритмических структур. По сравнению с циклом у него на одну вкладку меньше. Отсутствует пункт «Неограниченный». Он соответствует конструкции «if»… «else» или «если»… «то».
блок «Переключатель» Lego EV3
«Переключатель» может включать в себя 2 и более последовательности блоков. Эти последовательности называют вариантами. В зависимости от выбранной закладки определяется входное значение сенсора или какого-нибудь параметра. Исходя из входного параметра запускается только один из возможных вариантов.
Если нужно чтобы проверка вариантов выполнялась несколько раз, «Переключатель» нужно поместить в циклический блок.
«Прерывания цикла»
Это последний пятый значок во вкладке «Управление операторами». Он предназначен для завершения циклического блока. Имя прерывания выбирается в верхней части пиктограммы и больше никаких настроек нет.
программный блок «Прерывание цикла»
«Прерывание цикла» можно использовать по условиям, можно прерывать цикл, находящийся в цикле, из другой подпрограммы или ветки. После остановки последовательности начнут выполняться блоки, расположенные после циклического.
Что такое палитра блоков Lego EV3
Операции, операторы и выражения в языке Си (C)
Операции языка СИ (C)
Любое выражение языка состоит из операндов (переменных, констант и др.), соединенных знаками операций. Знак операции — это символ или группа символов, которые сообщают компилятору о необходимости выполнения определенных арифметических, логических или других действий.
Таблица 2 — операции
Знак операции | Назначение операции |
( ) | Вызов функции |
[ ] | Выделение элемента массива |
. | Выделение элемента записи |
-> | Выделение элемента записи |
! | Логическое отрицание |
Поразрядное отрицание | |
— | Изменение знака |
++ | Увеличение на единицу |
— | Уменьшение на единицу |
& | Взятие адреса |
* | Обращение по адресу |
(тип) | Преобразование типа (т.е. (float) a) |
sizeof( ) | Определение размера в байтах |
* | Умножение |
/ | Деление |
% | Определение остатка от деления |
+ | Сложение |
— | Вычитание |
> | Сдвиг вправо |
Больше, чем | |
>= | Больше или равно |
= = | Равно |
!= | Не равно |
& | Поразрядное логическое «И» |
^ | Поразрядное исключающее «ИЛИ» |
| | Поразрядное логическое «ИЛИ» |
&& | Логическое «И» |
|| | Логическое «ИЛИ» |
?: | Условная (тернарная) операция |
= | Присваивание |
+=, — =, *=, /=, %=, >=, &=, |=, ^= | Бинарные операции (например, а *= b (т.е. a = a * b) и т.д.) |
, | Операция запятая |
Оператор в языке Си (C)
Для исключения путаницы в понятиях «операция» и «оператор», отметим, что оператор — это наименьшая исполняемая единица программы. Различают операторы выражения, действие которых состоит в вычислении заданных выражений (например: a = sin(b)+c; j++;), операторы объявления, составные операторы, пустые операторы, операторы метки, цикла и т.д. Для обозначения конца оператора в языке СИ (C)используется точка с запятой.
Что касается составного оператора (или блока), представляющего собой набор логически связанных операторов, помещенных между открывающей (<) и закрывающей (>) фигурными скобками («операторными скобками»), то за ним точка с запятой не ставится. Отметим, что блок отличается от составного оператора наличием определений в теле блока.
Характеристика основных операций языка Си (C)
Охарактеризуем основные операции языка СИ (C).
Операция присваивания
Сначала рассмотрим одну из них — операцию присваивания (=). Выражение вида
присваивает переменной х значение переменной у. Операцию «=» разрешается использовать многократно в одном выражении, например:
Различают унарные и бинарные операции. У первых из них один операнд, а у вторых — два. Начнем их рассмотрение с операций, отнесенных к первой из следующих традиционных групп:
Логические операции
a = 1111 0000,
a > 1 = 0000 0111,
a & b = 0000 1000,
a ^ b = 1000 0111,
a | b = 1000 1111.
В языке предусмотрены две нетрадиционные операции инкремента (++) и декремента (—). Они предназначены для увеличения и уменьшения на единицу значения операнда. Операции ++ и — можно записывать как перед операндом, так и после него. В первом случае (++n или —n) значение операнда (n) изменяется перед его использованием в соответствующем выражении, а во втором (n++ или n—) — после его использования. Рассмотрим две следующие строки программы:
a = b + c++;
a1 = b1 + ++c1;
Предположим, что b = b1 = 2, c = c1 = 4. Тогда после выполнения операций: a = 6, b = 2, c = 5, a1 = 7, b1 = 2, c1 = 5.
Еще одним отличием языка является то, что выражение вида а = а + 5; можно записать в другой форме: a += 5;. Вместо знака + можно использовать и символы других бинарных операций (см. табл. 2).
Другие операции из табл. 2 будут описаны в последующих параграфах.
Операторы цикла
Циклы организуются, чтобы выполнить некоторый оператор или группу операторов определенное число раз. В языке СИ (C)три оператора цикла: for, while и do — while. Первый из них формально записывается, в следующем виде:
for (выражение_1; выражение_2; выражение_3) тело_цикла
Тело цикла составляет либо один оператор, либо несколько операторов, заключенных в фигурные скобки < … >(после блока точка с запятой не ставится). В выражениях 1, 2, 3 фигурирует специальная переменная, называемая управляющей. По ее значению устанавливается необходимость повторения цикла или выхода из него.
Выражение_1 присваивает начальное значение управляющей переменной, выражение_З изменяет его на каждом шаге, а выражение_2 проверяет, не достигло ли оно граничного значения, устанавливающего необходимость выхода из цикла.
Что такое блок ассоциированный с оператором
Операторы – это конструкции, предназначенные для организации действий, более сложных, чем вычисление новых значений. Эти действия сводятся к нескольким основным категориям:
1. Создать новое имя для дальнейшего использования в программе (объявление);
2. Вычислить значение некоторого выражения и дать ему одно из предусмотренных в программе имен, сохранив это значение для использования в будущем (присваивание);
3. Установить последовательность, в которой должны исполняться другие действия (управление).
Кроме того, в языках программирования должны быть предусмотрены средства чтения исходных данных и записи результата, которые могут быть реализованы как при помощи операторов, так и при помощи специализированных функций.
Правильные совокупности операторов образуют программы.
К объявлениям в языках программирования возможен различный подход. Они могут трактоваться либо как операторы (С++), либо как специальные конструкции, предназначенные для создания нового имени. Рассматриваемые языки демонстрируют оба подхода.
Оператор присваивания присваивает переменной, стоящей в левой его части, выражение, стоящее в правой. Левую и правую части оператора присваивания разделяет знак присваивания. В ходе выполнения оператора присваивания могут выполняться преобразования типов как при вычислении выражения, так и при присваивании вычисленного значения, переменной, стоящей в левой части.
Управляющие операторы – это:
где М – множество, x – параметр.
условие N : действие N
действие1; действие2; … ; действие N-1 ; действие N
Что такое « помеченный оператор », « оператор выражения », и « try-блок »? Почему объявление (и определение) объектов оказалось оператором? И куда делся оператор присваивания?
Приведём (усечённый) синтаксис оператора определения:
В заключение уточним используемые понятия.
— Тип определяет набор возможных значений и операций, выполняемых над объектом.
— Определение — объявление, выделяющее память для объекта.
Выражения являются основными строительными конструкциями программ. Выражение вычисляет определенное значение на основе некоторого количества операндов. Простейшее выражение представляет собой обычную литеральную константу, например ‘а’, З.14 или «Norah». Имена переменных также являются выражениями. Вспомним, что переменная – это объект. имеющий имя.
Комбинируя выражения с помощью операций, можно создавать более сложные выражения.
Если закончить выражение символом «;», получим оператор выражения:
Операция присваивания, присутствующая в операторе выражения, превращает этот оператор в оператор присваивания. В выражении может быть несколько операций присваивания, в этом случае они выполняются в порядке «справа налево» (ассоциативность этой операции «справа налево»). Ассоциативность операций приведена в таблице приоритетов.
Заметим, что оператор выражения может состоять только из ;. В этом случае он называется пустым.
Рассмотрим частный случай выражения – константное выражение.
constexpr double pi = 3.14159;
pi = 7; // ошибка: присваивание значения константе
int v = 2 * pi/r; // верно: используется, но не изменяется
Такие константы полезны для повышения удобочитаемости программ. Конечно, можно догадаться о том, что константа 3,14159 является приближением числа «пи», чего нельзя сказать о других менее распространённых константах. Кроме того, если потребуется изменить программу так, чтобы число «пи» было записано с точностью до 12 десятичных знаков, то, во-первых, придётся искать это число по всему тексту программы, во-вторых, если кто-нибудь неожиданно решил аппроксимировать число «пи» дробью 22/7, то, скорее всего, оно не будет найдено. Намного лучше изменить определение константы pi, указав требуемое количество знаков.
constexpr double pi = 3.14159265359;
Следовательно, в программах предпочтительнее использовать не литералы (за исключением самых очевидных, таких как 0 и 1 ), а применять константы с информативными именами.
Для ситуаций. когда значение «переменной» инициализируется значением, которое неизвестно во время компиляции, но после инициализации остается неизменным. С++ предлагает вторую разновидность констант (cons t):
constexpr int шах 100;
constexpr int cl = max+7; // правильно: cl равно 107
const int с2 = n+7; // правильно, но не пытайтесь
// изменять значение с2
с2 = 7; // ошибка: с2 является const
Как видно из предыдущего, введена концепция назначения рангов целочисленным типам. Вкратце, как можно ожидать, базовые ранги для целочисленных типов со знаком, от большего к меньшему, выглядят следующим образом:
Беззнаковые типы имеют те же самые ранги, что и соответствующие им типы со знаком. Три типа — char, signed char и unsigned char — имеют один и тот же ранг. Тип bool имеет наименьший ранг. Типы wchar_t, charl6_t и char32_t имеют те же ранги, что и типы, лежащие в их основе.
Составной оператор (или «блок») необходим в том случае, когда синтаксис языка предусматривает только один оператор, семантически же требуется несколько.
Как видим, составной оператор может быть и пустым (состоящим только из фигурных скобок).
Составной оператор определяет область видимости блока. Это означает, что все объекты, объявленные в блоке, доступны только внутри этого блока.
4. Операторы повторения
Операторы повторения – это средства для многократного повторения действий. Попробуем сформулировать общую стратегию повторения (цикла). Эта стратегия полезна, когда задача сводится к следующей постановке. Мы начинаем с некоторого начального свойства Pre, и нам требуется достичь выполнения некоторой цели Post, характеризующей множество данных DS. Это множество конечно, хотя и может быть очень большим. Чтобы использовать цикл, нужно найти слабую (более общую) форму цели Post: свойство INV(s) – инвариант цикла, определенный на подмножествах s из DS со следующими свойствами.
L1. Можно найти начальное подмножество Init из DS, такое, что начальное условие Pre влечет INV(Init); другими словами, инвариант выполняется на начальном подмножестве.
L2. INV(DS) влечет Post (из истинности инварианта на всем множестве следует истинность цели).
L3. Известен способ, позволяющий расширить подмножество s, для которого инвариант INV(s) выполняется, на большее подмножество (s¢) из DS, сохраняя при этом истинность инварианта.
В общем случае нужно крайне тщательно проектировать инвариант, чтобы он позволял применить стратегию последовательной аппроксимации(приближения).
— INV должен быть достаточно слабым, чтобы его можно было применить к некоторому начальному подмножеству, обычно содержащему совсем немного элементов из всего множества.
— Он достаточно силен, чтобы из него следовала цель Post, когда он выполняется на всем множестве.
— Он достаточно гибкий, чтобы позволять расширять множество, сохраняя его истинность.
Начав с начального подмножества и повторяя расширения, мы придем к желаемому результату. Эта стратегия последовательной аппроксимации цели на прогрессивно растущих подмножествах может требовать большого числа итераций, но компьютеры быстры, и они не бастуют, требуя покончить с однообразной работой.
Эти наблюдения определяют, как работает цикл в качестве структуры управления. Его выполнение проходит следующие этапы.
X1. Устанавливается INV(Init), используя преимуществ L1. Это дает нам Init как первое подмножество s, на котором выполняется INV.
X2. До тех пор, пока s не совпадает со всем множеством DS, применяется прием L3 для установления INV на новом, расширенном s.
X3. Останавливаемся сразу же, когда s совпадает с DS. В этот момент INV выполняется на DS, что, благодаря L2, свидетельствует о достижении цели Post.
Этот процесс гарантирует завершаемость, поскольку мы предполагаем, что DS является конечным множеством, s всегда остается подмножеством DS и на каждом шаге увеличивается по крайней мере на один элемент, так что гарантируется, что после конечного числа шагов s совпадет с DS. В некоторых случаях, однако, установление завершаемости не столь просто.
В языке программирования С++ предусмотрено два оператора повторения с предусловием, оператор повторения с постусловием и оператор повторения с параметром. Обычно операторы повторения называют операторами цикла.
a. Оператор повторения с предусловием while
Таким образом, условие представляет собой либо выражение, либо объявление с инициализацией (здесь объявление с инициализацией, в отличие от оператора объявления, не содержит ;). Заметим, что если условие оператора while является объявлением с инициализацией, область видимости объявленной переменной простирается от точки объявления до конца оператора while.
Порядок выполнения оператора следующий:
Шаг 1. Вычисляется значение условия.
Шаг 2. Если это значение ложно, выполнение оператора завершается (то есть).
Шаг 3. Если значение условия истинно, выполняется оператор и происходит переход к шагу 1.
Заметим, что значение условия должно быть приводимым к логическому значению.
Поскольку проверка выполняется перед каждым выполнением оператора, оператор может не выполняться ни разу.
И, наконец, так как синтаксис оператора while допускает повторения только одного оператора, для повторения нескольких операторов необходимо объединить их в один составной.
Оператор while в форме while (T t = x) оператор
эквивалентен следующей конструкции:
> // конец области видимости условия
Переменная, созданная в условии, уничтожается и создается заново на каждой итерации цикла.
В этой задаче исходными данными является n – количество слагаемых. Для получения решения нужно организовать повторяющийся процесс, который на каждом шаге состоит в добавлении к сумме очередного слагаемого. Таким образом, можно сформулировать инвариант цикла: на i-ом шаге результат представляет собой сумму i слагаемых. Соответственно, на n-ом шаге будет вычислена сумма n слагаемых.
using namespace std;
cout ² Input integer n > 0\n ² ;
double s = 1; // здесь будет храниться результат
s += 1./i; // результат должен быть вещественным
M1. Если Pre выполняется (имеется хотя бы одно число), то нам известно начальное множество Init, такое, что INV(Init) выполняется. Для этого достаточно в качестве подмножества взять первый элемент 1.
M2. INV(DS) – инвариант, применимый ко всему подмножеству <1,1/2,1/3. 1/i > – влечет истинность цели, а фактически совпадает с целью Post.
b. Оператор повторения с предусловием for
Оператор цикла с предусловием for эквивалентен следующей конструкции:
Приведём решение предыдущей задачи, используя оператор for:
using namespace std;
cout ² Input integer n > 0\n ² ;
double s = 1; // здесь будет храниться результат
for (int i = 2 ; i = n ; i++)
s += 1./i; // результат должен быть вещественным
c. Оператор цикла с постусловием
В цикле с постусловием do-while оператор (в теле цикла) выполняется до тех пор, пока значение условия не станет ложным. Проверка выполняется после каждого выполнения этого оператора, а значит, хотя бы один раз оператор будет выполнен.
Дополним предыдущий пример, гарантированно обеспечив количество слагаемых в вычисляемой сумме больше нуля. В предыдущем примере выводится соответствующее сообщение, которое с лёгкостью может быть проигнорировано.
using namespace std;
cout ² Input integer n > 0\n ² ;
double s = 1; // здесь будет храниться результат
for (int i = 2 ; i = n ; i++)
s += 1./i; // результат должен быть вещественным
d. Оператор цикла с параметром
Этот оператор применим для различного рода коллекций, поэтому будет рассмотрен позже.
5. Выбирающие операторы
Рассмотрим, как C++ позволяет с помощью выбирающих операторов принимать решения относительно выполнения одного из альтернативных действий.
::= if ( ) [ else ]
switch ( )
a. Условный оператор
Рассмотрим программу преобразования дюймов в сантиметры и наоборот. Суффикс ‘ i ‘ или ‘ с ‘ означает единицу измерения на входе
using namespace std;
const dou b le c m_ per_inch = 2.54 ; // сантиметров в дюйме
dou b le lenqth = 1; // длина (дюймы или см)
cout “ Пожалуйста, введите длину “
“ и единицу измерения ( с или i): \n “ ;
c m_ per_inch*lenqth “ с m \n ” ;
const double cm_per_inch = 2.54; // см в дюйме
double lenqth = 1; // длина (дюймы или см)
cout Пожалуйста, введите длину ”
“и единицу измерения ( с или i): \n”;
cout Извините, я не знаю, что такое “
В этой версии программы реализован выбор не из двух, а из трёх вариантов. Этот выбор удалось реализовать с помощью условного оператора (точнее, с помощью вложенного условного оператора), при этом текущая версия выглядит сложнее предыдущей. Схематично, текущая версия выглядит следующим образом:
Но такую схему с любым количеством альтернатив проще и понятнее можно реализовать с помощью выбирающего опер атора второго типа. Однако металингвистическая формула для описания синтаксиса этого оператора не даёт очевидной инструкции для организации множественного выбора. Чтобы это получилось, разберёмся, что же такое «помеченный оператор».
case константное выражение > : оператор > |
const double cm_per_inch = 2.54; // см в дюйме
double lenqth = 1; // длина (дюймы или см)
cout Пожалуйста, введите длину ”
“ и единицу измерения (с или i) :\n”;
default: cout Извините, я не знаю, что такое ‘ “
Значение, указанное в скобках после ключевого слова switch, сравнивается с набором констант. Каждая константа представлена как часть метки case. Если значение равно константе в метке case, то выбирается инструкция из данного раздела case. Каждый раздел case завершается ключевым словом break. Если значение не соответствует ни одной метке case, то выбирается оператор, указанный в разделе default. Этот раздел не обязателен, но желателен, чтобы гарантировать перебор всех альтернатив.
Заметим, что оператор switch в вышеприведённом примере полностью отвечает синтаксису, приведенному в начале раздела. Оператор представляет собой составной оператор, компонентами которого являются операторы, помеченные метками case и default. Именно благодаря помеченным операторам и удаётся организовать множественный выбор.
Рассмотрим детальнее оператор switch.
1. Значение, которое определяет выбор варианта, должно быть только порядкового типа. В частности, выбор по значению string произвести невозможно.
2. Значения меток разделов case должны совпадать с возможными значениями условия оператора switch.
3. Метки двух разделов case не могут иметь одинаковые значения.
4. Один выбор может описываться несколькими метками case.
5. Каждый раздел case (кроме, возможно, последнего) нужно завершать ключевым словом break, чтобы избежать выполнения операторов, помеченных другими метками case.
В этом разделе уместно рассмотреть операцию, которую в языке программирования называют условной или тернарной.
Предположим, нам нужно найти максимальное из двух целых чисел. Эту задачу легко решить, используя условный оператор if:
Если выражение1 истинно, то значением всего условного выражения будет значение выражения2. В противном случае значением всего выражения будет значение выражения3. В обоих примерах результат условной операции присваивается переменной. Напомним, что операция присваивания в выражении имеет самый низкий приоритет.
6. Операторы перехода
Операторы перехода безусловно передают управление.
Операторы break и continue позволяют программе пропускать часть кода. Оператор break можно использовать в операторе switch и в любых циклах. Он вызывает немедленную передачу управления за пределы текущего оператора switch или цикла. Оператор continue применяется только в циклах и вынуждает программу пропустить остаток тела цикла и сразу начать следующую итерацию.
Оператор return завершает выполнение функции. Подробнее об этом операторе в теме «подпрограммы».