Информатика: Новый полный справочник для подготовки к ЕГЭ - 2018 год
Условный оператор - Программирование
Конспект
Основные алгоритмические конструкции
Конструкция ветвления в языке Паскаль
Полная |
Неполная |
Если блоки команд состоят только из одного оператора каждый, то использовать операторные скобки begin ... end не обязательно:
Полная |
Неполная |
В конструкции вложенных операторов if:
оператор else всегда относится к последнему по счёту оператору if. Поэтому, если условие 1 ложно, то весь второй оператор if не будет выполнен.
Во избежание путаницы рекомендуется записывать вложенные конструкции if ... then . . . else в операторных скобках begin ... end;
В языке Паскаль завершающий знак “;” после содержимого ветви then (перед оператором else) не ставится, так как вся конструкция if ... then . . . else представляет собой один единый оператор, а знак “;” — это знак завершения оператора.
Полные и неполные условия в цепочке операторов if
Пусть требуется при помощи нескольких операторов if выделить все возможные варианты сочетаний условий (например, по заданным значениям х и у определить, в какой координатной четверти располагается точка с такими координатами). Тогда проверку соответствующих условий можно выполнять двумя способами.
1. Использование полных условий
В этом случае каждый оператор if (соответствующий одному из возможных сочетаний условий) содержит полный набор таких условий (операций сравнения), определяющий соответствующий вариант. В примере задачи с принадлежностью точки координатной плоскости это две операции сравнения для х л у. В этом случае каждый оператор if не зависит от других (так как его условие независимо от условий, определяющих другие варианты), и в программе все эти операторы if могут быть записаны в любом порядке друг за другом:
2. Использование частичных условий
Частичное условие является неполным и определяет несколько возможных ситуаций (например, условие х > 0 указывает, что точка расположена в правой полуплоскости). Для определения конкретной ситуации нужно использовать ещё одно ветвление, проверяющее оставшиеся условия (дополняющие уже проверенное до полного набора условий), например, условие у > 0, проверяемое в ветви then оператора if с условием х > 0, однозначно определяет принадлежность точки I-й координатной четверти. При таком построении алгоритма необходимо использовать вложенные операторы конструкции if ... then ... else:
Использование меняющихся значений условий
Возможны задачи, в которых конкретные ситуации определяются одинаковыми условиями, но с разными значениями (константами). Например, если требуется определить сезон (зима, весна, лето, осень) по номеру месяца, то это можно сделать, проверяя равенство заданного номера месяца числам:
• 1, 2, 12 — зима,
• 3, 4, 5 — весна,
• 6, 7, 8 — лето,
• 9, 10, 11 — осень,
• другие значения номера месяца — ошибка ввода.
Решение такой задачи также может осуществляться с использованием как полных, так и неполных условий.
1. Решение с полными условиями
В каждом операторе if можно задать условие, однозначно определяющее соответствующий диапазон значений номера месяца:
В данном случае в каждом операторе if соответствующее условие однозначно определяет ситуацию, поэтому последовательность записи этих операторов может быть любой.
2. Решение с неполными (меняющимися) условиями
Можно решить ту же задачу иначе, воспользовавшись фактом, что значение одной и той же переменной может быть многократно переприсвоено и при этом актуальным остаётся последнее присвоенное ей значение.
Работа этой программы для случая n = 7:
• первый оператор проверяет возможное наличие ошибки; значение n = 7 корректно, поэтому выполняется ветвь else (содержащая собственно операторы определения названия сезона);
• n = 7, поэтому условие n >= 1 выполняется; переменной s присваивается значение “зима”;
• условие n >= 3 также выполняется; переменной s взамен прежнего значения “зима” присваивается значение “весна”;
• условие n >= 6 также выполняется; переменной s взамен прежнего значения “весна” присваивается значение “лето”;
• условие n >= 9 уже не выполняется; оператор присваивания в ветви then пропускается, переменная s сохраняет значение “лето”;
• условие n = 12 также не выполняется; оператор присваивания в ветви then пропускается, переменная s сохраняет значение “лето”.
В данном случае порядок записи операторов if важен! Если изменить его, то программа перестанет работать правильно. Например, изменив порядок записи операторов на противоположный:
Результат работы такой программы (для n = 7):
• первый оператор проверяет возможное наличие ошибки; значение n = 7 корректно, поэтому выполняется ветвь else (содержащая собственно операторы определения названия сезона);
• n = 7, поэтому условие n = 12 не выполняется; оператор присваивания в ветви then пропускается;
• условие n >= 9 также не выполняется; оператор присваивания в ветви then пропускается;
• условие n >= 6 выполняется; переменной s присваивается значение “лето”;
• условие n >= 3 также выполняется; переменной s взамен прежнего значения “лето” присваивается значение “весна”;
• условие n >= 1 также выполняется; переменной s взамен прежнего значения “весна” присваивается значение “зима”.
В итоге программа вместо правильного значения “лето” выдаст ошибочное “зима”.
Конструкция множественного ветвления (конструкция выбора)
Конструкция выбора в языке Паскаль
Ключ — выражение или переменная, имеющие целое или символьное значение.
В качестве селектора допускаются: константы, списки констант (через запятую), интервалы (через знак ..) и символы.
Если одной и той же ситуации соответствует несколько различных значений ключа, то эти значения можно записать через запятую в одной программной строке. Например, программа для определения количества дней в месяце по его номеру n может иметь вид:
Разбор типовых задач
Задача 1. Определите значение переменной с после выполнения следующего фрагмента программы (записанного ниже на разных языках программирования):
Бейсик |
Паскаль |
Си |
Алгоритмический язык |
Решение
Подобные задачи решаются путём выполнения ручной трассировки (покомандного выполнения программы) в табличной форме. При этом в таблицу включаются все переменные, значения которых изменяются в программе. Дополнительно в левом столбце могут быть записаны соответствующие операторы программы. В строках таблицы трассировки, соответствующих условному оператору, желательно отдельно отмечать истинность или ложность условия ветвления.
В данном случае используются три переменные. Факт изменения значения той или иной переменной отмечен жирным подчёркнутым шрифтом и фоновым закрашиванием ячеек таблицы.
Ответ: с = 440.
Внимание! При выполнении трассировки программ следует:
• до присваивания переменной первого значения содержимое этой переменной считать неопределённым и отмечать в таблице прочерком;
• при выполнении операторов присваивания, в которых одна и та же переменная стоит слева и справа нужно не ошибиться в определении, откуда берётся значение переменной для вычисления выражения после знака присваивания (из предыдущей строки таблицы) и в какой столбец записывать результат (в столбец, соответствующий переменной, которая записана до знака присваивания).
Задача 2. Ниже приведён фрагмент программы. При каком наименьшем введенном числе а после выполнения программы значение переменной с будет равно 60?
Решение
В отличие от предыдущей задачи, здесь требуется не просто формально “протрассировать” заданную программу, а проанализировать алгоритм её работы и понять, какими могут быть значения введенного числа а.
1) Изменение значения переменной b выполняется однократно (одним из операторов в ветвях then или else).
2) Изначально b = 50, а нам нужно, чтобы это значение стало равным 60. Следовательно, нам нужно для этого выполнить оператор с:=b+10 в ветви else.
3) Чтобы выполнялась ветви else, требуется, чтобы к моменту выполнения оператора if уже пересчитанное значение а (а:=а*2-b) было не меньше (т.е. больше или равно) b, т.е. числа 50.
4) Решаем полученное неравенство:
5) Это почти уже ответ. Нам же нужно определить, какое возможное значение а является наименьшим. Так как неравенство нестрогое, это значение a = 50.
Ответ: 50.