Difference between revisions of "Case/ru"

From Free Pascal wiki
Jump to navigationJump to search
 
(Use pascal highlighter)
 
Line 8: Line 8:
 
=== Примеры ===
 
=== Примеры ===
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
  case place of
 
  case place of
 
   1: ShowMessage('Золотая медаль');
 
   1: ShowMessage('Золотая медаль');
Line 17: Line 17:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
  function WhatIsChar( c:char ):string;
 
  function WhatIsChar( c:char ):string;
 
  var
 
  var
Line 37: Line 37:
 
Язык Free Pascal позволяет использовать оператор "Case of" для строковых переменных.
 
Язык Free Pascal позволяет использовать оператор "Case of" для строковых переменных.
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
const
 
const
 
   ISO_3166_1_ALPHA_3_ANDORRA  = 'AND';
 
   ISO_3166_1_ALPHA_3_ANDORRA  = 'AND';
Line 145: Line 145:
  
 
Если вы хотите использовать перечислимые типы, вот очень понятный пример:  
 
Если вы хотите использовать перечислимые типы, вот очень понятный пример:  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
  type
 
  type
 
     TMedal = (mGold, mSilver, mBronze);  // в случае если вы хотите, чтобы Золотая начиналась с 1, поместите это значение (Gold=1, ...но
 
     TMedal = (mGold, mSilver, mBronze);  // в случае если вы хотите, чтобы Золотая начиналась с 1, поместите это значение (Gold=1, ...но
Line 167: Line 167:
 
Другой пример без использования массива MedalNames...
 
Другой пример без использования массива MedalNames...
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
  type
 
  type
 
     TMedal = (Gold, Silver, Bronze);  // без "m"
 
     TMedal = (Gold, Silver, Bronze);  // без "m"
Line 192: Line 192:
 
Если используются [[Hexadecimal/ru|шестнадцатеричные]] числа, то они рассматриваются как беззнаковые:
 
Если используются [[Hexadecimal/ru|шестнадцатеричные]] числа, то они рассматриваются как беззнаковые:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
  case place of
 
  case place of
 
   $1: ShowMessage('Золотая медаль');
 
   $1: ShowMessage('Золотая медаль');
Line 203: Line 203:
  
 
Если шестнадцатеричная переменная представлена в другом виде, например как [[Shortint/ru|Shortint]], то необходимо преобразовать значение:
 
Если шестнадцатеричная переменная представлена в другом виде, например как [[Shortint/ru|Shortint]], то необходимо преобразовать значение:
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
  case place of
 
  case place of
 
   Shortint($C3): ShowMessage('Золотая медаль');  //C3= -61;
 
   Shortint($C3): ShowMessage('Золотая медаль');  //C3= -61;
Line 212: Line 212:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
или можно воспользоваться другим решением:
 
или можно воспользоваться другим решением:
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
var
 
var
 
   myplace : ShortInt;
 
   myplace : ShortInt;
Line 230: Line 230:
 
'''Case''' также может использоваться в вариантной [[Record/ru|записи]]. Вариантная запись по-другому называется ''объединение'' (например, тип данных union в языке C).
 
'''Case''' также может использоваться в вариантной [[Record/ru|записи]]. Вариантная запись по-другому называется ''объединение'' (например, тип данных union в языке C).
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
   type
 
   type
 
        
 
        

Latest revision as of 22:24, 24 January 2020

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;

См. также