Операторы выбора.
Мы познакомились с командой присваивания, командами ввода ивывода информации. Это так называемые простые операторы. Для того, чтобы было удобно записывать алгоритмы, используются алгоритмические конструкции. К таким алгоритмическим конструкциям относятся:
- составной оператор;
- условные операторы;
- циклы.
1. Составной оператор
Составной оператор представляет собой совокупность последовательно выполняемых операторов, заключенных в так называемые операторные скобки BEGIN и END.
BEGIN
<оператор 1>;
<оператор 2>;
...
<оператор n>
END;
Составной оператор используется в тех случаях, когда в соответствии с правилами построения конструкций языка можно использовать один оператор, а выполнить требуется несколько действий.
Отдельные операторы внутри составного оператора отделяются друг от друга точкой с запятой. Однако, перед ключевым словом END точку с запятой можно не ставить.
Использование сотавного оператора будет продемонстрировано ниже.
|
|
2. Оператор выбора IF.
Очень часто возникают ситуации, при которых необходимо сначала проверить некоторое условие, а затем, в зависимости от результатов проверки, выполнить какие-то действия.
Такой алгоритм в общем виде можно записать так:
Если <условие> то <действие>; (пример 1)
или
Если <условие> то <действие 1>
иначе <действие 2>; (пример 2)
Такая алгоритмическая конструкция называется развилкой и вязыке Pascal записывается следующим образом:
IF <условие>
ТHEN
<оператор 1>
ELSE
<оператор 2>
На месте команд могут быть записаны простые операторы или составные.Условия записываются, как правило, в виде логических выражений, построенных с помощью следующих отношений:
> больше
>= не меньше
< меньше
<= не больше
<> не равно
= равно
В качестве примера рассмотрим программу, которая определяет максимальное из двух чисел:
PROGRAM MAXIMUM;
VAR X,Y: INTEGER;
BEGIN
WRITE('Введите два целых числа: ');
READLN(X,Y);
WRITE('Максимальное из двух чисел равно ');
IF X>Y
THEN
WRITE(X)
ELSE
WRITE(Y)
END.
Обратите внимание, что ключевые слова THEN и ELSE отделяются от следующих за ними операторов пробелами (если вы поставитеточку с запятой, то это будет ошибкой!).
Если в команде ветвления после слов THEN или ELSE требуется выполнить не одну, а несколько команд, то они заключаются в операторные скобки BEGIN - END.
Например:
IF D<>0
THEN
BEGIN
X1:=((-B+sqrt(D))/(2*A);
X1:=((-B-sqrt(D))/(2*A);
END
ELSE
writeln('действительных корней нет');
Допустима и сокращенная форма команды ветвления:
IF <условие> THEN <оператор>;
Например: IF D<0 THEN WRITE('Делить на 0 нельзя');
|
|
3. Сложные условия
3.1. Что такое True и False
Все приведенные выше примеры содержат ПРОСТЫЕ условия. Под УСЛОВИЕМ мы будем понимать какое-либо выражение, о котором (после определения всех значений входящих в него переменных) можно сказать, что оно либо ИСТИННО либо. Например:
Ifa>bthen... - здесь условие a>b является True только тогда, когда значение переменной a больше значения переменной b. ЭТО ЖЕ условие можно записать по другому: a-b>0 или b<a или b-a<0. И во всех приведенных случаях выражение является истинным (True) тогда и только тогда, когда значение переменной a больше
значения переменной b.
Выражения, значения которых могут равняться True или False, принято называть ЛОГИЧЕСКИМИ. Как правило, в логических выражениях всегда присутствует знаки сравнения:
> - больше = - равно
>= - больше или равно <> - не равно
< - меньше
<= - меньше или равно
Попробуйте сами определить, когда приведенные ниже значения выражений являются True, а когда - False:
a=b a>=b a+1=b-1 s*s<=121 abs(x-x0)<e
3.2. Логический тип данных
Учитывая, что в языке Pascal имеются выражение, принимающие конкретные значения (True и False), был введен специальный тип данных. Этот тип данных принято называть ЛОГИЧЕСКИМ типом данных. Переменные данного типа описываются в блоке описания VAR с помощью ключевого слова BOOLEAN. Например:
varX: integer;
f: boolean;
...
Значением переменной f может быть либо True, либо False. True и False известны компилятору языка и Вы можете использовать их явно в программе. Например:
...
f:=True;
if f then WriteLn('А значение-то ИСТИННО!!!');
...
Как еще можно использовать переменные логического типа? Учитывая, что они принимают точно такие же значения, как и ЛОГИЧЕСКИЕ выражения, их можно использовать ВМЕСТО этих выражений (какпредложено в вышеприведенном примере). Возможные варианты:
...
Write('Сколько Вам лет'); ReadLn(Year);
Write('А сколько лет Вашему другу'); ReadLn(Year_Friend);
f:=(Year+5<Year_Friend);
if f then WriteLn('Ничегосебе, ВашдругстаршеВас
более чем на 5 лет?!');
...
Достаточно часто встречаются ситуации, когда одно и тоже условие используется в программе более одного раза. В этом случае приведенный способ использования ЛОГИЧЕСКОЙ переменной позволит Вам, во-первых, сократить текст программы, а, во-вторых, облегчит ее модификацию. Представляете, если одно и то же условие (логическое выражение) встречается в Вашей программе 10 раз, а потом вдруг выяснилось, что там ошибка...
3.3. Сложные условия
Давайте решим простую задачку:
Составить программу, которая определит возраст человека.
Решение.
Program YEARS;
Uses Crt;
Const year_1=1995; {Текущийгод}
var Old,year:integer;
Begin
ClrScr; {Очисткаэкрана}
Write('В каком году Вы родились:');
ReadLn(year);
Old:=year_1-year; {Вычислиливозраст}
If (Old<0) or (Old>150) then
WriteLn('Неврите, стольконеживут')
else
WriteLn('Вамполных ',Old,' лет');
RealLn
end.
Обратите внимание на СЛОЖНОЕ условие в операторе If. Слово OR (читается как О-О-Р) переводится как ИЛИ и называется ЛОГИЧЕСКОЙ ОПЕРАЦИЕЙ "ИЛИ". Кроме этой логической операции имеется еще ряд операций, которые приведены в таблице 1. В данной таблице в качестве F1 и F2 выступают логические выражения.
Таблица 1
Логические операции
|Логическая Название Запись Результат операции
|операция операции
---------------------------------------------------------------------------------------------
| Not Логическое |NOT F1 Логическое значение, про-
| "НЕ" тивоположное F1.
-------------------------------------------------------------------------------------------------
| And Логическое F1 and F2 Логическое значение True,
"И" если F1 и F2 равны True,
и False во всех остальных
случаях.
--------------------------------------------------------------------------------------------------
| Or |Логическое F1 or F2 Логическое значение True,
"ИЛИ" если хотя бы одно из зна-
чений F1 или F2 равно True
и False если F1 и F2 равны
False.
-------------------------------------------------------------------------------------------------
|
|
| Xor Логическое F1 xor F2 Логическое значение True,
| исключающее если значения F1 и F2 раз-
| "ИЛИ" личны, и False если они
равны.
------------------------------------------------------------------------------------------------
Например:
If (a>3)and(a<5) then... - условие истинно тогда и только тогда, когда a>3 И a<5. Во всех других ситуациях - False.
If (b+1>=4) or (c='ку-ку') then... - условие True тогда и только тогда, когда True одно из логических выражений, соединенных OR.
Пр.
y=x^2,если 1<x<=3.
if (x>1) and (x<=3) theny:=sqr(x) elsewriteln('функциянеопределена на данном промежутке');
Обратите внимание, что
+=============================================================+
| при записи СЛОЖНОГО логического выражения ПРОСТЫЕ выражения
| ЗАКЛЮЧАЮТСЯ В СКОБКИ!!!
+=============================================================+
4. Оператор множественного выбора CASE
С помощью этого оператора можно выбрать вариант из любого количества вариантов. Структура этого оператора в языке Pascal:
case <переменная> of
значение1:<оператор1>;
значение2:<оператор2>;
...
значениеN:<операторN>
else
<оператор>
end;
В этой структуре
Тип <переменной> д.б. целый, символьный, перечисляемый;
Из <операторов 1,2..., N>, выполняется тот, с константой которого (<значением 1,2,...N>) совпадает значение <переменной>;
Просто <оператор>,стоящий после else выполняется, если значение <переменной> не совпадает ни с одним из <значений 1,2,...N>.
Ветвь оператора else является необязательной. Рассмотрим пример простенькой программы, определяющей название месяца по его номеру:
Program Month;
Uses Crt;
Var num_month:byte;
begin
ClrScr;
WriteLn('Программа определяет название месяца по номеру':60);
Writeln;
WriteLn('Задайте номер месяца:'); ReadLn(num_month);
TextColor(LightMagenta);
Case num_month of
1: WriteLn('Январь');
2: WriteLn('Февраль');
3: WriteLn('Март');
4: WriteLn('Апрель');
5: WriteLn('Май');
6: WriteLn('Июнь');
7: WriteLn('Июль');
8: WriteLn('Август');
9: WriteLn('Сентябрь');
10: WriteLn('Октябрь');
11: WriteLn('Ноябрь');
12: WriteLn('Декабрь')
else WriteLn('Увы, месяца с таким номером не существует')
end; {Конец Case}
ReadLn;
End.
Пояснение.
При запуске программы выводится титул, а затем запрос на ввод номер месяца. Если введено число 1, то на экране появиться слово Январь, если 2 - Февраль и т.д. Если будет введено число 0 или больше 12 (и меньше 256), то на экране появится сообщение Увы, месяца с таким номером не существует. Если введете число меньше 0 или больше 255, то программа закончится аварийно.
|
|
Если для нескольких констант нужно выполнить один и тот же оператор, их можно перечислить через запятую или, если это возможно, указать диапазон и сопроводить их одним оператором.
Пример:
case I of
0,2,4,6,8: writeln('четнаяцифра');
1,3,5,7,9: writeln('нечетная цифра');
10..100: writeln('число от 10 до 100');
else
writeln('Отрицательное число или большее 100')
end;