Вся мыслительная деятельность во всех программах (в том числе и той, что выиграла в шахматы у Каспарова) осуществляется только при помощи ветвления (выбора).
Давайте посмотрим, как писать разветвляющиеся программы на Паскале.
Выучим сначала три английских слова:
| if | Читается «иф» | Переводится «если» |
| then | Читается «зэн» | Переводится «то» |
| else | Читается «элсэ» | Переводится «иначе» |
Теперь приведем пример нового для вас оператора:
if a=28 then WriteLn(f) else k:=44;
Переводится так:
ЕСЛИ a=28 ТО печатай f ИНАЧЕ присвой переменной k значение 44.
Другими словами, мы предлагаем компьютеру сначала подумать, правда ли, что a=28, и если правда, то выполнить оператор WriteLn(f), в противном случае выполнить оператор k:=44. Таким образом, мы с вами впервые написали оператор, при выполнении которого компьютер не просто выполняет, что приказано, а сначала думает и делает выбор (пока одного из двух).
Мы видим, что оператор if включает в себя другие операторы, которые выполняются или не выполняются в зависимости от какого-то условия. Чтобы понять, зачем может пригодиться оператор if, рассмотрим следующую задачу.
Var a,b,y :Integer;
Begin
a:=167;
b:=121;
y:=a*b;
if y>20000 then WriteLn('ПРОИЗВЕДЕНИЕ БОЛЬШОЕ')
else WriteLn('ПРОИЗВЕДЕНИЕ МАЛЕНЬКОЕ');
WriteLn(y)
End.
В программе 5 операторов, последний -
WriteLn(y). Операторifи то, что находится внутри него считается за один (выделено зелёным цветом). Поскольку эти 5 операторов выполняются по порядку, то операторWriteLn(y)выполнится обязательно.
Задача:
В компьютер вводятся два произвольных положительных числа - длины сторон двух кубиков. Компьютер должен подсчитать объем одного кубика - большего по размеру.
Обозначим a1 - сторону одного кубика, a2 - сторону другого, max - сторону большего кубика, V- объем кубика. Приведем три варианта программы.
Вариант 1:
Var a1,a2: Real;
Begin
ReadLn(a1,a2);
if a1>a2 then WriteLn(a1*a1*a1:15:5)
else WriteLn(a2*a2*a2:15:5)
End.
Вариант 2:
Var a1,a2,V: Real;
Begin
ReadLn(a1,a2);
if a1>a2 then V:=a1*a1*a1
else V:=a2*a2*a2;
WriteLn(V:15:5)
End.
Вариант 3:
Var a1,a2,max,V : Real;
Begin
ReadLn(a1,a2);
if a1>a2 then max:=a1
else max:=a2;
V:=max * max * max;
WriteLn(V:15:5);
End.
Поясним последний вариант. Программа состоит из четырех операторов, которые выполняются в порядке записи. Первым после запуска выполняется оператор ReadLn(a1,a2), который ждет от нас ввода двух чисел. Пусть мы сегодня ввели числа 3 и 2. Компьютер понимает, что a1 равно 3, а2 равно 2, и переходит к выполнению оператора if. Он видит, что 3>2, и поэтому выполняет оператор max:=a1, а оператор max:=a2 не выполняет. В результате в ячейке max оказывается число 3. Затем компьютер переходит к следующему оператору - V:= max*max*max и вычисляет V=3*3*3=27. Следующий оператор WriteLn(V:15:5) печатает число 27.00000.
Если завтра мы запустим эту же программу и введем числа 6 и 10, то компьютер увидит, что утверждение 6>10 ложно, и поэтому выполнит оператор max:=a2, а оператор max:=a1 выполнять не станет. В результате в ячейке max окажется число 10 и будет напечатано число 1000.00000.
Итак, если паровая машина избавила человека от тяжелого физического труда, то оператор if избавил человека от тяжелого умственного труда, в нашем случае - от необходимости решать, какое из двух чисел больше другого.
Оператор if можно записывать и без части else. Например, if s<t then w:=a+1. Это означает, что если s<t, то нужно выполнить оператор w:=a+1, в противном случае ничего не делать, а просто перейти к следующему оператору.
Для примера рассмотрим простейшую задачу:
В компьютер вводится слово. Компьютер должен просто распечатать его. Однако, если введенным словом будет «колхозник», то компьютер должен напечатать вместо него слово «фермер».
Вот как будет выглядеть наша программа - «цензор»:
Var Slovo: String;
Begin
ReadLn(Slovo);
{ Переменная Slovo будет иметь значением строку символов, введенных с клавиатуры. }
if Slovo = 'колхозник' then Slovo := 'фермер';
WriteLn(Slovo)
End.
Правила записи оператора if
У каждого человеческого языка есть своя грамматика, включающая в себя правила, по которым должны выстраиваться в цепочку элементы языка, чтобы получилось правильное предложение. Совокупность этих правил образует часть грамматики, называемую синтаксисом. В языках программирования тоже есть предложения. Такими предложениями здесь являются операторы. Следовательно, у языков программирования тоже должен быть свой синтаксис, который описывает правила, по которым записываются операторы языка и из операторов составляется программа. После того, как человек запускает программу на выполнение, любая порядочная среда программирования прежде, чем действительно выполнять ее, сначала проверит, нет ли в ней синтаксических ошибок, и если есть, то программу выполнять не будет, а выдаст сообщение, указывающее человеку, в чем ошибка.
Пока мы не готовы воспринять полный синтаксис оператора if Паскаля, однако уже сейчас нам хотелось бы писать без ошибок. Для этого, скрепя сердце, будем использовать сокращенный синтаксис. Поясним его в виде синтаксической схемы:
if условие then оператор else оператор
Как понимать эту схему? Ее следует понимать, как образец, шаблон записи оператора, указывающий порядок.
| Оператор | Любой оператор Паскаля |
| Условие | Пока под условием будем понимать два арифметических выражения (две строки), соединенных знаком сравнения |
| Знак сравнения | Знаков сравнения шесть: > больше; >= больше или равно; = равно; < меньше; <= меньше или равно; <> не равно. |
Пример:
if 5*a+4 <= a*b then WriteLn(b) else a:=b+5;
Здесь:
WriteLn(b) | Один оператор |
a:=b+5 | Другой оператор |
5*a+4 <= a*b | Условие |
5*a+4 | Одно выражение |
a*b | Другое выражение |
<= | Знак сравнения |
Вспомним правило расстановки точек с запятыми. Они применяются для того, чтобы отделять друг от друга операторы, выполняющиеся друг за другом. Поэтому и после оператора if мы тоже ставили точку с запятой, если после него шел какой-нибудь оператор. Распространенная привычка начинающих программистов - автоматически ставить точку с запятой после любого оператора, независимо от того, что после него стоит - другой оператор или же служебное слово, например else или End. Так вот, перед End точку с запятой ставить не возбраняется, а перед else точку с запятой ставить запрещено.
Запишем оператор if в краткой форме:
if условие then оператор
Таким образом, это уже вторая синтаксическая схема, касающаяся одного оператора. Удобно же весь синтаксис оператора иметь перед глазами в одной схеме. Соединим две схемы в одну. Вот эта схема:
if условие then оператор [else оператор]
Квадратные скобки здесь означают, что их содержимое можно писать, а можно и не писать в операторе.
Вычисляя выражения, стоящие в условии оператора
if, Паскаль не записывает их значения в память.
Например, после выполнения фрагмента:
b:=6;
if b+1>0 then s:=20;
в ячейке b будет храниться 6, а не 7. То же относится и к выражениям из оператора WriteLn. Например: b:=6; WriteLn(b+1). И здесь тоже в ячейке b останется храниться 6, а не 7. И вообще, информация в ячейках памяти не меняется при вычислении выражений.
Примеры работы оператора if:
| Фрагмент программы | Что на экране |
|---|---|
a:=10; if a>2 then WriteLn('!!!') else WriteLn('!'); | !!! |
a:=4; if a>5 then a:=a+10 else a:=a-1; WriteLn(a); | 3 |
s:=6; if s-8<0 then s:=s+10; WriteLn(s); | 16 |
s:=6; if s<0 then s:=s+10; s:=s+1; WriteLn(s); | 7 |
Обратите внимание, что в последнем примере оператор
ifкончается операторомs:=s+10, а неs:=s+1. Поэтому операторs:=s+1будет выполняться всегда, независимо от величины s.
Дополнительный пример решения задачи
Задача:
Найти наибольшее значение из трех введённых чисел.
Решение:
Var a,b,c,max: Integer;
Begin
WriteLn('Введите три числа через пробел');
ReadLn(a,b,c);
max:=a; {Максимальным числом по умолчанию будем считать a}
if b>max then max:=b;
if c>max then max:=c;
WriteLn('Наибольшее число равно ',max);
End.
Дополните эту программу так, чтобы она выводила наименьшее значение из четырёх введённых чисел.
Задание 1
Определить без компьютера, что будет напечатано при выполнении следующих фрагментов программ:
k:=20;
k:=k+10;
if k+10<>30 then k:=8 else k:=k-1;
WriteLn(k);
k:=20;
k:=k+10;
if k+10=30 then k:=8 else k:=k-1;
WriteLn(k);
p:=1;
if p>0 then p:=p+5;
Write(p);
if p>10 then p:=p+1;
Write(p);
Задание 2
Решите следующие задачи:
- В компьютер вводятся два числа. Если первое больше второго, то вычислить их сумму, иначе - произведение. После этого компьютер должен напечатать текст ЗАДАЧА РЕШЕНА.
- В компьютер вводятся длины трех отрезков. Компьютер должен ответить на вопрос, правда ли, что первый отрезок не слишком длинен, чтобы образовать с другими двумя отрезками треугольник.
Указание: Для этого его длина должна быть меньше суммы длин двух других отрезков. Замечание: Пока не думайте о том, что слишком длинными могут быть второй или третий отрезки. Об этом – поговорим позже. - Дракон каждый год отращивает по три головы, но после того, как ему исполнится 100 лет - только по две. Сколько голов и глаз у дракона, которому N лет?
Турбо-Паскаль 7.0 - Самоучитель
Лукин С.Н.