Case/ru
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
français (fr) │
русский (ru) │
Зарезервированным словом Case начинается блок инструкции выбора. Инструкция case сравнивает значение перечислимого, порядкового или строкового типа для каждого селектора. Селектор может быть константой, диапазоном или списком значений, разделенных запятыми. Поле селектора отделяется от выполняемых инструкций двоеточием.
Инструкция выбора также включает в себя зарезервированные слова Of и End. Else может использоваться в случае, когда не будет ни одного совпадения (в этом случае ветка Else будет выполняться по умолчанию).
Примеры
case place of
1: ShowMessage('Золотая медаль');
2: ShowMessage('Серебряная медаль');
3: ShowMessage('Бронзовая медаль');
else ShowMessage('Повезет в следующий раз');
end;
function WhatIsChar( c:char ):string;
var
s : string;
begin
s := '';
case c of
'0' .. '9' : s := 'цифра (0-9)';
'a' .. 'z' : s := 'строчная буква (a-z)';
'A' .. 'Z' : s := 'прописная буква (A-Z)';
'+' , '-' : s := 'знак (+ или -)';
end;
result := s;
end;
Выбор строк
Язык Free Pascal позволяет использовать оператор "Case of" для строковых переменных.
const
ISO_3166_1_ALPHA_3_ANDORRA = 'AND';
ISO_3166_1_ALPHA_3_AUSTRALIA = 'AUS';
ISO_3166_1_ALPHA_3_AUSTRIA = 'AUT';
ISO_3166_1_ALPHA_3_BELGIUM = 'BEL';
ISO_3166_1_ALPHA_3_BRAZIL = 'BRA';
ISO_3166_1_ALPHA_3_CANADA = 'CAN';
ISO_3166_1_ALPHA_3_CHINA = 'CHN';
ISO_3166_1_ALPHA_3_CZECH_REPUBLIC = 'CZE';
ISO_3166_1_ALPHA_3_CYPRUS = 'CYP';
ISO_3166_1_ALPHA_3_GERMANY = 'DEU';
ISO_3166_1_ALPHA_3_DENMARK = 'DNK';
ISO_3166_1_ALPHA_3_SPAIN = 'ESP';
ISO_3166_1_ALPHA_3_ESTONIA = 'EST';
ISO_3166_1_ALPHA_3_FINLAND = 'FIN';
ISO_3166_1_ALPHA_3_FRANCE = 'FRA';
ISO_3166_1_ALPHA_3_GREECE = 'GRC';
ISO_3166_1_ALPHA_3_INDIA = 'IND';
ISO_3166_1_ALPHA_3_IRELAND = 'IRL';
ISO_3166_1_ALPHA_3_ITALY = 'ITA';
ISO_3166_1_ALPHA_3_JAPAN = 'JPN';
ISO_3166_1_ALPHA_3_LITHUANIA = 'LTU';
ISO_3166_1_ALPHA_3_LATVIA = 'LVA';
ISO_3166_1_ALPHA_3_LUXEMBOURG = 'LUX';
ISO_3166_1_ALPHA_3_MALTA = 'MLT';
ISO_3166_1_ALPHA_3_MEXICO = 'MEX';
ISO_3166_1_ALPHA_3_MONACO = 'MCO';
ISO_3166_1_ALPHA_3_MONTENEGRO = 'MNE';
ISO_3166_1_ALPHA_3_NAURU = 'NRU';
ISO_3166_1_ALPHA_3_NETHERLANDS = 'NLD';
ISO_3166_1_ALPHA_3_NORWAY = 'NOR';
ISO_3166_1_ALPHA_3_POLAND = 'POL';
ISO_3166_1_ALPHA_3_PORTUGAL = 'PRT';
ISO_3166_1_ALPHA_3_REPUBLIC_OF_KOREA = 'KOR';
ISO_3166_1_ALPHA_3_RUSSIAN_FEDERATION = 'RUS';
ISO_3166_1_ALPHA_3_SAN_MARINO = 'SMR';
ISO_3166_1_ALPHA_3_SLOVAKIA = 'SVK';
ISO_3166_1_ALPHA_3_SLOVENIA = 'SVN';
ISO_3166_1_ALPHA_3_SWEDEN = 'SWE' ;
ISO_3166_1_ALPHA_3_SWITZERLAND = 'CHE';
ISO_3166_1_ALPHA_3_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND = 'GBR';
ISO_3166_1_ALPHA_3_UNITED_STATES_OF_AMERICA = 'USA';
ISO_4217_EURO = 'EUR';
ISO_4217_AUSTRALIAN_DOLLAR = 'AUD';
ISO_4217_BRAZILIAN_REAL = 'BRL';
ISO_4217_CANADIAN_DOLLAR = 'CAD';
ISO_4217_CHINESE_YUAN = 'CNY';
ISO_4217_CZECH_KORUNA = 'CZK' ;
ISO_4217_DANISH_KRONE = 'DKK' ;
ISO_4217_INDIAN_RUPEE = 'INR';
ISO_4217_POUND_STERLING = 'GBP' ;
ISO_4217_JAPANESE_YEN = 'JPY';
ISO_4217_MEXICAN_PESO = 'MXN';
ISO_4217_NORWEGIAN_KRONE = 'NOK' ;
ISO_4217_POLISH_ZLOTY = 'PLN' ;
ISO_4217_RUSSIAN_RUBLE = 'RUB' ;
ISO_4217_SOUTH_KOREAN_WON = 'KRW';
ISO_4217_SWEDISH_KRONA = 'SEK' ;
ISO_4217_SWISS_FRANC = 'CHF' ;
ISO_4217_UNITED_STATES_DOLLAR = 'USD' ;
function ISO_4217_currency_name ( ISO_3166_1_alpha_3_code: string): string;
begin
Case ISO_3166_1_alpha_3_code of
// Еврозона
ISO_3166_1_ALPHA_3_ANDORRA, ISO_3166_1_ALPHA_3_AUSTRIA,
ISO_3166_1_ALPHA_3_BELGIUM,ISO_3166_1_ALPHA_3_CYPRUS,
ISO_3166_1_ALPHA_3_GERMANY, ISO_3166_1_ALPHA_3_SPAIN,
ISO_3166_1_ALPHA_3_ESTONIA, ISO_3166_1_ALPHA_3_FINLAND,
ISO_3166_1_ALPHA_3_FRANCE, ISO_3166_1_ALPHA_3_GREECE,
ISO_3166_1_ALPHA_3_IRELAND, ISO_3166_1_ALPHA_3_ITALY,
ISO_3166_1_ALPHA_3_LITHUANIA, ISO_3166_1_ALPHA_3_LATVIA,
ISO_3166_1_ALPHA_3_LUXEMBOURG, ISO_3166_1_ALPHA_3_MONACO,
ISO_3166_1_ALPHA_3_MALTA, ISO_3166_1_ALPHA_3_MONTENEGRO,
ISO_3166_1_ALPHA_3_NETHERLANDS, ISO_3166_1_ALPHA_3_PORTUGAL,
ISO_3166_1_ALPHA_3_SAN_MARINO, ISO_3166_1_ALPHA_3_SLOVAKIA,
ISO_3166_1_ALPHA_3_SLOVENIA : result := ISO_4217_EURO ;
ISO_3166_1_ALPHA_3_AUSTRALIA, ISO_3166_1_ALPHA_3_NAURU :
result := ISO_4217_AUSTRALIAN_DOLLAR;
ISO_3166_1_ALPHA_3_BRAZIL : result := ISO_4217_BRAZILIAN_REAL;
ISO_3166_1_ALPHA_3_CANADA : result := ISO_4217_CANADIAN_DOLLAR;
ISO_3166_1_ALPHA_3_CHINA : result := ISO_4217_CHINESE_YUAN;
ISO_3166_1_ALPHA_3_CZECH_REPUBLIC : result := ISO_4217_CZECH_KORUNA ;
ISO_3166_1_ALPHA_3_DENMARK : result := ISO_4217_DANISH_KRONE ;
ISO_3166_1_ALPHA_3_INDIA : result := ISO_4217_INDIAN_RUPEE;
ISO_3166_1_ALPHA_3_JAPAN : result := ISO_4217_JAPANESE_YEN;
ISO_3166_1_ALPHA_3_MEXICO : result := ISO_4217_MEXICAN_PESO;
ISO_3166_1_ALPHA_3_NORWAY : result := ISO_4217_NORWEGIAN_KRONE ;
ISO_3166_1_ALPHA_3_POLAND : result := ISO_4217_POLISH_ZLOTY ;
ISO_3166_1_ALPHA_3_REPUBLIC_OF_KOREA : result := ISO_4217_SOUTH_KOREAN_WON ;
ISO_3166_1_ALPHA_3_RUSSIAN_FEDERATION : result := ISO_4217_RUSSIAN_RUBLE ;
ISO_3166_1_ALPHA_3_SWEDEN : result := ISO_4217_SWEDISH_KRONA ;
ISO_3166_1_ALPHA_3_SWITZERLAND : result := ISO_4217_SWISS_FRANC ;
ISO_3166_1_ALPHA_3_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND :
result := ISO_4217_POUND_STERLING ;
ISO_3166_1_ALPHA_3_UNITED_STATES_OF_AMERICA :
result := ISO_4217_UNITED_STATES_DOLLAR ;
end;
end;
Выбор перечислимых значений
Если вы хотите использовать перечислимые типы, вот очень понятный пример:
type
TMedal = (mGold, mSilver, mBronze); // в случае если вы хотите, чтобы Золотая начиналась с 1, поместите это значение (Gold=1, ...но
const
MedalNames: array [TMedal] of string[6] = ('Золотая', 'Серебряная', 'Бронзовая'); // в [TMedal] вы должны изменить его на [Gold..Bronze] ;) предложения по адресу edgarrod71@gmail.com
{[ ... ]}
var
place: integer; /// place начинается с 0;
M: TMedal;
{[ ... ]}
M := TMedal(place);
case M of
mGold: ShowMessage(Medalnames[M] + ' медаль');
mSilver: ShowMessage(Medalnames[M] + ' медаль');
mBronze: ShowMessage(Medalnames[M] + ' медаль');
else
ShowMessage('Повезет в следующий раз! :)');
end;
Другой пример без использования массива MedalNames...
type
TMedal = (Gold, Silver, Bronze); // без "m"
{[ ... ]}
var
place: integer; /// place начинается с 0;
M: TMedal;
S: string;
{[ ... ]}
M := TMedal(place);
case M of
Gold: writeStr(S, M);
Silver: writeStr(S, M);
Bronze: writeStr(S, M);
else
S := 'Повезет в следующий раз! ;)';
end;
ShowMessage(S);
Шестнадцатеричные числа в качестве входных значений
Если используются шестнадцатеричные числа, то они рассматриваются как беззнаковые:
case place of
$1: ShowMessage('Золотая медаль');
$2: ShowMessage('Серебряная медаль');
$3: ShowMessage('Бронзовая медаль');
else ShowMessage('Повезет в следующий раз');
end;
Если шестнадцатеричная переменная представлена в другом виде, например как Shortint, то необходимо преобразовать значение:
case place of
Shortint($C3): ShowMessage('Золотая медаль'); //C3= -61;
Shortint($34): ShowMessage('Серебряная медаль');
Shortint($58): ShowMessage('Бронзовая медаль');
else ShowMessage('Повезет в следующий раз');
end;
или можно воспользоваться другим решением:
var
myplace : ShortInt;
place : Byte absolute myplace;
begin
myplace:=-61;
case place of
$C3: ShowMessage('Золотая медаль');
$34: ShowMessage('Серебряная медаль');
$58: ShowMessage('Бронзовая медаль');
else ShowMessage('Повезет в следующий раз');
end;
Вариантная запись
Case также может использоваться в вариантной записи. Вариантная запись по-другому называется объединение (например, тип данных union в языке C).
type
ScaleKelvin = 223 .. 323;
ScaleCelsius = -50 .. 50;
TemperatureScale = ( celsius, kelvin ) ;
Temperature = record
case scale : TemperatureScale of
celsius : (celsius_value : ScaleCelsius);
kelvin : (kelvin_value : ScaleKelvin);
end;