Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

5.4. Ступенчатая запись программы

Обратим внимание на отступы от левого края экрана в записи строк про­граммы из раздела 5.3. Строки VAR, BEGIN и END записаны без от­ступа. Между словами BEGIN и END записаны четыре оператора: WriteLn, ReadLn, if и WriteLn. Все они выполняются по порядку, один за другим, поэтому каждый из них записан с одинаковым от­ступом от левого края. Если оператор сложный, то есть включает в себя другие операторы (мы знаем пока два таких оператора - if и со­ставной), то составляющие его операторы записываются еще правее. Слова, составляющие пару (then и else, begin и end), записываются друг под другом.

Сделано все это для удобства чтения программы, для того, чтобы глаз мог сразу же уловить структуру программы, а именно то, из ка­ких частей состоит как сама программа, так и каждый из элементов, ее составляющих. Впрочем, вам с первого взгляда может показать­ся, что такая запись, наоборот, неудобна для чтения. Однако, за­метьте, что ступенчатая запись принята во всем мире и глаза про­фессиональных программистов привыкли именно к ней. Настолько привыкли, что программа, записанная без соблюдения ступенчатого стиля, вызывает раздражение.

Конечно, допустимы и некоторые отклонения от ступенчатого стиля. Например, несколько коротких похожих операторов вполне можно записать в одну строку:

а:=0; b:=0; c:=0; f:=4;

Этим мы экономим дефицитное место по вертикали экрана или листа бумаги.

5.5. Вложенные операторы if. Сложное условие в операторе. Логические операции

До сих пор мы заставляли компьютер делать только самый при­митивный выбор - по условию он выбирал один вариант из двух возможных. Сейчас мы усложним условие. Путь к усложнению дает синтаксическая схема оператора if, где после then и else может сто­ять любой оператор Паскаля, в том числе и еще один if.

Решим задачу. В компьютер вводится число (пусть для конкрет­ности это будет дальность какого-нибудь выстрела). Если оно нахо­дится в интервале от 28 до 30, то напечатать текст ПОПАЛ, иначе -НЕ ПОПАЛ.

Сначала составим алгоритм. Введи число. Если оно больше 28, то надо еще подумать, в противном случае печатай НЕ ПОПАЛ. А о чем же думать? А вот о чем: если число меньше 30, то печатай ПОПАЛ, иначе печатай НЕ ПОПАЛ.

У вас сразу возникает вопрос: "Почему так сложно? Неужели сразу нельзя ответить на такой простой вопрос?" Для человека он действительно простой, а для оператора if сложный, так как в его условии мы пока умеем сравнивать между собой только две вели­чины, а здесь надо три.

А теперь по составленному алгоритму напишем программу:

VAR а: Real;

BEGIN

ReadLn (a);

If a>28 then if a<30 then WriteLn ('ПОПАЛ')

else WriteLn ('HE ПОПАЛ')

else WriteLn ('HE ПОПАЛ')

END.

Как компьютер не запутается в этих then и else? Он-то не запута­ется, а вот вы точно запутаетесь в следующих нескольких строках, если не будете распутывать их потихоньку.

Рассмотрим пример:

d:=3; v:=10; if v<6 then if v<20 then d:=1 else d:=2; WriteLn(d)

Что будет напечатано: 1, 2 или 3? Ответ зависит от того, какому if принадлежит else - if v<6 или if v<20? Чтобы ответить на этот во­прос, пойдем по тексту программы от интересующего нас else к началу, и если по пути нам не встретится еще один else, то первый же if, на который мы наткнемся, - наш. Если по пути нам встретится еще один else, забудем пока про наш else и найдем сначала if для нового else, а со старым разберемся потом.

Испытайте-ка этот способ в нашем фрагменте и в предыдущей программе. Получается, что else в нашем примере принадлежит if v<20 и, значит, будет напечатано число 3.

Задание 25

Усложним задание из раздела 5.2 В компьютер вводятся длины трех отрезков. Компьютер должен ответить на вопрос, правда ли, что эти отрезки могут образовать треугольник?

Указание. Для этого каждый отрезок должен быть меньше суммы длин двух других отрезков.

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

В Паскале, тем не менее, есть возможность записывать многие программы со вложенными друг в друга if короче и понятнее, используя только один if. Для этого применяются так называемые логические операции.

Задача "Разборчивая принцесса". В прихожей у принцессы - длинная очередь женихов. Принцессе нравятся только голубоглазые маленького роста. Устав принимать женихов и отбирать из них подходящих, принцесса вместо себя поставила компьютер, написав для него программу, которая говорит ВЫ МНЕ ПОДОЙДЕТЕ тем, у кого цвет глаз голубой и рост меньше 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 (читается - "энд", переводится как "и"). Весь оператор if можно прочесть так: если цвет глаз голубой и рост меньше 140 см, то neчатай ВЫ МНЕ ПОДОЙДЕТЕ, иначе печатай ДО СВИДАНИЯ.

Знак логической операции AND, поставленный между двумя ус­ловиями, говорит о том, что должны выполняться сразу оба эти условия.

Поэтому наш оператор if ответит ДО СВИДАНИЯ и высоким го­лубоглазым, и высоким неголубоглазым, и маленьким неголубоглазым. И лишь маленьким голубоглазым он ответит ВЫ МНЕ ПОДОЙДЕТЕ.

Программа для задачи ПОПАЛ - НЕ ПОПАЛ при использовании логических операций значительно упростится:

VAR a :Real;

BEGIN

ReadLn (a);

if (a>28) AND (a<30) then WriteLn ('ПОПАЛ')

else WriteLn ('HE ПОПАЛ’) END.

Задача "Неразборчивая принцесса". Неразборчивой принцессе нравятся все маленькие независимо от цвета глаз и все голубоглазые независимо от роста. Программа неразборчивой принцессы бу­дет отличаться от программы разборчивой принцессы одним единственным знаком логической операции:

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, если верно хотя бы одно из трех условий, и лишь когда все 3 условия неверны, будет выпол­няться оператор k:=33.

Кроме логических операций AND и OR, применяется еще логическая операция NOT (читается - "нот"), переводится как "не"). За­пись if NOT(a>b) then... переводится так: Если НЕПРАВДА, что а больше b, то... Вот фрагмент программы:

а:=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...

можно перевести так: Если неправда, что одновременно верны три условия а > 2, b > 3, s > 8, то...

Примеры:

Фрагменты программ Результаты

а:=8; b:=6; if (a>b) AND (t>7)then k:=1 else k:=0 k=0

a:=S; 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

Задание 26

"Замысловатая принцесса". Определите, кто нравится принцес­се, по фрагменту из ее программы

if (Tsvet ='Черный') AND ((Rost<180)OR(Rost>184))

then WriteLn ('ВЫ МНЕ ПОДОЙДЕТЕ')

else WriteLn ('ДО СВИДАНИЯ')

До сих пор мы применяли оператор if для выбора одной из двух возможностей. Покажем, как применять несколько if для выбора одной из нескольких возможностей. Усложним нашу задачу про ПОПАЛ - НЕ ПОПАЛ:

Человек вводит в компьютер число. Если оно находится в интер­вале от 28 до 30, то нужно напечатать текст ПОПАЛ, если оно больше или равно 30 - ПЕРЕЛЕТ, если оно находится на отрезке от 0 до 28 - НЕДОЛЕТ, если число меньше нуля - НЕ БЕЙ ПО СВОИМ. Вот программа:

VAR а : 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 вместо а>=30 мы напишем а>=20, то, например, при вводе числа 25 компьютер даст нам двусмысленный ответ:

ПЕРЕЛЕТ НЕДОЛЕТ,

Если же мы в программе вместо а>=30 напишем а>30, то при вводе числа 30 мы вообще не получим от компьютера никакого ответа.

Задание 27

Человек вводит с клавиатуры строку, смысл которой приветствие при встрече. Компьютер тоже должен ответить приветствием. Отвечать нужно в соответствии со следующим перечнем:

Приветствие человека Ответ компьютера

Привет Привет

Здравствуйте Здравствуйте

Здорово Здравствуйте

Добрый день Салют

Приветик Салют

Салют Салют

Здравия желаю Вольно