Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР6-С++-27 марта-2012.doc
Скачиваний:
17
Добавлен:
28.08.2019
Размер:
6.55 Mб
Скачать

1.3. Разветвляющийся вычислительный процесс

Как вы уже знаете из предыдущих работ, программа представляет собой последовательность инструкций (операторов), выполняемых компьютером для реализации определенных задач. Все созданные вами до сих пор простые программы на C++ выполняли операторы по порядку, начиная с первого до конца программы.

Обычно операторы в программе на С++ выполняются в порядке их следования в программе (см. лабораторную работу № 5), то есть слева направо и сверху вниз. Такой порядок выполнения операторов принято называть линейным, или ес­тественным. Однако в практике вычислений мало встречается процессов, которые задаются только линейной последовательностью выполнения опера­торов (операций, блоков, этапов и т.п.). Как правило, направление вы­числительного процесса при решении многих задач зависит от исходных данных или промежуточных результатов.

При программировании требуется прерывать естественный порядок вы­полнения операторов, проводить различные проверки отношений между эле­ментами обрабатываемых данных и в зависимости от их исхода выполнять те или иные действия.

При выполнении некоторых операций могут возникать исключительные операции, то есть такие операции, в которых результат операции либо ошибочен, либо не определен. В этих случаях также требуется в зави­симости от исхода операции выполнять ту или иную последовательность действий.

По мере усложнения программ вам потребуется, чтобы выполнялся один набор операторов, если определенное условие соблюдается, и другой набор, если условие не соблюдается.

Другими словами, вам потребуется, чтобы ваши программы приняли решение и соответственно отреагировали.

Вычислительный процесс называется разветвляющимся (РВП), если в зависимости от исходных данных (условий) или промежуточных ре­зультатов он реализуется по одному из нескольких, заранее предусмот­ренных (возможных) направлений. Каждое отдельное направление, по которым может следовать вычислительный процесс, называют его вет­вями.

В каждом конкретном случае вычислительный процесс реализуется по одной ветви, остальные остаются не задействованными. Выбор направле­ния вычислений осуществляется проверкой выполнения некоторого логичес­кого условия. Обычно это логическое условие выражает определенные свойства величин, входящих в расчетные формулы. Выполнение данного ло­гического условия однозначно определяет выбор одной из ветвей вычис­лительного процесса.

Простейшим примером разветвления вычислений может служить формула определения значения абсолютной температуры воздуха на различных высо­тах:

288,16 - 0,0065,

если 0  h < 11000 м,

T =

216,16,

если 11000  h < 25000 м,

216,16 + 0,00276098 (h - 25000),

если 25000  h < 46000 м.

Здесь Т - абсолютная температура воздуха; h - высота над уров­нем моря.

В приведенном выше примере вычислительный процесс имеет три направ­ления (ветви). Проверка логического условия для выбора одной из его ветвей состоит в определении диапазона высот, которому соответствует текущее значение переменной h.

1.4. Реализация РВП средствами языка С++

Для реализации РВП все языки программирования пре­доставляют определенные средства. Эти средства состоят из операторов сравнения, логических операторов и собственно операторов управления ходом вычислительного процесса. Операторы управления обеспечивают необходимую последовательность выполнения операторов программы, возможно, отличную от последовательности запи­си операторов в программе. В этом разделе кратко рассматривается неко­торые из подобных средств управления языка С++.

Операторы сравнения

Оператор !=. Не равно. Проверяет неравенство левого и правого операндов.

Оператор ==. Равно. Проверяет, равен ли левый операнд правому.

Оператор <. Меньше чем. Проверяет, меньше ли левый операнд, чем правый.

Оператор >. Больше чем. Проверяет, больше ли левый операнд, чем правый.

Оператор <=. Меньше или равно. Проверяет, меньше или равен левый операнд правому.

Оператор >=. Больше или равно. Проверяет, больше или равен левый операнд правому.

Логические операторы

Оператор AND. Логическое И. Результатом оператора AND (&&) будет значение true только в том случае, если оба его операнда возвращают значение true.

Оператор OR. Логическое ИЛИ. Логический оператор OR ( | | ) возвращает значение true, если любой из его операндов расценивается как значение true.

Оператор NOT. Логическое НЕ. Логический оператор NOT (!) рассматривают свой операнд как условие. Он воз­вращает результат, который имеет логическое значение, противоположное его опе­ранду.

Побитовые операторы

Оператор ~. Побитовый оператор NOT (НЕ). Инвертирует биты своего операнда.

Оператор &. Побитовый оператор AND (И). Создает новое целочисленное значение, в кото­ром каждая битовая позиция имеет значение 1, если оба операнда в этой позиции имеют значение 1. В противном случае бит получает значение 0.

Оператор |. Побитовый оператор OR ИЛИ). Создает новое целочисленное значение, в котором каждая битовая позиция имеет значение 1, если любой из операндов содержит значение 1 в этой битовой позиции. В противном случае бит получает значение 0.

Оператор ^. Побитовый оператор XOR (исключающее ИЛИ). Создает новое целочисленное зна­чение, в котором каждая битовая позиция имеет значение 1, если любой (но не оба) из опе­рандов содержит значение 1 в этой битовой позиции. В противном случае бит получает значение 0.

Оператор <<. Побитовый оператор сдвига влево. Сдвигает биты левого операнда влево.

Оператор >>. Побитовый оператор сдвига вправо. Сдвигает биты левого операнда вправо.

Операторы управления

Оператор break. Завершает ближайший вложенный цикл или оператор switch. Переда­ет управление первому оператору после завершенного цикла или оператора switch. Осуществляет принудительный выход из цикла оператора switch.

Оператор continue. Завершает текущую итерацию ближайшего вложенного цикла. Пере­дает управление условию цикла while, оператору do или выражению в заголовке цикла for.

Оператор for. Управляющий оператор, который обеспечивает итерационное выполне­ние кода тела цикла. Зачастую используется для перебора структур данных, а также для повторения вычисле­ний определенное количество раз.

Оператор goto. Оператор, который осуществляет безусловную передачу управления по­меченному оператору в другом месте программы (внутри той же функции). Операторы goto нарушают последователь­ность выполнения операций программы, поэтому их следует избегать.

Оператор if. Условное выполнение кода на основании значения в условии. Если условие истинно (значение true), тело оператора if выполняется, а в противном случае управление переходит к оператору, следующему после него.

Оператор if . . .else. Условное выполнение кода в разделе if или else, в зависимости от истинности значения условия. Если условие истинно (значение true), вы­полняется тело оператора if. В противном случае (значение false) управление переходит к оператору else.

Оператор ?:. Условный оператор. Сокращенная форма конструкции if. . .else. Син­таксис условного оператора имеет следующий вид. условие ? выражение1 : выражение2;Если условие истинно (значение true) выполняется выражение!, а в противном случае выражение!.

Оператор while. Управляющий оператор, обеспечивающий итерационное выполнение кода тела цикла, пока его условие остается истинным (значение true). В зависимости от истинности значения условия, опера­тор выполняется любое количество раз.

Оператор return завершает выполнение функции и возвращает управление той функции, которая вызвала текущую функцию. Завершает выполнение программы и передает управление операционной системе.

Оператор throw. Оператор, прерывает текущий поток выполнения. Каждый оператор throw передает объект, который переводит управление на ближайший раздел catch, способ­ный обработать исключение данного класса.

Оператор switch. Оператор множественного выбора. Оператор сначала вычисляет резуль­тат выражения, следующего за ключевым словом switch, а затем передает управление разде­лу case, метка которого совпадает с результатом выражения. Когда соответствующей метки нет, выполнение переходит к разделу default (если он есть) или к оператору, следующему за оператором switch, если раздела default нет.

Блок catch. Часть программы, которая обрабатывает исключение. Блок обработчика состоит из ключевого слова catch, за которым следует спецификатор исключе­ния и блок операторов. Код внутри блока catch предназначен для обработки исключений класса, указанного в его спецификаторе.

Блок try. Блок операторов, начинающийся ключевым словом try и содер­жащий один или несколько блоков catch. Если код внутри блока try передает исключение и один из блоков catch соответствует типу переданного исключения, переданное исключение будет обработано этим обработчиком. В противном случае исключение будет передано из блока try другому обработчику. далее по цепи обращений.

При реализации РВП в С++ используется ряд сопутствующих понятий. Приведем их.

Метка case. Целочисленное постоянное значение, которое следует за ключевым словом case в операторе switch. Метки case в одном операторе switch не могут иметь одинако­вых значений. Если значение в условии оператора switch совпадает с одной из меток case, управление передается первому оператору после соответствующей метки. Выполнение про­должается до конца оператора switch, если не встретится оператор break.

Метка default. Метка оператора switch, которая соответствует любому значению ус­ловия оператора switch, не указанному в метках case явно.

Обработчик исключения. Код обработчика предназначен для реакции на исключение определенного типа, переданное из другой части программы. Синоним терми­на раздел catch.

Помеченный оператор. Оператор, которому предшествует метка.

Мет­ка оператора – это идентификатор, сопровождаемый двоеточием.

Потерянный оператор else (dangling else). Разговорный термин, используемый для описания проблемы, когда во вложенной конструкции операторов if больше, чем операторов else. В языке С++ оператор else всегда принадлежит ближайшему расположенному выше оператору if. Чтобы указать явно, какому из операторов if принадлежит конкретный опера­тор else, применяются фигурные скобки.

Пустой оператор (null statement). Пустой оператор представляет собой отдельный символ точки с запятой.

Составной оператор. Последовательность операторов, заключенная в фигурные скобки. Составной оператор может быть использован везде, где ожидается один оператор. Синоним блока.

Блок. Последовательность операторов, заключенная в фигурные скобки. Блок операторов может быть использован везде, где ожидается один оператор. Синоним составного оператора.

Условие. Выражение, результатом которого является логическое значение true (истина) или false (ложь). Нулевой результат арифметического выражения соответ­ствует значению false, а любой другой — значению true.