Конструкция 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *