3. Оператор выбора case -of.
Оператор выбора является обобщением оператора if-then-else на случай выбора одного из нескольких возможных продолжений выполнения программы. Выбор осуществляется по ключу выбора (селектору). Синтаксическая структура этого оператора такова:
case < ключ выбора > of
< константа выбора 1> : < оператор 1>;
. . . . . .
< константа выбора m> : < оператор m>;
[else < оператор>]
end;
где: < константа выбора > - значение того же типа, что и ключ выбора. Ключом выбора может быть выражение любого порядкового типа.
m - число ветвей выбора (не более чем мощность типа ключа выбора).
При выполнении оператора выбора вначале вычисляется значение ключа, а затем последовательным просмотром ветвей выбора отыскивается такая ветвь, для которой константа выбора совпадает со значением ключа. Оператор этой ветви выполняется, после чего оператор выбора завершает работу и передает управление следующему по тексту программы оператору. Ветвь else (если она присутствует) выполняется только в том случае, когда ни одна ветвь оператора case-of не выбрана. Если ветвь else отсутствует, то это эквивалентно ветви else с пустым оператором.
В ветвях выбора вместо констант выбора можно использовать список констант выбора (разделенных запятыми), либо диапазон констант выбора (заданный посредством .. также как для типа-диапазона). В этих случаях выбор ветви производится при равенстве константы из списка или из диапазона констант с ключом выбора.
Операторы выбора являются хорошо структурированным средством выбора из любого числа альтернатив и часто выполняют ту же функцию, что и вложенные операторы if-then-else.
4. Примеры программ с простыми типами и оператором выбора.
Следующая простая программа демонстрирует создание и использование перечислимого типа и оператора case-of.
program colors;{Выбор цвета из набора, заданного перечислимым типом}
uses CRT;
type color = (cWhite,cRed,cBlue,cGreen,cBlack); {перечислимый тип}
var b:0..4; c:color;
begin TextBackground(cyan);TextColor(white);ClrScr;window(10,10,50,20);
write('Введите число (от 0 до 4):');read(b);c:=color(b);
case c of cWhite: begin TextColor(white);writeln('white') end;
cRed: begin TextColor(red);writeln('red') end;
cBlue: begin TextColor(blue);writeln('blue') end;
cGreen: begin TextColor(green);writeln('green') end;
cBlack: begin TextColor(black);writeln('black') end;
end
end {colors}.
Эта программа иллюстрирует также так называемое приведение типа. Для любого типа можно использовать функцию с именем этого типа для преобразования переменной (или выражения) к заданному типу. Например, для описанного выше типа color допустим, оператор присваивания сol:= color(3); в результате такого присваивания переменная col типа color получит значение blue.
Замечание
|
Переменная с приведением типа рассматривается, как обычная переменная и может использоваться не только в выражениях, но и в левой части оператора присваивания. |
Приводимая ниже программа week_day иллюстрирует использование диапазонов типа и оператора case-of для определения дня недели по вводимой дате:
program week_day; {Вычисление дня недели по введённой дате}
uses CRT;
var d:1..31; m:1..12; year:1600..2000;{день, месяц, год}
wd:integer; {день недели} z:1..100; {год в столетии}
t:string[1];
begin TextBackground(cyan);TextColor(white);ClrScr;
window(10,10,50,20); TextBackground(blue);ClrScr;
repeat writeln(' введите дату:');
write(' Год:'); readln(year); write(' месяц:'); readln(m);
write(' день:'); readln(d); writeln(' день недели: ');
{вычисление по формуле Зеллера}
if m<3 then begin m:=m+10;year:=year-1 end
else m:=m-2; z:=year div 100; year:=year mod 100;
wd:=abs(trunc(2.6*m-0.2)+d+year div 4+year+z div 4-2*z);
wd:=wd mod 7; {конец вычисления} case wd of
0: writeln(' воскресенье');
1: writeln(' понедельник');
2: writeln(' вторник');
3: writeln(' среда');
4: writeln(' четверг');
5: writeln(' пятница');
6: writeln(' суббота'); end; readln(t)
until (t=' ')
end{week_day}.