- •1. Краткие теоретические сведения
- •1.1. Операции сравнения и логические операции
- •1.1.1. Операции сравнения
- •1.1.2. Логические операции
- •1.1.3. Логические выражения
- •1.2. Приоритет операций
- •1.3. Разветвляющийся вычислительный процесс
- •1.5. Оператор перехода
- •1.6. Пустой оператор
- •1.7.1. Короткая форма условного оператора
- •1.7.2. Полная форма условного оператора
- •1.9. Понятие составного оператора (группы операторов)
- •1.10.1. Проверка двух или более условий
- •1.10.5. Обработка нескольких условий
- •1.10.6. Вложенный условный оператор
- •1.11. Рекомендации по заданию исходных значений переменным
- •1.11.1. Операторы присваивания
- •1.11.2. Операторы ввода
- •1.11.3. Инициализация переменных
- •1.11.4. Именованные константы
- •1.12. Оператор множественного выбора switch
- •1.13. Использование отступов для улучшения удобочитаемости вашей программы
- •2. Задание
- •2.4. Задания для выполнения на занятиях
- •2.4.1. Задание 1
- •2.4.1.1. Условие задания
- •2.4.2. Задание 2
- •2.4.3. Задание 3
- •2.4.4. Задание 4
- •2.5. Задания для выполнения дома
- •2.5.1. Задание 1
- •2.5.2. Задание 2
- •3.6. Пример программы
- •3.7. Типичные ошибки при выполнении работы
- •2.5.3. Задание 3
- •3. Выводы
- •4. Требование к отчету
- •4. Краткие теоретические сведения.
- •5. Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Операции сравнения и логические операции 2
- •1.1.1. Операции сравнения 2
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.