Sign in Join
Wiki copytemporary

Case/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Case/ru

OldNewLine
1+Зарезервированным словом **Case** начинается блок *инструкции выбора*. Инструкция **case** сравнивает значение перечислимого, порядкового или строкового типа для каждого селектора. Селектор может быть [[Const/ru|константой]], диапазоном или списком значений, разделенных [[Comma/ru|запятыми]]. Поле селектора отделяется от выполняемых инструкций [[Colon/ru|двоеточием]].
2+
3+Инструкция выбора также включает в себя [[Reserved word/ru|зарезервированные слова]] [[Of/ru|Of]] и [[End/ru|End]]. [[Else/ru|Else]] может использоваться в случае, когда не будет ни одного совпадения (в этом случае ветка **Else** будет выполняться по умолчанию).
4+
5+### Примеры
6+
7+``` pascal
8+ case place of
9+ 1: ShowMessage('Золотая медаль');
10+ 2: ShowMessage('Серебряная медаль');
11+ 3: ShowMessage('Бронзовая медаль');
12+ else ShowMessage('Повезет в следующий раз');
13+ end;
14+```
15+
16+``` pascal
17+ function WhatIsChar( c:char ):string;
18+ var
19+ s : string;
20+ begin
21+ s := '';
22+ case c of
23+ '0' .. '9' : s := 'цифра (0-9)';
24+ 'a' .. 'z' : s := 'строчная буква (a-z)';
25+ 'A' .. 'Z' : s := 'прописная буква (A-Z)';
26+ '+' , '-' : s := 'знак (+ или -)';
27+ end;
28+ result := s;
29+ end;
30+```
31+
32+## Выбор строк
33+
34+Язык Free Pascal позволяет использовать оператор "Case of" для строковых переменных.
35+
36+``` pascal
37+const
38+ ISO_3166_1_ALPHA_3_ANDORRA = 'AND';
39+ ISO_3166_1_ALPHA_3_AUSTRALIA = 'AUS';
40+ ISO_3166_1_ALPHA_3_AUSTRIA = 'AUT';
41+ ISO_3166_1_ALPHA_3_BELGIUM = 'BEL';
42+ ISO_3166_1_ALPHA_3_BRAZIL = 'BRA';
43+ ISO_3166_1_ALPHA_3_CANADA = 'CAN';
44+ ISO_3166_1_ALPHA_3_CHINA = 'CHN';
45+ ISO_3166_1_ALPHA_3_CZECH_REPUBLIC = 'CZE';
46+ ISO_3166_1_ALPHA_3_CYPRUS = 'CYP';
47+ ISO_3166_1_ALPHA_3_GERMANY = 'DEU';
48+ ISO_3166_1_ALPHA_3_DENMARK = 'DNK';
49+ ISO_3166_1_ALPHA_3_SPAIN = 'ESP';
50+ ISO_3166_1_ALPHA_3_ESTONIA = 'EST';
51+ ISO_3166_1_ALPHA_3_FINLAND = 'FIN';
52+ ISO_3166_1_ALPHA_3_FRANCE = 'FRA';
53+ ISO_3166_1_ALPHA_3_GREECE = 'GRC';
54+ ISO_3166_1_ALPHA_3_INDIA = 'IND';
55+ ISO_3166_1_ALPHA_3_IRELAND = 'IRL';
56+ ISO_3166_1_ALPHA_3_ITALY = 'ITA';
57+ ISO_3166_1_ALPHA_3_JAPAN = 'JPN';
58+ ISO_3166_1_ALPHA_3_LITHUANIA = 'LTU';
59+ ISO_3166_1_ALPHA_3_LATVIA = 'LVA';
60+ ISO_3166_1_ALPHA_3_LUXEMBOURG = 'LUX';
61+ ISO_3166_1_ALPHA_3_MALTA = 'MLT';
62+ ISO_3166_1_ALPHA_3_MEXICO = 'MEX';
63+ ISO_3166_1_ALPHA_3_MONACO = 'MCO';
64+ ISO_3166_1_ALPHA_3_MONTENEGRO = 'MNE';
65+ ISO_3166_1_ALPHA_3_NAURU = 'NRU';
66+ ISO_3166_1_ALPHA_3_NETHERLANDS = 'NLD';
67+ ISO_3166_1_ALPHA_3_NORWAY = 'NOR';
68+ ISO_3166_1_ALPHA_3_POLAND = 'POL';
69+ ISO_3166_1_ALPHA_3_PORTUGAL = 'PRT';
70+ ISO_3166_1_ALPHA_3_REPUBLIC_OF_KOREA = 'KOR';
71+ ISO_3166_1_ALPHA_3_RUSSIAN_FEDERATION = 'RUS';
72+ ISO_3166_1_ALPHA_3_SAN_MARINO = 'SMR';
73+ ISO_3166_1_ALPHA_3_SLOVAKIA = 'SVK';
74+ ISO_3166_1_ALPHA_3_SLOVENIA = 'SVN';
75+ ISO_3166_1_ALPHA_3_SWEDEN = 'SWE' ;
76+ ISO_3166_1_ALPHA_3_SWITZERLAND = 'CHE';
77+ ISO_3166_1_ALPHA_3_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND = 'GBR';
78+ ISO_3166_1_ALPHA_3_UNITED_STATES_OF_AMERICA = 'USA';
79+
80+ ISO_4217_EURO = 'EUR';
81+ ISO_4217_AUSTRALIAN_DOLLAR = 'AUD';
82+ ISO_4217_BRAZILIAN_REAL = 'BRL';
83+ ISO_4217_CANADIAN_DOLLAR = 'CAD';
84+ ISO_4217_CHINESE_YUAN = 'CNY';
85+ ISO_4217_CZECH_KORUNA = 'CZK' ;
86+ ISO_4217_DANISH_KRONE = 'DKK' ;
87+ ISO_4217_INDIAN_RUPEE = 'INR';
88+ ISO_4217_POUND_STERLING = 'GBP' ;
89+ ISO_4217_JAPANESE_YEN = 'JPY';
90+ ISO_4217_MEXICAN_PESO = 'MXN';
91+ ISO_4217_NORWEGIAN_KRONE = 'NOK' ;
92+ ISO_4217_POLISH_ZLOTY = 'PLN' ;
93+ ISO_4217_RUSSIAN_RUBLE = 'RUB' ;
94+ ISO_4217_SOUTH_KOREAN_WON = 'KRW';
95+ ISO_4217_SWEDISH_KRONA = 'SEK' ;
96+ ISO_4217_SWISS_FRANC = 'CHF' ;
97+ ISO_4217_UNITED_STATES_DOLLAR = 'USD' ;
98+
99+function ISO_4217_currency_name ( ISO_3166_1_alpha_3_code: string): string;
100+begin
101+ Case ISO_3166_1_alpha_3_code of
102+ // Еврозона
103+ ISO_3166_1_ALPHA_3_ANDORRA, ISO_3166_1_ALPHA_3_AUSTRIA,
104+ ISO_3166_1_ALPHA_3_BELGIUM,ISO_3166_1_ALPHA_3_CYPRUS,
105+ ISO_3166_1_ALPHA_3_GERMANY, ISO_3166_1_ALPHA_3_SPAIN,
106+ ISO_3166_1_ALPHA_3_ESTONIA, ISO_3166_1_ALPHA_3_FINLAND,
107+ ISO_3166_1_ALPHA_3_FRANCE, ISO_3166_1_ALPHA_3_GREECE,
108+ ISO_3166_1_ALPHA_3_IRELAND, ISO_3166_1_ALPHA_3_ITALY,
109+ ISO_3166_1_ALPHA_3_LITHUANIA, ISO_3166_1_ALPHA_3_LATVIA,
110+ ISO_3166_1_ALPHA_3_LUXEMBOURG, ISO_3166_1_ALPHA_3_MONACO,
111+ ISO_3166_1_ALPHA_3_MALTA, ISO_3166_1_ALPHA_3_MONTENEGRO,
112+ ISO_3166_1_ALPHA_3_NETHERLANDS, ISO_3166_1_ALPHA_3_PORTUGAL,
113+ ISO_3166_1_ALPHA_3_SAN_MARINO, ISO_3166_1_ALPHA_3_SLOVAKIA,
114+ ISO_3166_1_ALPHA_3_SLOVENIA : result := ISO_4217_EURO ;
115+
116+ ISO_3166_1_ALPHA_3_AUSTRALIA, ISO_3166_1_ALPHA_3_NAURU :
117+ result := ISO_4217_AUSTRALIAN_DOLLAR;
118+ ISO_3166_1_ALPHA_3_BRAZIL : result := ISO_4217_BRAZILIAN_REAL;
119+ ISO_3166_1_ALPHA_3_CANADA : result := ISO_4217_CANADIAN_DOLLAR;
120+ ISO_3166_1_ALPHA_3_CHINA : result := ISO_4217_CHINESE_YUAN;
121+ ISO_3166_1_ALPHA_3_CZECH_REPUBLIC : result := ISO_4217_CZECH_KORUNA ;
122+ ISO_3166_1_ALPHA_3_DENMARK : result := ISO_4217_DANISH_KRONE ;
123+ ISO_3166_1_ALPHA_3_INDIA : result := ISO_4217_INDIAN_RUPEE;
124+ ISO_3166_1_ALPHA_3_JAPAN : result := ISO_4217_JAPANESE_YEN;
125+ ISO_3166_1_ALPHA_3_MEXICO : result := ISO_4217_MEXICAN_PESO;
126+ ISO_3166_1_ALPHA_3_NORWAY : result := ISO_4217_NORWEGIAN_KRONE ;
127+ ISO_3166_1_ALPHA_3_POLAND : result := ISO_4217_POLISH_ZLOTY ;
128+ ISO_3166_1_ALPHA_3_REPUBLIC_OF_KOREA : result := ISO_4217_SOUTH_KOREAN_WON ;
129+ ISO_3166_1_ALPHA_3_RUSSIAN_FEDERATION : result := ISO_4217_RUSSIAN_RUBLE ;
130+ ISO_3166_1_ALPHA_3_SWEDEN : result := ISO_4217_SWEDISH_KRONA ;
131+ ISO_3166_1_ALPHA_3_SWITZERLAND : result := ISO_4217_SWISS_FRANC ;
132+ ISO_3166_1_ALPHA_3_UNITED_KINGDOM_OF_GREAT_BRITAIN_AND_NORTHERN_IRELAND :
133+ result := ISO_4217_POUND_STERLING ;
134+ ISO_3166_1_ALPHA_3_UNITED_STATES_OF_AMERICA :
135+ result := ISO_4217_UNITED_STATES_DOLLAR ;
136+ end;
137+end;
138+```
139+
140+## Выбор перечислимых значений
141+
142+Если вы хотите использовать перечислимые типы, вот очень понятный пример:
143+
144+``` pascal
145+ type
146+ TMedal = (mGold, mSilver, mBronze); // в случае если вы хотите, чтобы Золотая начиналась с 1, поместите это значение (Gold=1, ...но
147+ const
148+ MedalNames: array [TMedal] of string[6] = ('Золотая', 'Серебряная', 'Бронзовая'); // в [TMedal] вы должны изменить его на [Gold..Bronze] ;) предложения по адресу edgarrod71@gmail.com
149+ {[ ... ]}
150+var
151+ place: integer; /// place начинается с 0;
152+ M: TMedal;
153+ {[ ... ]}
154+ M := TMedal(place);
155+ case M of
156+ mGold: ShowMessage(Medalnames[M] + ' медаль');
157+ mSilver: ShowMessage(Medalnames[M] + ' медаль');
158+ mBronze: ShowMessage(Medalnames[M] + ' медаль');
159+ else
160+ ShowMessage('Повезет в следующий раз! :)');
161+ end;
162+```
163+
164+Другой пример без использования массива MedalNames...
165+
166+``` pascal
167+ type
168+ TMedal = (Gold, Silver, Bronze); // без "m"
169+ {[ ... ]}
170+var
171+ place: integer; /// place начинается с 0;
172+ M: TMedal;
173+ S: string;
174+ {[ ... ]}
175+ M := TMedal(place);
176+ case M of
177+ Gold: writeStr(S, M);
178+ Silver: writeStr(S, M);
179+ Bronze: writeStr(S, M);
180+ else
181+ S := 'Повезет в следующий раз! ;)';
182+ end;
183+ ShowMessage(S);
184+```
185+
186+## Шестнадцатеричные числа в качестве входных значений
187+
188+Если используются [[Hexadecimal/ru|шестнадцатеричные]] числа, то они рассматриваются как беззнаковые:
189+
190+``` pascal
191+ case place of
192+ $1: ShowMessage('Золотая медаль');
193+ $2: ShowMessage('Серебряная медаль');
194+ $3: ShowMessage('Бронзовая медаль');
195+ else ShowMessage('Повезет в следующий раз');
196+ end;
197+```
198+
199+Если шестнадцатеричная переменная представлена в другом виде, например как [[Shortint/ru|Shortint]], то необходимо преобразовать значение:
200+
201+``` pascal
202+ case place of
203+ Shortint($C3): ShowMessage('Золотая медаль'); //C3= -61;
204+ Shortint($34): ShowMessage('Серебряная медаль');
205+ Shortint($58): ShowMessage('Бронзовая медаль');
206+ else ShowMessage('Повезет в следующий раз');
207+ end;
208+```
209+
210+или можно воспользоваться другим решением:
211+
212+``` pascal
213+var
214+ myplace : ShortInt;
215+ place : Byte absolute myplace;
216+begin
217+ myplace:=-61;
218+ case place of
219+ $C3: ShowMessage('Золотая медаль');
220+ $34: ShowMessage('Серебряная медаль');
221+ $58: ShowMessage('Бронзовая медаль');
222+ else ShowMessage('Повезет в следующий раз');
223+ end;
224+```
225+
226+## Вариантная запись
227+
228+**Case** также может использоваться в вариантной [[Record/ru|записи]]. Вариантная запись по-другому называется *объединение* (например, тип данных union в языке C).
229+
230+``` pascal
231+ type
232+
233+ ScaleKelvin = 223 .. 323;
234+ ScaleCelsius = -50 .. 50;
235+
236+ TemperatureScale = ( celsius, kelvin ) ;
237+ Temperature = record
238+ case scale : TemperatureScale of
239+ celsius : (celsius_value : ScaleCelsius);
240+ kelvin : (kelvin_value : ScaleKelvin);
241+ end;
242+```
243+
244+## См. также
245+
246+- [The Case statement](http://www.freepascal.org/docs-html/ref/refsu56.html#x162-18400013.2.2)
247+- [Record types](http://www.freepascal.org/docs-html/ref/refsu19.html#x43-500003.3.2)
248+- [Tao Yue: Learn Pascal!](http://lazarus-ccr.sourceforge.net/pascal/pas3cb.html) Case
249+- [Video: Free Pascal Tutorial 8 - Case Statements](http://www.youtube.com/watch?v=pMr2xtUu3x0)
250+- [[Dialog Examples/ru|ShowMessage]]
251+- [[Type/ru|Type]]
252+
253+---
254+*From the Free Pascal wiki, page "Case/ru", as it stood on 2020-01-24 after a change by Bart, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
255+Category: Control Structures/ru
256+Category: Pascal/ru

Back to history