Отправляет email-рассылки с помощью сервиса Sendsay

Всё о работе в Интернет

  Все выпуски  

Занятие 22.


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

Средства построения разветвлений в АЯ и в Паскале похожи, но не идентичны. В АЯ они выглядят и более понятными, и более мощными, но программировать-то всё равно приходится на Паскале…

ОПЕРАТОР ВЕТВЛЕНИЯ ПАСКАЛЯ И ПРИМЕР ЕГО ПРИМЕНЕНИЯ

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

Оператор ветвления языка Паскаль по своему построению, особенностям и правилу выполнения полностью аналогичен команде ветвления АЯ.

Оператор ветвления выбирает для выполнения один из двух заданных операторов в зависимости от некоторого условия (реализует двойное ветвление).

Правило записи оператора ветвления можно представить в виде конструкции If <условие> Then <оператор_1> [ Else <оператор_2> ].

Свойства и особенности записи оператора ветвления следующие:

-       слова If (если), Then (то), Else (иначе) – зарезервированные;

-       <условие> представляет собой логическое выражение, значение которого может быть ложным (False) или истинным (True);

-       <оператор_1> и <оператор_2> – произвольные операторы, в том числе пустые, составные и др.;

-       квадратные скобки [...] указывают необязательную часть оператора ветвления, наличие или отсутствие которой определяет соответственно полную или сокращённую его форму.

Подчеркнём следующее. После зарезервированного слова If может быть записано только логическое выражение. После зарезервированного слова ThenElse) разрешается записать только один оператор, но этот оператор может быть составным, то есть построенным с использованием операторных скобок Begin и End.

Оператор ветвления в полной форме делает выбор между выполнением <оператора_1> и выполнением <оператора_2> в соответствии со следующим правилом:

-       Вычисляется <условие>.

-       Если значение <условия> оказалось истинным, то выполняется <оператор_1>, а <оператор_2> пропускается.

-       Если значение <условия> оказалось ложным, то <оператор_1> пропускается, а выполняется <оператор_2>.

Оператор ветвления в сокращённой форме делает выбор между выполнением и  невыполнением <оператора_1> в соответствии со следующим правилом:

-       Вычисляется <условие>.

-       Если значение <условия> оказалось истинным, то <оператор_1> выполняется.

-       Если значение <условия> оказалось ложным, то <оператор_1> пропускается.

Как и в АЯ (см. ссылку http://a-morgun.narod.ru/a06-01/Glava_07.pdf), в случае вложенных ветвлений возможно неоднозначное прочтение оператора ветвления Паскаля. Например, оператор If <условие_1> Then If <условие_2> Then <оператор_А> Else <оператор_Б> можно трактовать следующими двумя способами:

-       оператор ветвления в сокращённой форме содержит в качестве <оператора_1> оператор ветвления в полной форме, то есть If <условие_1> Then Begin If <условие_2> Then <оператор_А> Else <оператор_Б> End;

-       оператор ветвления в полной форме содержит в качестве <оператора_1> оператор ветвления в сокращённой форме, а <оператору_2> эквивалентен <оператор_Б>, то есть If <условие_1> Then Begin If <условие_2> Then <оператор_А> End Else <оператор_Б>.

Компилятор разрешает эту неоднозначность на основе следующей договорённости: при просмотре вложенных ветвлений с конца каждое очередное неиспользованное Else считается относящимся к ближайшему неиспользованному If. Таким образом, компилятор реализует рассматриваемое вложенное ветвление по первому способу. Но то, что понятно компилятору, не всегда достаточно просто и очевидно для нас с вами. Именно поэтому и рекомендуется использовать операторные скобки Begin...End во всех случаях вложенных ветвлений в соответствии с той трактовкой, которая вам нужна.     

2. Пример применения оператора ветвления.

Задача V.1.1. “Вычисление простой комбинированной функции”. Для заданного произвольного значения аргумента построить алгоритм и подпрограмму вычисления значения комбинированной функции

Сначала обсудим особенности данной задачи.

Общая формула для вычисления значения заданной функции y имеет две составляющие, используемые при разных значениях аргумента. Первая составляющая lg (2 – x) используется при x < 1. Вторая составляющая sqrt (+ 1) используется для вычисления функции y в тех случаях, когда заданное значение аргумента x >= 1. Устроенные таким образом функции будем называть комбинированными. К тому же, поскольку число составляющих равно двум, то такую комбинированную функцию будем считать простой.

Мы видим, что составляющие комбинированной функции имеют каждая свою область действия, определяемую соответствующим условием (x < 1 или x >= 1). Важно то, что области действия составляющих, во-первых, не пересекаются, а во-вторых, не имеют разрыва, то есть произвольное значения аргумента x обязательно принадлежит какой-то одной из них.

Теперь обратим внимание на то, что каждая из составляющих заданной функции может быть вычислена (определена) во всех точках своей области действия. Действительно, первая составляющая – логарифм (2 – x) может быть получен  при любом x < 1. То же самое можно сказать и о второй составляющей – квадратном корне из (x + 1), имеющей область действия x >= 1. Интересно, что вычисление составляющих в “чужой” области действия не всегда возможно. Например, невозможно вычислить квадратный корень из (x + 1) при x = –2, а также логарифм (2 – x) при x = 3.

Учитывая отмеченные свойства составляющих, а также областей их действия, можно утверждать, что заданная Простая Комбинированная Функция (ПКФ) однозначно определена при любых значениях своего аргумента. Именно это позволяет построить алгоритм вычисления её значения в виде алгоритма-функции.

Теперь подчеркнём тот факт, что математическая запись функции в условии задачи имеет две ветви и два условия их применения. Одна ветвь используется при условии x < 1, вторая – при условии x >= 1. Самым серьёзным образом обращаем внимание читателя на то, что оба условия имеют альтернативный характер, то есть (x >= 1) = не (x < 1), или, что то же самое, не (x >= 1) = (x < 1). Благодаря этому, для решения задачи достаточно применения единственной команды ветвления, реализующей две ветви вычисления функции на основе анализа всего лишь одного из двух условий.

Наилучший вариант алгоритма и его перевод на Паскаль выглядят следующим образом:

алг ЗначПКФ ( x: вещ ): вещ
   дано произвольное значение x
   надо значение ПКФ
нач
   если x<1 то ЗначПКФ := Ln(2–x)/Ln(10)
                   иначе ЗначПКФ :=
Sqrt(x+1)
кон

Function Value_Simple ( x: Real ): Real;
Begin
   If x<1 Then Value_Simple := Ln(2–x)/Ln(10)
          Else Value_Simple := Sqrt(x+1)
End;

Чуть-чуть хуже выглядела бы в алгоритме запись команды в виде “если x >= 1 то ЗначПКФ := Sqrt (x + 1) иначе ЗначПКФ := Ln(2–x)/Ln(10)” по той простой причине, что знак операции сравнения “ >= ” записать сложнее, чем знак “ ”.

Совсем плохо выглядит вариант записи команды в виде вложенного ветвления, в котором не учитывается, что из двух альтернативных условий (x >= 1 и x < 1) достаточно использовать только одно: “если x < 1 то ЗначПКФ := Ln(2–x)/Ln(10) иначе если x >= 1 то ЗначПКФ := Sqrt (x+1)”.

И совсем плохо выглядят любые варианты с использованием двух команд ветвления в сокращённой форме, например: “если x < 1 то ЗначПКФ := Lg (2 – x); если x >= 1 то ЗначПКФ := Sqrt (x + 1); ”.

Таким образом, даже такая простая задача даёт нам основания сделать  выводы о том, что при построении алгоритмов вычисления комбинированных функций:

-       необходимо учитывать наличие либо отсутствие разрывов в областях действия составляющих;

-       необходимо учитывать возможность либо невозможность вычислить значение каждой из составляющих в области её действия;

-       из всех N условий, соответствующих N ветвям функции, достаточно использовать любых N – 1. 

3. О пустом операторе.

На наших занятиях, уважаемые подписчики, мы уже неоднократно употребляли термины “пустая команда”, “пустой оператор”. Не смотря на интуитивное их понимание, здесь всё же следовало бы внести некоторую ясность.

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

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

На основе понятия пустого оператора легко ответить на часто задаваемый вопрос, нужна ли точка с запятой после второго оператора присваивания, например, в таком фрагменте программы: Begin x := a + b; y := c + d End.

Чисто зрительное впечатление таково, что вторая точка с запятой не нужна, поскольку отделяемых друг от друга соседних операторов здесь всего два. Однако, не будет ошибкой, если её там поставить. И объяснение этому состоит в том, что теперь этот фрагмент будет содержать уже не два оператора, а три. Третий оператор – пустой, и появляется он между второй точкой с запятой и зарезервированным словом End.

Из этого следует, что в программе можно использовать сколько угодно точек с запятой подряд. Например, синтаксически правильная программа “Begin;;;;;;;;;End.” содержит ровно 10 пустых операторов.

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

Уважаемые подписчики! При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru. При этом настоятельно рекомендую пользоваться браузером Internet Explorer.

С уважением, Александр.


В избранное