Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК ОАиП.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.14 Mб
Скачать

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

Операторы ветвления if и варианта case применяются для того чтобы в зависимости от конкретных значений исходных данных обеспечить выполнение разных последовательностей операторов. Оператор if обеспечивает передачу управления на одну из двух ветвей вычислений, а оператор case — на одну из произвольного числа ветвей.

Условный оператор if

Условный оператор if используется для разветвления процесса вычислений на два направления. Структурная схема оператора приведена на рис. 2.2. Формат оператора:

if выражение then оператор_1 [else оператор_2;]

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

Рис. 2.2.  Структурная схема условного оператора

Oператоры, входящие в состав условного оператора, могут быть простыми или составными. Составной оператор блок ) обрамляется ключевыми словами begin и end. Блок применяют в том случае, когда по какой-либо ветви требуется выполнить несколько операторов: ведь иначе компилятор не сможет понять, где заканчивается ветвь и начинается следующая часть программы. Одна из ветвей может отсутствовать.

ВНИМАНИЕ Отсутствие ключевых слов begin и end в ветви else компилятор как ошибку не распознает!

Примеры условных операторов:

if a < 0 then b := 1; { 1 }

if (a < b) and ((a >d) or (a = 0)) then inc(b)

else begin

b := b * a; a := 0

end; { 2 }

if a < b then

if a < c then m := a else m := c

else

if b < c then m := b else m := c; { 3 }

В примере 1 отсутствует ветвь else. Такая конструкция называется 'пропуск оператора'.

Если требуется проверить несколько условий, их объединяют знаками логических операций. Так, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие a < b и хотя бы одно из условий a > d и a = 0. Скобки, в которые заключены операции отношения, обязательны, потому что приоритет у логических операций выше, чем у операций отношения. Поскольку по ветви else требуется выполнить два оператора, они заключены в блок.

В примере 3 вычисляется наименьшее из значений трех переменных a, b и с.

ВНИМАНИЕ Частая ошибка при программировании условных операторов — неверная запись проверки на принадлежность диапазону. Например, условие 0 < x < 1 нельзя записать непосредственно. Правильный способ: if(0 < x) and (x < 1) then …, поскольку фактически требуется задать проверку выполнения одновременно двух условий: x > 0 и x < 1.

Пример. Программа, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика (рис. 2.3).

Рис. 2.3.  Функция, заданная в виде графика

Составим описание алгоритма в неформальном словесном виде.

  1. Ввести значение аргумента х.

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

  3. Вывести значения х и y.

Второй пункт алгоритма следует детализировать. Сначала запишем определение функции в виде формул.

Теперь в соответствии с формулами опишем словами последовательность действий второго пункта алгоритма:

  1. Если x < –2, присвоить переменной y значение 0

  2. Если –2 <= x < –1, присвоить переменной y значение –x – 2.

  3. Если –1 <= x < 1, присвоить переменной y значение x.

И так далее.

Теперь шаги алгоритма представлены максимально подробно, поэтому можно приступать к написанию программы (пример 2.1).

program calc_function_1;

var x, y : real;

begin

writeln(' Введите значение аргумента'); readln(x);

if x < –2 then y := 0;

if (x >= –2) and (x < –1) then y := –x – 2;

if (x >= –1) and (x < 1) then y := x;

if (x >= 1) and (x < 2) then y := –x + 2;

if x >= 2 then y := 0;

writeln('Для x = ', x:6:2, ' значение функции y = ', y:6:2);

end.

Тестовые примеры для этой программы должны включать по крайней мере по одному значению аргумента из каждого интервала, а для проверки граничных условий — еще и все точки перегиба (если это кажется вам излишним, попробуйте в предпоследнем условии 'забыть' знак =, а затем ввести значение х, равное 1.

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

const eps = 1e-6; { Требуемая точность вычислений }

var x, y : real;

...

if (x = y) then writeln('Величины x и y равны'); { Плохо! Ненадежно! }

if (abs(x - y) < eps) then writeln('Величины x и y равны'); { Рекомендуется }

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]