Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык Си. Лабораторные работы / Справочник. Часть 1 (СПбГУТ).doc
Скачиваний:
50
Добавлен:
10.09.2019
Размер:
949.25 Кб
Скачать

2.2.2.2. Использование вложенных инструкций if else if

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

Постановка задачи.

Вычислить значение функции y = f(x), заданной следующим образом

Решение.

Рассматриваемая функция имеет три точки ветвления (x == 0, x == 5 и x == 10) и четыре области задания. Множество операций, из которых требуется выполнить выбор, может быть представлено четырьмя инструкциями присваивания. Для реализации разветвления потребуются три инструкции if...else. Одну из них назовём основной и две вложенные в неё инструкции. Общее количество инструкций if...else определяется количеством точек ветвления. В данном примере таких точек ветвления три. Каждая из инструкций if...else “проверяет” одну точку ветвления. Начать проверки следует с любой крайней точки: левой или правой. Затем следует проверять последовательно одну точку за другой, двигаясь к другой крайней точке.

Выберем в качестве исходной точки для проверки крайнюю левую точку x == 0. Эта точка задана двумя условиями. Выберем такое из этих двух условий, при выполнении которого в инструкции if...else удалось бы выбрать первое присваивание (y = 0). Таким условием будет x <= 0. Таким образом, в логике основной (внешней) инструкции if...else надо проверять условие x <= 0. Начало вложенных инструкций будет выглядеть следующим образом

if(x <= 0) y = 0 ; else

Теперь после else необходима новая проверка. Здесь следует записать новую инструкцию, которая должна проверять следующую точку ветвления x == 5. При этом можно воспользоваться результатами первой проверки (при x == 0). Дело в том, что в той точке программы, где будет располагаться следующая инструкция, автоматически выполняется условие x > 0, противоположное тому условию, которое проверяет внешняя инструкция. Выстроив цепочку

if(x <= 0) y = 0; else if(x <= 5)

можно выделить вторую операцию: y = 2 * x; . В результате получим

if(x <= 0) y = 0; else if(x <= 5) y = 2 * x; else

Применив эти же соображения к последней точке ветвления (x == 10) окончательно получим разветвление следующего вида

if(x <= 0) y = 0; else if(x <= 5) y = 2 * x; else if(x <= 10) y = x + 5; else y = -3 * x + 45;

Естественно, что подобный подход может быть распространен на любое количество точек ветвления.

К достоинствам полученного решения можно отнести следующее:

▪ условие, обеспечивающее выбор, расположено в непосредственной близости к выбранному действию,

▪ после выполнения выбранного действия последующие проверки не производятся.

К недостаткам приведённого решения следует отнести то обстоятельство, что последовательность проверок здесь жестко фиксирована. Такое ограничение не позволяет начать проверки с наиболее часто встречающегося условия. Последнее положение требует некоторого дополнительного пояснения. Представим себе большую программу, в которой часто приходится вычислять значения рассматриваемой функции. Предположим, что значения аргумента этой функции чаще всего отвечают условию 5 < x ≤ 10. С проверки именно этого условия и следовало бы начать цепочку проверок. Путём усложнения проверяемых условий и введения одной дополнительной проверки можно устранить этот недостаток. В основе изменённого подхода лежит отказ от использования результатов проверок, полученных в инструкциях, расположенных на внешнем уровне. Применительно к нашей задаче такой подход требует использования логических операторов. Приведём решение, в котором используются логические операторы.

if(x <= 0) y = 0; else if(x <= 5 && x > 0) y = 2 * x; else if(x <= 10 && x > 5) y = x + 5; else if(x > 10) y = -3 * x + 45;