Паскаль. Вложенные операторы if. Составные условия

Паскаль. Вложенные операторы if. Составные условия

Вложенные операторы 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 внутри 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 - Самоучитель
Лукин С.Н.