Конструкция case на языке Delphi
Конструкция “caseof” является оператором выбора в языке Delphi и используется для исполнения какого-либо одного действия среди нескольких возможных вариантов.
Оператор выбора имеет следующую форму:
case<селектор>of
<список 1>: <инструкции для выполнения>
<список 2>: <инструкции для выполнения>
…
<списокn>: <инструкции для выполнения>
else<инструкции для выполнения>
end;
Селектор здесь является выражением, значением которого определяется дальнейший ход развития событий в программе.
В списках представлены возможные варианты значения селектора. В зависимости от них совершаются необходимые инструкции. Списки могут состоять из одного значения, из нескольких, разделенных через запятую, или из их диапазона.
Блок со словом else является необязательным. Инструкции в нём выполняются, если значение селектора не найдено в списках. Оператор case можно реализовать и при помощи нескольких операторов if. Конструкции, приведенные ниже, будут эквивалентны между собой.
Несколько вложенных условных операторов.
ifn = 1 then// довольно громоздкая конструкция для трёх возможных выполняемых операторов
writeln(‘n = 1’)
else
if n = 0 then
writeln(‘n = 0’)
else
writeln(‘n > 1’);
Один оператор case
case n of
0 :writeln(‘n = 0’);
1 :writeln(‘n = 1’);
elsewriteln(‘n > 1’);
end;
Также для каждого из списков могут быть представлены сразу несколько операторов. Они заключаются в конструкции begin-end.
Пример такого представления:
var x: integer;
x := 0;
casexof
0, 1 : begin
writeln(‘x = 0’);// между операторами begin и end может быть сколько угодно операторов
writeln(‘or’);
writeln(‘x = 1’);
end;
2 :writeln(‘x = 2’);
elsewriteln(‘x > 2’);
end;
Вывод:
x = 0
or
x = 1
В отличие от языка TurboPascal в Delphi не разрешено дублирование индексов в списках. Поэтому запись, представленная ниже, будет считаться некорректной в данном языке.
var n: integer;
begin
n := 1;
case n of
1..5 : writeln(‘1..5’);
3 :writeln(‘3’); // 3 уже входит в диапазон от 1 до 5, поэтому данный код нескомпилируется
end;
end.
Использование case на практике
Case применим не только для целых чисел, но и для любого стандартного типа.
Пример использования оператора case с диапазоном из целых чисел
var n: integer;
begin
n := 1;
case n of
1..5: writeln (‘1..5’);// диапазон чисел обозначается через
6,7: writeln(‘6..7’);// также возможна запись значений списка через запятую
end;
end.
Вывод:
1..5
Использование оператора caseс булевым типом
varb: boolean;
begin
b := false;
case b of
false: writeln (‘Result: false’);
true: writeln(‘Result: true’);
end;
end.
Вывод:
‘Result: false’
Применение case с перечисляемым типом
type TCol = (Red, Blue, Green, Yellow);
varcol: TCol;
begin
col := Blue;
case col of
Blue: writeln (‘Color is blue!’);
Green: writeln(‘Color is green!’);
Red: writeln(‘Color is red!’);
Yellow: writeln(‘Color is yellow!’);
end;
end.
Вывод:
‘Result: false’
Case со строками в Delphi
В языке Delphi конструкцию case нельзя использовать с переменными типа string. Код, приведённый ниже, в отличие от языка Pascal в Delphi не скомпилируется:
var n: integer;
s: string;
begin
n := 1;
s := ‘str’;
casesof // на этой строке происходит ошибка компиляции из-за несовместимости типов
‘str’ : writeln(‘String One’);
‘str2’ :writeln(‘String Two’);
end;
end.
Данную проблему можно решить при помощи приведения строк к перечисляемому типу. Сделать это возможно при помощи функции GetEnumValue из модуля TypInfo. Пример использования string в операторе выбора в Delphi:
uses
SysUtils, TypInfo;
type
TStrings = (black, blue, white, yellow); // создание перечисляемого типа
var
V :TStrings; // объявление переменной перечисляемого типа
s :string;
begin
s := ‘blue’;
v := TStrings(GetEnumValue(TypeInfo(TStrings), s));//преобразование строки в перечисляемый тип
casevof// выбор из значений перечисляемого типа
black: writeln(‘Color: black’);
blue: writeln(‘Color: blue’);
white: writeln(‘Color: white’);
yellow: writeln(‘Color: yellow’);
else
writeln(‘Other color’);
end;
end.