Логический тип данных, о
котором мы уже говорили в §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.
Довольно часто родители
стимулируют младших школьников к мыслительной деятельности следующим образом:
”Если ты получишь пять по математике за четверть, то я куплю тебе новую
игрушку, а иначе ты ничего не получишь”. Этот пример для нас интересен тем, что
в нем осуществляется выбор действий (купить игрушку, не купить игрушку) в зависимости от какого-либо условия (получение
пятерки по математике за четверть). Рассмотрим математическую задачу вычисления
значения функции, которая поможет нам понять особенности организации выбора
действий в алгоритмах и программах:
ì Х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, программа с его использованием станет более
запутанной, более сложной для понимания.
До сих пор мы рассматривали
алгоритмы и программы, содержащие одну структуру ветвления. Разумеется
их может быть гораздо больше. Принципиальных ограничений на число используемых
ветвлений нет. Важно отметить тот факт, что в алгоритмах и программах ветвления
могут быть последовательными
(расположенными одно за другим) и вложенными
(одно внутри другого). Как организован алгоритм с последовательными
ветвлениями, вам, наверное, интуитивно понятно. В этом случае команды ветвления
следуют одна за другой.
Чтобы понять особенности
вложенных ветвлений, рассмотрим следующую задачу: найти наибольшее значение
среди трех величин: 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] Данная задача может быть решена и без вложенных ветвлений. Попробуйте составить такой алгоритм.