Реализация разветвляющихся алгоритмов
Разветвляющимся алгоритмом называется такой алгоритм, при исполнении которого от начала алгоритма до конца можно пройти разными путями (выполняя различные действия, некоторые из действий пропускаются) в зависимости от исходных данных.
Определяющим разветвляющийся алгоритм являются наличие либо структуры ветвления, либо структуры выбора.
Структура ветвления
Начнем изучение со структуры ветвления. Обе формы структуры – полная и короткая приведены на рис. 12.1.
a) полная структура ветвления b) короткая структура ветвления
Рис. 12.1. – Структура ветвления
IV.2.5. Условный оператор
Назначение
Для реализации структуры ветвления используется условный оператор (полный и короткий).
Синтаксис
Синтаксис определяется синтаксической диаграммой, приведенной на рис. 12.2.
Рис. 12.2. – Условный оператор
Существует две формы условного оператора:
- полный условный оператор с ветвью else;
- короткий условный без ветви else.
Семантика
1) вычисляется логическое выражение между IF и THEN (возможен ответ true или false);
2) Если результат true, то выполняется оператор1, оператор2 не выполняется.
Если же ответ false, то выполняется оператор2, оператор1 не выполняется (для короткого условного оператора в этом случае никаких действий не производится).
Семантическая неоднозначность
Синтаксис позволяет в качестве операторов, вложенных в условный оператор, использовать любые операторы языка, в том числе и условные. Исходя из этого, возникает неоднозначность в использовании следующей конструкции:
if <условие 1 > then if <условие 2 > then <оператор A > else <оператор B >
Эту конструкции можно трактовать двояко. Первый вариант (рис.12.3):
Рис. 12.3. – Семантическая неоднозначность (первый вариант трактовки)
внутрь полного условного оператора
if <условие 1 > then < оператор1 > else <оператор B >
в качестве оператора1 по ветви then вложен короткий условный оператор
if <условие 2 > then <оператор A >
Второй вариант (рис. 12.4): внутрь короткого условного оператора
if < условие1 > then < оператор >
в качестве оператора вложен полный условный оператор
if <условие 2 > then <оператор A > else <оператор B >
Рис. 12.4. – Семантическая неоднозначность (второй вариант трактовки)
Естественно, разные варианты трактовки, дают разный семантический смысл (получаются различные результаты).
Для устранения такой неоднозначности принято следующее синтаксическое правило:
ветвь else относится к ближайшему слева if,
т.е. в нашем примере справедлив второй вариант - внутрь короткого условного оператора в качестве оператора вложен полный условный оператор
Для поддержки первого варианта вложенный по ветви оператор, расположенный по ветви then, необходимо заключить в операторные скобки begin end, т.е. сделать из него составной оператор:
if <условие1> then
begin if<условие2> then <операторA> end
else <операторB>
Рассмотрим примеры реализации разветвляющихся алгоритмов со структурой ветвления.