Ветвление программы

Создание управляющих структур

В главе 1 рассмотрен ветвящийся алгоритм, предусматривающий наличие нескольких альтернативных путей с выбором одного из них на основании значения некоторого логического выражения (см. рис. 1.9,б,в). Для реализации ветвлений используются структуры if-then, if-then-else, if-end if, select case – end select, on – goto и on – gosub.

Структуры if-then, if-then-elseиспользуются для создания сходящихся и не сходящихся ветвлений и называются условными операторами. Формат операторов имеет следующий вид:

If <логическое выражение> then< действие>

или

If <логическое выражение> then< действие_1> else< действие_2>

Слово "действие" обозначает список операторов, написанных в одну строку и разделенных двоеточием. Например, if a=10 thenb=100: c=20elsed=20.

Если логическое выражение имеет значение true, то выполняется единственное значение в первом операторе и действие_1 во втором. В противном случае первый оператор не производит никаких действий, во втором – выполняется действие_2. Использование в логических операторах команды передачи управления goto МЕТКА[5] позволяет создать не сходящееся ветвление, при котором альтернативные пути не сходятся в одну точку. Этот оператор может входить в единственное "действие" первого оператора, а также в действие_1 и в действие_2 второго. [6]

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

Операторы if – end if называются "блочным if" и образуют структуру, имеющую следующий формат операторов, приведенный на рис. 4.8.

 

 

Формат оператора Пример
If<логическое выражение_1> Then <действие_1> Elseif <логическое выражение_2> Then <действие_2> . . . Elseif <логическое выражение_n-1> Then <действие _n-1> Else <действие_n> End if.   If a=10 Then B=20 C=30 Elseif (a=20 and c=40) Then B=50 If g= -1 Then Exit if Else B=100 End if
а) б)
Рис. 4.8. Формат оператора "блочный if" (а) и пример его применения (б)

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

Структура select case – end selectобеспечивает получение ветвящегося не сходящегося алгоритма с выбором одного из альтернативных путей в зависимости от значения вычисляемого выражения. Получающаяся структура и пример ее реализации приведены на рис. 4.9. При попадании значения вычисляемого выражения в список выполняются соответствующие действия. Если значение выражения не попадает ни в один список, то выполняется действия, стоящие после оператора else.

Select case <выражение> Case <список_значений_1> <действия_1> Case <список_значений_2> <действия_2> . . . Case <список_значений_n> <действия_n> Else <действия_n+1> End select   Select case 3*a+b ' 3*а+b выражение Case 1,3,5,7 '1,3,5,7 – список_1 C=sin(x) ' действия_1 Case 2,4,6,8'2,4,6,8 – список_2 C=cos(x) ' действия_2 Else C=0 ' действия_3 End select
а) б)
Рис. 4.9. Формат операторов select-end select (а) и пример их применения (б).

Количество операторов elseif в "блочном if" и операторов "case" в структуре select case – end select произвольно, а оператор else в обеих структурах не обязателен. Принудительный выход из обеих структур осуществляется операторами exit ifиexit select, но не оператором goto.

Предупреждение! Возможность многострочной записи операторов в структурах "if-end if" и "select-end select" создает соблазн ставить метки внутри групп операторов, выполняющих действия, и переходить внутрь структуры, минуя ее заголовок (if или select), или переходить из одной группы операторов в другую. Этого делать ни в коем случае не следует, т.к. компилятор пропустит эту неточность, а при выполнении программы, особенно многократном, может возникнуть переполнение сегмента стека адресов возврата ([5, стр. 44]).

Структуры on – gotoиon – gosub реализуют ветвящийся алгоритм по значению вычисляемого выражения, имеющего значение целого типа, на основе фрагментов программы с метками. Первую структуру следует применять для реализации не сходящегося ветвления, вторую – для сходящегося. Общий вид структур и примеров их применения приведен на
рис. 4.10. Стрелками показана передача управления выполнением алгоритма.

On <выражение> Goto<список меток> . . . METKA1: <действия_1> End METKA2 <действия_2> End . . . METKAn <действия_n> End On int(3*b) Goto M1, M2, M3 . . . M1: F=10 End M2: F=20 End M3: F=30 End
On <выражение> Gosub<список меток> Оператор, следующий за On-Gosub . . . METKA1: <действия_1> Return METKA2 <действия_2> Return . . . METKAn <действия_n> Return On int(3*b) Gosub M1, M2, M3 . . . M1: F=10 Return M2: F=20 Return M3: F=30 Return . . .
а) б)
Рис. 4.10. Общий вид структур on-goto и on-gosub (а) и примеры их применения (б)

Вычисляемое выражение определяет номер метки в списке. Если значение выражения равно нулю или превышает число меток, то операторы
on goto и on gosub игнорируются.