Вложенные операторы if
Согласно синтаксической схеме оператора if, после then и else может стоять любой оператор Паскаля, в том числе и if.
Решим задачу:
В компьютер вводится число (пусть для конкретности это будет дальность какого-нибудь выстрела). Если оно находится в интервале от 28 до 30, то напечатать текст «ПОПАЛ», иначе - «НЕ ПОПАЛ».
Сначала составим алгоритм:
Введи число. Если оно больше 28, то надо еще подумать, в противном случае печатай «НЕ ПОПАЛ». А о чем же думать? А вот о чем: Если число меньше 30, то печатай «ПОПАЛ», иначе печатай «НЕ ПОПАЛ».
А теперь по составленному алгоритму напишем программу:
Var a: Real;
Begin
ReadLn (a);
if a>28 then
if a<30 then WriteLn('ПОПАЛ') else WriteLn('HE ПОПАЛ')
else WriteLn('HE ПОПАЛ')
End.
Как компьютер не запутается в этих then и else? Если внимательно присмотреться, то можно увидеть, что двусмысленная ситуация получается только тогда, когда один из if записан без else, а другой - с else.
Пример:
d:=3; v:=10; if v<6 then if v<20 then d:=1 else d:=2;
Чему будет равняться d после выполнения этого фрагмента - 1, 2 или 3? Ответ зависит от того, какому if принадлежит else - if v<6 или if v<20? Чтобы ответить на этот вопрос, пойдем по тексту программы от интересующего нас else к началу и если по пути нам не встретится еще один else, то первый же if, на который мы наткнемся - наш. Если по пути нам встретится еще один else, забудем пока про наш else и найдем сначала if для нового else, а со старым разберемся потом. Испытайте-ка этот способ в нашем фрагменте и в предыдущей программе. Получается, что else в нашем примере принадлежит if v<20 и значит, d будет равняться 3.

На первый взгляд применение if внутри if создает громоздкую, трудную для понимания программу. Однако, если вы будете аккуратно использовать ступенчатую запись, то программа получится достаточно обозримой.
Задание 1
В компьютер вводятся длины трех отрезков. Компьютер должен ответить на вопрос, правда ли, что эти отрезки могут образовать треугольник.
Указание: Для этого каждый отрезок должен быть меньше суммы длин двух других отрезков.
Сложное условие в операторе if
В Паскале есть возможность записывать многие программы со вложенными друг в друга if короче и понятнее, используя только один if. Для этого используются логические операции.
Логическая операция AND
Задача «Разборчивая принцесса»:
В прихожей у принцессы - длинная очередь женихов. Принцессе нравятся только голубоглазые маленького роста. Устав принимать женихов и отбирать из них подходящих, принцесса вместо себя поставила компьютер, написав для него программу, которая говорит «ВЫ МНЕ ПОДОЙДЕТЕ» тем, у кого цвет глаз голубой и рост меньше 140 см. Остальным, программа говорит «ДО СВИДАНИЯ».
Вот эта программа:
Var Tsvet: String; {Цвет}
Rost: Integer; {Рост}
Begin
WriteLn('Каков цвет ваших глаз?');
ReadLn(Tsvet);
WriteLn('Введите ваш рост в сантиметрах');
ReadLn(Rost);
if (Tsvet = 'Голубой') AND (Rost<140){Если цвет голубой и рост<140}
then WriteLn('ВЫ МНЕ ПОДОЙДЕТЕ')
else WriteLn('ДО СВИДАНИЯ')
End.
Мы видим, что условие в операторе if уже не такое простое, как мы описывали раньше, а сложное, то есть состоящее из двух взятых в скобки условий, соединенных знаком логической операции AND (читается «энд», переводится «И»).
В скобки условия нужно брать потому, что «приоритет» операции
ANDвыше, чем у операций сравнения «=» и «<», то есть она выполняется раньше них, точно так же, как, скажем, умножение выполняется раньше сложения.
Весь оператор if можно прочесть так - если цвет глаз голубой и рост меньше 140 сантиметров, то печатай «ВЫ МНЕ ПОДОЙДЕТЕ», иначе печатай «ДО СВИДАНИЯ».
Знак логической операции
AND, поставленный между двумя условиями, говорит о том, что должны выполняться сразу оба эти условия.
Поэтому наш оператор if ответит «ДО СВИДАНИЯ» и высоким голубоглазым и высоким не голубоглазым и маленьким не голубоглазым. И лишь маленьким голубоглазым он ответит «ВЫ МНЕ ПОДОЙДЕТЕ».
Программа для задачи «ПОПАЛ - НЕ ПОПАЛ» при использовании логических операций значительно упростится:
Var a: Real;
Begin
ReadLn(a);
if (a>28) AND (a<30) then WriteLn ('ПОПАЛ') else WriteLn ('HE ПОПАЛ')
End.
Логическая операция OR
Задача «Неразборчивая принцесса»:
Неразборчивой принцессе нравятся все маленькие независимо от цвета глаз и все голубоглазые независимо от роста.
Программа неразборчивой принцессы будет отличаться от программы разборчивой одним единственным знаком логической операции:
if (Tsvet = 'Голубой') OR (Rost<140)
{Если цвет голубой или рост<140 }
Знак логической операции OR читается «ор», переводится «ИЛИ».
Поставленный между двумя условиями, знак
ORговорит о том, что достаточно, если будет выполняться хотя бы одно из них.
Поэтому теперь оператор if ответит «ВЫ МНЕ ПОДОЙДЕТЕ» и высоким голубоглазым и маленьким голубоглазым и маленьким не голубоглазым. И лишь высоким неголубоглазым он ответит «ДО СВИДАНИЯ».
Знаками AND и OR можно объединять сколько угодно условий. Например:
if (a>2) OR (x=b) OR (c<>1) then k:=99 else k:=33;
Здесь выполнится оператор k:=99, если верно хотя бы одно из трех условий, и лишь когда все три неверны, будет выполняться оператор k:=33.
Логическая операция NOT
Кроме логических операций AND и OR применяется еще логическая операция NOT (читается «нот», переводится «НЕ»). Запись if NOT(a>b) then... переводится так - ЕСЛИ НЕПРАВДА, ЧТО a больше b, ТО.... Вот фрагмент:
a:=2; b:=3;
if NOT(a>b) then k:=1 else k:=0;
Здесь выполнится оператор k:=1, так как неправда, что 2>3.
Для простоты примем правило, что условия, к которым применяются логические операции, заключаются в круглые скобки, хотя это не всегда обязательно.
Внутри скобок можно писать не только простые, но и сложные условия. Например, фрагмент if NOT ((a>2) AND (b>3)) AND (s>8)) then... можно перевести так - если неправда, что одновременно верны три условия - a>2, b>3, s>8, то...
Примеры:
| Фрагмент | Результат |
|---|---|
a:=8; b:=6;if (a>b) AND (b>7) then k:=1 else k:= 0; | k=0 |
a:=8; b:=6;if (a>b) OR (b>7) then k:=1 else k:=0; | k=1 |
a:=8; b:=6;if (a<b) OR (b>7) then k:=1 else k:=0; | k=0 |
a:=8; b:=6;if NOT (a-8) then k:=1 else k:=0; | k=0 |
До сих пор мы применяли оператор if для выбора одной из двух возможностей. Покажем, как применять его для выбора одной из нескольких. Усложним нашу задачу про «ПОПАЛ - НЕ ПОПАЛ»:
Человек вводит в компьютер число. Если оно находится в интервале от 28 до 30, то нужно напечатать текст «ПОПАЛ», если оно больше или равно 30 - то «ПЕРЕЛЕТ», если оно находится на отрезке от 0 до 28, то «НЕДОЛЕТ», если число меньше нуля – «НЕ БЕЙ ПО СВОИМ».
Вот программа:
Var a: Real;
Begin
ReadLn(a);
if (a>28) AND (a<30) then WriteLn('ПОПАЛ');
if a>=30 then WriteLn('ПЕРЕЛЕТ');
if (a>=0) AND (a<=28) then WriteLn('НЕДОЛЕТ');
if a<0 then WriteLn('HE БЕЙ ПО СВОИМ')
End.
Необходимо обращать внимание на аккуратную расстановку знаков сравнения и числовых границ диапазонов. Если во втором if вместо a>=30 мы напишем a>=20, то при вводе числа 25 компьютер даст нам двусмысленный ответ:
ПЕРЕЛЕТ
НЕДОЛЕТ
Если же мы вместо a>=30 напишем а>30, то при вводе числа 30 мы вообще не получим от компьютера никакого ответа.
Задание 2
Задача «Замысловатая принцесса». Определите, кто нравится принцессе, по фрагменту из ее программы:
if (Tsvet='Черный') AND ((Rost<180) OR (Rost>184))
then WriteLn('ВЫ МНЕ ПОДОЙДЕТЕ') else WriteLn('ДО СВИДАНИЯ');
Задание 3
Человек вводит с клавиатуры строку, смысл которой - приветствие при встрече. Компьютер тоже должен ответить приветствием. Отвечать нужно в соответствии со следующей таблицей:
| Приветствие человека | Ответ компьютера |
|---|---|
| Привет | Привет |
| Здравствуйте | Здравствуйте |
| Здорово | Здравствуйте |
| Добрый день | Салют |
| Приветик | Салют |
| Салют | Салют |
| Здравия желаю | Вольно |
Турбо-Паскаль 7.0 - Самоучитель
Лукин С.Н.