Оператор перехода
Оператор case
Оператор case предназначен для организации выбора из множества различных вариантов. В общем случае оператор case выглядит следующим образом:
case <выражение> of <список выбора> else <оператор> end;
Здесь case, of, else, end - ключевые слова (пер. с англ.: выбор, из, иначе, конец);
<выражение> - выражение любого порядкового типа;
<список выбора> - одна или более конструкций вида: <значение>: <оператор>;
<значение> - константа или константное выражение того же типа, что и <выражение>;
<оператор> - любой оператор Турбо-Паскаля, в том числе и составной.
Работа оператора начинается с вычисления <выражения>. Значение этого выражения является критерием для выбора из нескольких вариантов. Если полученное значение выражения совпадает с одной из констант, то выполняется тот оператор, которому предшествует эта константа. Если такой константы не обнаруживается, то выполняется оператор следующий за ключевым словом else. Ветвь else может отсутствовать, и в этом случае управление передается оператору следующему за оператором case.
Ниже приведены примеры, демонстрирующие работу оператора выбора.
program pr4;
var n:integer;
begin
writeln('Введите число');
read(n);
case n mod 2 of
1: writeln(n,'- нечетное');
0: writeln(n,'- четное');
end;
end.
Следующая программа по номеру месяца определяет время года.
program pr5;
var month: integer;
begin
writeln('Введите число - номеp месяца');
read(month);
case month of
12,1,2: writeln(month,' - зимний месяц');
3,4,5: writeln(month,' - весенний месяц');
6,7,8: writeln(month,' - летний месяц');
9,10,11: writeln(month,' - осенний месяц');
else writeln('Пpо это мне неизвестно!');
end;
end.
Составим программу, имитирующую работу простейшего калькулятора, выполняющего четыре арифметических действия.
program pr6;
var
op: char ;{Арифметическая операция}
x,y,z: real;{Операнды и результат}
begin
write('x,y=');
readln(x,y);
write('Введите аpифметическую опеpация:');
readln(op);
case op of
'*': begin z := x* y; writeln('z=',z);end;
'/': begin z := x/ y; writeln('z=',z);end;
'+': begin z := x+y; writeln('z=',z);end;
'-': begin z := x- y; writeln('z=',z);end;
else writeln('Увы! Это не аpифметическая опеpация.' );
end;
end.
В языке Турбо-Паскаль имеются различные управляющие операторы, позволяющие написать любую программу. Тем не менее в языке имеется оператор безусловного перехода.
Безусловный переход приводит к передаче управления из одного места в программе в другое. Структура оператора перехода следующая:
goto <метка>
Здесь goto - ключевое слово (англ.: перейти на [метку]).
Метка - это произвольный идентификатор, позволяющий пометить некоторый оператор, чтобы ссылаться на него. Для совместимости со стандартным Паскалем разрешается в качестве метки использовать целые числа. Метка ставится перед оператором получающим управление и отделяется от него двоеточием. Как любой идентификатор метку необходимо описать в разделе описания меток, который начинается с ключевого слова label, за которым следует список меток:
...............
label m,1,loop;
begin
.........
goto 1;
m: .........
goto loop;
1: ............
goto m;
Метка, описанная в программе, обязательно должна использоваться. Метка, описанная в функции или процедуре, должна использоваться в той функции или процедуре, в которой она описана.
3.2.6. ПРИМЕР РАЗВЕТВЛЯЮЩЕЙСЯ ПРОГРАММЫ
Как и в разделе с линейной программой, после разбора всех операторов и типов, необходимых для разветвляющейся программы, рассмотрим пример такой программы.
Поле шахматной доски опpеделяется паpой натуpальных чисел, каждое из котоpых не пpевосходит восьми: пеpвое число - номеp веpтикали (пpи счете слева напpаво), втоpое - номеp гоpизонтали (пpи счете снизу ввеpх). Даны натуpальные числа k,l,m,n, каждое из котоpых не пpевосходит восьми. Требуется выяснить, являются ли поля (k,l) и (m,n) полями одного цвета.
Прежде чем приступать к составлению алгоритма и программы, необходимо внимательно рассмотреть шахматную доску и прийти к выводу, что поля будут иметь одинаковый цвет, если сумма номеров горизонтали (k+l) и вертикали (n+m) того и другого поля будет четной или того (k+l) и другого (n+m) поля нечетной. Схема алгоритма приведена на рис.8, a программа на языке Турбо-Паскаль - в примере pr7.
program pr7;
var k,l,n,m:byte;
begin
writeln('Введите кооpдинаты полей k,l,n,m: ');
read(k,l,n,m);
if odd(k+l) and odd(n+m) or not odd(k+l) and not odd(n+m)
then writeln('Поля одного цвета ')
else writeln('Поля pазного цвета ');
end.
Рис. 8
Следует заметить, что приоритет операции not выше, чем and, а приоритет операции and выше, чем or. Функция odd – встроенная и возвращает true, если аргумент нечетный, и false, если аргумент четный.