§8 Ветвления

8.1. Данные логического типа

Логический тип данных, о котором мы уже говорили в §4, иногда называют булевым типом, в честь английского математика Джорджа Буля, который создал один разделов математики - математическую логику. Этот раздел математики использует два вида констант, называемых константами математической логики. Обозначают их по разному: “истина” - “ложь”; “да” - “нет”; “1” и “0” [1]. Логические данные широко используют при сравнении величин. Рассмотрим выражение а2=b2+c2. Оно истинно при а=5; b=3 и с=4 и ложно при а=b=с=6.

Для обозначения истинных и ложных выражений в Turbo Pascal используют специальные слова True (“истина”) и False (“ложь”).

В программах для работы с логическими константами используют переменные логического типа. Объявляются такие переменные следующим образом:

var L1, L2 : Boolean;

Слово Boolean означает - эти переменные логического (булевого) типа. Таким переменным можно присваивать значения логических констант:

L1 := True; L2 := False.

В работе с логическими переменными используют логические операции Not (логическое отрицание, “Не”), And (логическое умножение, “И”), Or (логическое сложение, “Или” операции сравнения: больше, ”>”; меньше, “<”; равно, “=”; больше или равно,“>=”; меньше или равно, “<=”; неравно, “<>”. Логические операции имеют больший приоритет по сравнению с операциями сравнения. Для изменения порядка выполнения операций используют скобки. Значение логической переменной может быть выведено на экран.

В качестве иллюстрации рассмотрим следующую программу:

program Demo_Boolean;

uses Crt;

var A, B, C : Boolean;

begin

            ClrScr;

            A := True;           {А присвоено значение “истина”}

            B := False;          {В присвоено значение “ложь”}

            C := Not A; {С присвоено значение Not A
                                          (отрицание истины) - “ложь”}

            WriteLn(C);        {вывод значения С на экран}

            C := A Or B;     {С присвоено значение А Or B
                                          или В) - “истина”}

            WriteLn(C);        {вывод значения С на экран }

            C := A < B;        {С присвоено значение выражения
                                          А < В - “ложь”}

            WriteLn(C);        {вывод значения С на экран }

            ReadLn;

end.

8.2. Ветвление (выбор действий)

Довольно часто родители стимулируют младших школьников к мыслительной деятельности следующим образом: ”Если ты получишь пять по математике за четверть, то я куплю тебе новую игрушку, а иначе ты ничего не получишь”. Этот пример для нас интересен тем, что в нем осуществляется выбор действий (купить игрушку, не купить игрушку) в зависимости от какого-либо условия (получение пятерки по математике за четверть). Рассмотрим математическую задачу вычисления значения функции, которая поможет нам понять особенности организации выбора действий в алгоритмах и программах:

     ì Х2  при Х<0

У=í                            (1)

     îХ3  при Х³0

Для вычисления значения функции необходимо в зависимости от значения Х выбрать тот или иной способ вычисления значения У. Для решения подобных задач в алгоритмическом языке и в языке Pascal предусмотрены команда ветвления и условный оператор соответственно. Эту команду (оператор) используют полной и краткой форме. Алгоритм, содержащий команду ветвления, называется алгоритмом с ветвлением.

Полная форма

если <условие>

то <действие 1>

if <условие>

then <действие 1>

иначе <действие 2>

else <действие 2>

кесли

 

Схема работы полной формы ветвления: если проверяемое условие истинно, то выполняется действие 1, иначе (условие ложно), то выполняется действие 2.

Если рассматривать нашу математическую задачу, то решение ее должно выглядеть так:

если x<0

то y := x*x

if X<0

then Y := X*X

иначе y := x*x*x

else Y:= X*X*X;

кесли

 

Краткая форма

если <условие>

то <действие>

if условие

then <действие>

кесли

 

Схема работы краткой формы ветвления: если проверяемое условие истинно, то выполняется действие, а если условие ложно, то не выполняются никакие действия вообще.

С использованием краткой формы условного оператора наша задача может быть решена так:

если х<0

то y := x*x

if X<0

then Y := X*X

кесли

 

если x³0

то y := x*x*x

if X>=0

then Y:= X*X*X;

кесли

 

Условия, помещаемые между if и then могут быть составными. Для этих целей используют служебные слова and (и), or (или), not (не). Например, условие Х*У=0 можно в программе задать так: (Х=0) or (У=0). Действительно, произведение двух чисел равно нулю, когда один ИЛИ другой множитель равен нулю. В таком случае говорят о том, что образовано составное условие. Обратите внимание:

G     если используется составное условие, то отдельные его части берутся в скобки;

G     если действия в ветвлении состоят из нескольких операторов, то все операторы, реализующие данное действие, должны заключаться в операторные скобки begin ... end.

Использование составных условий проиллюстрируем решением следующей задачи: определить, является ли треугольник со сторонами a, b, c равносторонним. Очевидно, что для доказательства этого факта нам необходимо проверить равенство a=b=c. Для проверки составим условие вида (a=b) и (b=c).

 

алг треугольник

program triangle;

 

uses Crt;

цел a, b, c

var A, B, C : Integer;

нач

begin

 

   ClrScr;

  ввод  а

   ReadLn (A);

  ввод  b

   ReadLn (B);

  ввод  c

   ReadLn (C);

  если a=b и b=c

   if (A=B) and (B=c)

  то  вывод “равносторонний”

   then WriteLn (‘равносторонний’)

  иначе вывод “не равносторон
 ний

   else WriteLn (‘не равносторон
   ний’);

 

   ReadLn;

кон

end.

 

Правила использования операторных скобок иллюстрирует решение задачи о нахождении значения функции по формуле (1):

алг Вычисление функции

program Val_Function;

 

uses Crt;

цел х, у

var X, Y : Integer;

нач

begin

 

      ClrScr;

      ввод х

      ReadLn(X);

      если х<0 то

      if X<0 then

 

             begin

            y := x*x

                   Y := X*X;

            вывод “у=

                    WriteLn(‘Y=’,Y);

 

              end

      иначе

      else

 

           begin

                  y := x*x*х

                 Y := X*X;

                  вывод “у=

                 WriteLn(‘Y=’,Y);

      кесли

           end;

      ввод

      ReadLn;

кон

end.

Как видно из этой программы, операторные скобки begin ... end используют тогда, когда действия образованы двумя или более операторами Pascal.

Изредка возникает необходимость заставить ЭВМ перейти без проверки условий в другую точку программы, то есть вынудить компьютер совершить “скачок по тексту программы, пропустив несколько строк”. В этом случае используют так называемый оператор безусловного перехода - оператор goto. Он заставляет перейти программу в точку, обозначенную особым образом — с помощью метки. Как и любую другую конструкцию языка, метку надо объявить. Делается это следующим образом:

label check_point;

В программе оператор безусловного перехода используется так:

goto check_point.

Правило использования метки в программе таково: сначала пишется имя метки (check_point), а затем ставится двоеточие, после двоеточия записываются конструкции Turbo Pascal:

check_point: ClrScr;

Что интересно, я неоднократно слышал от программистов такое определение языка Pascal: язык Pascal — язык программирования “без оператора goto”. Тем самым подчеркивают, с одной стороны, достоинства языка, в котором можно обойтись вообще без этого оператора. В то же время - это предостережение профессионалов новичкам в программировании:

G     не пользуйтесь оператором goto, программа с его использованием станет более запутанной, более сложной для понимания.

8.3. Вложенные ветвления

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

Чтобы понять особенности вложенных ветвлений, рассмотрим следующую задачу: найти наибольшее значение среди трех величин: a, b, c[2]. Идея решения сводится к тому, чтобы сравнивать пары чисел, определяя, какое из них большее; после перебора всех возможных вариантов сравнений будет получен ответ, размещенный в дополнительной переменной d. Алгоритм решения этой задачи выглядит так:

алг Наибольшее из трех чисел

цел a, b, c, d

нач

            ввод a, b, c, o

            если a<b

то если b<c то d := c иначе d:= b

            иначе если a<c то d := c иначе d := a

            к если

            вывод d

кон

 



[1] Удобный момент вспомнить о том, что ЭВМ работает с двоичными числами!

[2] Данная задача может быть решена и без вложенных ветвлений. Попробуйте составить такой алгоритм.

Используются технологии uCoz