«Программы без ошибок можно написать
двумя способами, но работает — третий»
Алан Джей Перлис
Приветствую вас на нашем очередном занятии. Сегодня урок будет посвящен оператору варианта Case
.
Оператор Case
— это оператор множественного ветвления. То есть в зависимости от некоторого условия может быть выполнено одно из многочисленных продолжений программы. Рассмотрим структуру оператора Case
, а затем я поясню на бытовом примере, как это работает.
Case <селектор> of
<константа 1> : <оператор 1>;
<константа 2> : <оператор 2>;
.............................
<константа N> : <оператор N>;
else <оператор>
end;
где Case
— зарезервированное слово (от англ. «выбор», «вариант»);
<селектор>
— выражение, исходя из значения которого будет выбран оператор из списка для дальнейшего выполнения;
of
— зарезервированное слово (от англ. «из»);
<константа>
— константа выбора;
<оператор>
— любые операторы языка Pascal, в том числе может быть составной или пустой операторы;
else
— зарезервированное слово (от англ. «иначе»). Если ни одна из констант не подошла к селектору, то будут выполнены операторы, следующие за else. Блок else не обязателен, поэтому если его нет, оператор case завершит свою работу, так и не выполнив ни одного оператора из списка;
end
— зарезервированное слово (от англ. «конец»), завершение оператора варианта.
Разберем работу оператора Case на примере. Каждый из вас, прежде чем выйти на улицу одевает одежду. Выбор этой одежды во многом зависит от температуры на улице. Если на термометре -15, то вы наденете куртку, брюки и сапоги. А если на улице +20, ваш выбор будет состоять из майки, шорт и сандалий. Представьте, что термометр с его показаниями температуры — это своего рода <селектор>
в программе. В роли <констант>
выступают градусы цельсия, а в роли <операторов>
ваш гардероб. Тогда программу, которая выбирает гардероб в зависимости от температуры, можно записать следующим образом:
program garderob;
var
temperatura:integer;
begin
write('Температура = ');
read(temperatura);
case temperatura of
-24..-15 : writeln('Шапка-ушанка, фуфайка, ватные штаны, валенки');
-14..0 : writeln('Шапка, теплая куртка, штаны, ботинки');
1..10 : writeln('Куртка, штаны, ботинки');
11..17 : writeln('Ветровка, джинсы, кроссовки');
18..25 : writeln('Кепка, майка, сандалии');
26..35 : writeln('Плавки, маска, ласты');
else writeln('Лучше остаться дома')
end;
end.
Пользователь вводит значение температуры, если это значение расположено в интервале от -24 до +35 градусов цельсия, то программа находит среди констант ту, которая равна введенному значению, и выводит на экран список гардероба, соответствующий этой температуре. Если введенное значение температуры лежит за пределом от -24 до +35, то на экран выводится сообщение из блока else
— ‘Лучше остаться дома’.
Несколько важных замечаний
- Тип селектора должен быть ординальным. То есть он может быть любого типа, кроме вещественного
Real
(более подробно о типах данных читай здесь); - Тип константы должен совпадать с типом селектора. То есть, если у вас селектор имеет тип integer, то и константы выбора должны быть типа integer;
- Каждое из постоянных значений должно быть сопоставлено самое большее с одним оператором. То есть, говоря простым языком, константы не должны повторяться;
- Константы выбора НЕ являются метками. То есть на них нельзя ссылаться в операторе перехода
goto
(об этом операторе будет отдельный урок).
Примеры ошибочного написания оператора Case:
Пример №1 — селектор не может иметь тип real
program one;
var
x:real;
begin
read(x);
case x of
1 : writeln('one');
2 : writeln('two');
3 : writeln('three');
4 : writeln('four');
end;
end.
Пример №2 — тип констант не совпадает с типом селектора:
program two;
var
x:integer;
begin
read(x);
case x of
'A' : writeln('one');
'B' : writeln('two');
'C' : writeln('three');
'D' : writeln('four');
end;
end.
Пример №3 — повторение константы (константа 2 встречается два раза в списке):
program three;
var
x:integer;
begin
read(x);
case x of
1,2 : writeln('one');
2,3 : writeln('two');
4 : writeln('three');
5..7 : writeln('four');
end;
end.
Кстати, в этом примере наглядно показано, что <константа>
может быть не только простым числом, но и представлять собой некий диапазон. Запись диапазона происходит следующим образом: <начало>..<конец>
Также <константа>
может быть задана перечисляемым списком. Такой список записывается через запятую, например (при x:integer):
case x of
0, 1, 2 : <операторы 1>;
3, 4, 5 : <операторы 2>;
6, 9, 15 : <операторы 3>;
end;
через запятую и в одинарных кавычках (при x:char):
case x of
'A', 'B', 'C' : <операторы 1>;
'D', 'E', 'F' : <операторы 2>;
'Monday', 'Tuesday', 'Wednesday' : <операторы 3>;
end;
Это все, о чем я хотел вам сегодня рассказать. Надеюсь, материал был понятен. Для закрепления навыков обязательно посетите раздел Практика, в нем собраны задачи по разным темам и даны готовые решения. Если возникли какие-то вопросы, не стесняйтесь задавать их, контакты для связи со мной находятся здесь. Если вопросов нет — жду вас на следующем уроке. Всего доброго!
В предыдущем примере, в программе
контроля веса, множественный выбор был
реализован при помощи вложенных одна
в другую инструкций if.
Такой подход не всегда удобен,
особенно в том случае, если количество
вариантов хода программы велико.
В языке Delphi
есть инструкция case,
которая позволяет эффективно реализовать
множественный выбор. В общем виде она
записывается следующим образом:
case
Селектор
of
список1:
begin
{
инструкции
1 }
end;
список2:
begin
{
инструкции
2
}
end;
списокN:
begin
{
инструкции N
}
end;
else
begin
{
инструкции
}
end;
end;
где:
• селектор
– выражение, значение
которого определяет дальнейший ход
выполнения программы (т. е. последовательность
инструкций, которая будет выполнена);
• списокN
– список констант.
Если константы представляют собой
диапазон чисел, то вместо списка
можно указать первую и последнюю
константу диапазона, разделив их
двумя точками. Например, список 1, 2, 3,
4, 5, 6 может быть заменен диапазоном
1..6.
Выполняется инструкция
case
следующим образом:
1. Сначала вычисляется значение
выражения-селектора.
2. Значение выражения-селектора
последовательно сравнивается с
константами из списков констант.
3. Если значение выражения совпадает
с константой из списка, то выполняется
соответствующая этому списку группа
инструкций. На этом выполнение
инструкции case завершается.
4. Если значение выражения-селектора
не совпадает ни с одной константой
из всех списков, то выполняется
последовательность инструкций, следующая
за else.
Синтаксис инструкции case
позволяет не писать else
и соответствующую
последовательность инструкций. В этом
случае, если значение выражения не
совпадает ни с одной константой из всех
списков, то выполняется следующая
за case
инструкция программы. На рис. 5.6 приведен
алгоритм, реализуемый инструкцией
case.
Рис. 5.6. Алгоритм, реализуемый инструкцией
Case
Ниже приведены примеры инструкции
case.
case
n_day of
1,2,3,4,5:
day:=’Рабочий день.’;
б:
day: =’Суббота!’;
7:
day:=’Воскресенье!’;
end;
case
n_day of
1..5:
day:=’Рабочий день.’;
6:
day:=’Суббота!’;
7:
day:=’Воскресенье!’;
end;
case
n_day of
6:
day:=’Суббота!’;
7:
day: = ‘Воскресенье!’;
else
day:=’Рабочий день.’;
end;
В качестве примера использования
инструкции case рассмотрим
программу, которая пересчитывает
вес из фунтов в килограммы. Программа
учитывает, что в разных странах
значение фунта разное. Например, в
России фунт равен 409,5 граммов, в Англии
– 453,592 грамма, а в Германии, Дании и
Исландии фунт весит 500 граммов.
В диалоговом окне программы, изображенном
на рис. 5.7, для выбора страны используется
список Страна.
Рис. 5.7. Форма окна программы Пример
использования case
Для выбора названия страны используется
список – компонент ListBox.
Значок компонента ListBox
находится на вкладке Standard.
Добавляется список к форме приложения
точно так же, как и другие компоненты,
например, командная кнопка или поле
редактирования. В табл. 5.6 приведены
свойства компонента ListBox.
Таблица 5.6
Свойства компонента ListBox
Свойство |
Определяет |
Name |
Имя компонента. В программе |
Items |
Элементы списка |
ItemIndex |
Номер выбранного элемента |
Left |
Расстояние от левой границы списка |
Top |
Расстояние от верхней |
Height |
Высоту поля списка |
Width |
Ширину поля списка |
Font |
Шрифт, используемый для |
ParentFont |
Признак наследования свойств шрифта формы |
Наибольший интерес представляют
свойства items
и itemIndex.
Свойство items
содержит элементы списка. Свойство
itemIndex
задает номер выбранного элемента
списка. Если ни один из элементов не
выбран, то значение свойства равно
минус единице. Список может быть
сформирован во время создания формы
или во время работы программы.
Для формирования списка во время
создания формы надо в окне Object
Inspector
выбрать свойство items
и щелкнуть на кнопке запуска редактора
строк (рис. 5.8). В открывшемся диалоговом
окне String
List
Editor
(рис. 5.9) нужно ввести список, набирая
каждый элемент списка в отдельной
строке. После ввода очередного элемента
списка для перехода к новой строке
необходимо нажать клавишу <Enter>.
После ввода последнего элемента клавишу
<Enter>
нажимать не надо. Завершив ввод списка,
следует щелкнуть на кнопке ОК.
Рис.5.8. Кнопка запуска редактора строк
Рис.5.9. Окно редактора строк
В табл. 5.7 перечислены компоненты формы
приложения с указанием их назначения,
а в табл. 5.8 приведены значения
некоторых свойств этих компонентов,
используемых при работе приложения
Таблица 5.7
Компоненты формы
Компонент |
Назначение |
ListBox1 |
Для выбора страны, для которой надо пересчет |
Edit1 |
Для ввода веса в фунтах |
Label1,Label2, |
Для вывода пояснительного текста о полей |
Label4 |
Для вывода результата пересчета |
Button1 |
Для активизации процедуры пересчета фунтов |
Таблица
5.8
Значения свойств компонентов
Свойство |
Значение |
Form1.Caption |
Пример использования |
Edit1.Text |
|
Label1.Caption |
Выберите страну, введите |
Label2.Caption |
Страна |
Label3.Caption |
Фунтов |
Button1.Caption |
Вычислить |
Процедура пересчета, которая выполняется
в результате щелчка на командной
кнопке Вычислить, умножает вес в
фунтах на коэффициент, равный количеству
килограммов в одном фунте. Значение
коэффициента определяется по номеру
выбранного из списка элемента [3].
В программе
используются две процедуры обработки
событий:
procedure
TForm1.FormCreate(Sender: TObject);
begin
{
ListBox1.items.add(‘Россия’);
ListBox1.items.add(‘Австрия’);
ListBox1.items.add(‘Англия’);
ListBox1.items.add(‘Германия’);
ListBox1.items.add(‘Дания’);
ListBox1.items.add(‘Исландия’);
ListBox1.items.add(‘Италия’);
ListBox1.items.add(‘Нидерланды’);
}
ListBox1.itemindex:=0;
end;
procedure
TForm1.Button1Click(Sender: TObject);
var
funt:real;
// вес в фунтах
kg:real;
// вес в килограммах
k:real;
// коэффициент пересчета
begin
k:=0;
case
ListBox1.ItemIndex of
0:
k:=0.4059; // Россия
1:
k:=0.453592;// Англия
2:
k:=0.56001; // Австрия
3..5,7:k:=0.5;
// Германия, Дания, Исландия, Нидерланды
6:
k:=0.31762; // Италия
end;
funt:=StrToFloat(Edit1.Text);
kg:=k*funt;
label4.caption:=Edit1.Text+
‘ фунт. — ‘
+
FloatToStrF(kg,ffFixed,6,3)+ ‘ кг.’;
end;
Следует обратить внимание на процедуру
обработки события FormCreate,
которое происходит в момент создания
формы (форма создается автоматически
при запуске программы). Эту процедуру
можно использовать для инициализации
переменных программы, в том числе и для
добавления элементов в список. В
приведенном тексте программы инструкции
создания списка закомментированы, т.
к. список был создан при помощи редактора
строк во время создания формы.
Рассмотрим еще один пример использования
инструкции case.
При выводе числовой информации с
поясняющим текстом возникает проблема
согласования выводимого значения
и окончания поясняющего текста.
Например, в зависимости от числового
значения поясняющий текст к денежной
величине может быть: «рубль», «рублей»
или «рубля» (123 рубля, 20 рублей, 121 рубль).
Очевидно, что окончание поясняющего
слова определяется последней цифрой
числа, что отражено в табл. 5.9.
Таблица
5.9
Зависимость окончания текста от
последней цифры числа
Цифра |
Поясняющий текст |
0, 5, 6, 7, 8, 9 |
Рублей |
1 |
Рубль |
2,3,4 |
Рубля |
Приведенное в таблице правило имеет
исключение для чисел, оканчивающихся
на 11, 12, 13, 14. Для них поясняющий текст
должен быть «рублей». Диалоговое окно
программы приведено на рис. 5.10.
Рис. 5.10. Диалоговое окно программы
Поясняющий
текст формирует процедура обработки
события OnKeyPress:
procedure
TForm1.Edit1KeyPress(Sender:TObject;var Key:Char);
var
n
: integer; // число
r
: integer; // остаток от
деления n на 10
text:
string[10]; // формируемый
поясняющий текст
begin
if
Key = chr(VK_RETURN) then
begin
n
:= StrToInt(Edit1.Text);
if
n > 100
then
r:=n mod 100;
if
( r >= 11) and ( r <= 14)
then
text:=’
рублей’
else
begin
r:=
n mod 10;
case
r of
1:
text:=’ рубль’;
2
.. 4: text:=’ рубля’;
else
text:=’ рублей’;
end;
end;
Label2.Caption
:= IntToStr(n)+ text;
end;
end;
Приведём пример полезных процедур, в
которых используется case.
Это процедуры обработки событий
KeyPress. Примеры
процедур запрета ввода недопустимых
символов для программы расчёта дохода
по вкладу. Первая процедура определяет
допустимость ввода символов, составляющих
целое число. Вторая – число вещественного
типа.
//
нажатие в поле срок
procedure
TForm1.Edit3KeyPress(Sender:TObject;var Key:Char);
begin
case
Key of
‘0’
.. ‘9’,#8:
; // цифры и <Backspace>
//перевод
фокуса управления на кнопку вычисления
стоимости
#13:
Button1.SetFocus { Summa(Edit3)} ;
else
Key := Chr(0); // символ
не
отображать
end;
end;
//
нажатие клавиши в поле Сумма
procedure
TForm1.Edit1KeyPress(Sender:TObject;var Key:Char);
begin
case
Key of
‘0’
.. ‘9’, #8 : ; //цифры и <Backspace>
#13:
Form1.Edit2.SetFocus; // <Enter>
‘.’,
‘,’:
begin
if
Key = ‘.’
then
Key:=’,’;
if
Pos(‘,’,Edit1.Text) <> 0
then
Key:=
Chr(0);
end;
else
// все остальные символы запрещены
Key
:= Chr(0);
end;
end;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
01.
case
02.
Селектор
03.
of
04.
список!:
05.
begin
06.
07.
08.
09.
10.
11.
end
;
12.
списокn:
13.
begin
14.
15.
end
;
16.
else
17.
begin
18.
19.
end
;
20.
end
;
где: П Селектор — выражение, значение которого определяет дальнейший ход выполнения программы (т. е. последовательность инструкций, которая будет выполнена);
Управляющие структуры языка Delphi 99П Список n — список констант. Если константы представляют собой диапазон чисел, то вместо списка можно указать первую и последнюю константу диапазона, разделив их двумя точками. Например, список 1, 2, 3,4, 5, 6 может быть заменен диапазоном 1..6.
Выполняется инструкция case следующим образом:
- Сначала вычисляется значение выражения-селектора.
- Значение выражения-селектора последовательно сравнивается с кон-стантами из списков констант.
- Если значение выражения совпадает с константой из списка, то выпол-няется соответствующая этому списку группа инструкций. На этом вы-полнение инструкции case завершается.
- Если значение выражения-селектора не совпадает ни с одной констан-той из всех списков, то выполняется последовательность инструкций,следующая за else.
Синтаксис инструкции сазе позволяет не писать else и соответствующуюпоследовательность инструкций. В этом случае, если значение выраженияне совпадает ни с одной константой из всех списков, то выполняется следующая за case инструкция программы.
Ниже приведены примеры инструкции саsе:
02.
case
n_day
of
03.
1
,
2
,
3
,
4
,
5
: dау:=
'Рабочий день.'
04.
6
: day: =
'Суббота! '
;
05.
7
: dау:=
'Воскресенье! '
;
06.
end
;
07.
case
n_day
of
08.
1..5
: dау:=
'Рабочий день.'
;
09.
6
: dау: =
'Суббота! '
,-
10.
7
: dау:=
'Воскресенье! '
;
11.
end
;
12.
case
n_day
of
13.
6
: day: =
' Суббота! '
;
14.
7
: day:=
'Воскресенье!'
;
15.
else
day:=
'Рабочий день!'
;
16.
end
;
Помоги проекту! Расскажи друзьям об этом сайте:
Не редко встречаются такие задачи, где действие должно выполняться в зависимости от значения некоторого условия.
Реализовать это в программе без оператора выбора будет не так-то просто, хотя и не невозможно.
Поэтому знание и умение использовать оператор выбора Case важно в багаже знаний любого программиста.
Для начало определим, чем же является оператор вариантов ( выбора ).
Оператор выбора или вариантов Case
Оператор выбора Case – это форма условного оператора (А условные оператор, как нам уже известно, используется в разветвляющихся вычислительных процессах), используемая для множественного выбора.
Иногда оператор Case называют еще оператором множественного выбора. Верны оба названия. Суть от них не меняется.
Оператор выбора на блок-схеме
Основы оператора выбора Case
Определимся с основными понятиями, изображенными на блок-схеме.
Селектор – это переменная или выражение порядкового типа данных.
Может быть сложно для понимания, что такое порядковый тип данных, хотя это понятие схоже с математическим в некотором роде.
Порядковый тип данных – к нему относятся типы данных, каждому из значений которого, можно поставить соответственный порядковый номер.
К порядковому типу данных не относиться только вещественный тип (real).
Case <Селектор> Of <Метка 1> : <Оператор 1> ; <Метка 2> : <Оператор 2> ; . . . . . . . . . . . . ; <Метка N> : <Оператор N ; End;
В качестве меток используется одно из значений селектора.
Это значит, что селектор каким-то образом изменяет свое значение, а эти значения уже известны, и они уже присвоены меткам. В таком случае значение селектора совпадает с какой-либо меткой, и затем выполняется действие, указанное после метки.
Если действие должно выполняться при нескольких значениях селектора ( оператора case ), то допускается перечисление этих меток через запятую. ( Т.е. для одинаковых действий )
В операторе
case можно использовать служебное слово else, если не выполняется ни одно действие по заданному значению селектора.
Case <Селектор > Of <Метка 1> : <Оператор 1> ; <Метка 2> : <Оператор 2> ; . . . . . . . . . . . .. ; <Метка N> : <Оператор N> Else <Оператор N+1> ; End;
Если после метки стоит не одни оператор, а несколько, то они заключаются в операторные скобки (begin – end
Предоставляю вашему вниманию задачу на вычисление суммы цифр в числе. Часто встречается такое условие в лабораторных работах.
Алгоритмическая структура ветвления программируется в языке Pascal с
помощью условного оператора.
Условный оператор позволяет проверить некоторое условие и в зависимости от
результатов проверки выполнить то или иное действие.
Таким образом, условный оператор – это средство ветвления вычислительного
процесса.
Условный оператор позволяет выбрать одно из двух действий. Существует 2
вида условного оператора:
1) if <условие> then <оператор
1> — неполная форма;
2) if <условие> then < оператор 1> else < оператор 2> — полная форма;
где if, then, else –
зарезервированные слова («если», «то», «иначе»); оператор 1,оператор 2 – любые операторы языка Pascal.
Операторы бывают простые и составные.
Простой оператор состоит из одного оператора.
Если при некотором условии надо выполнить определенную последовательность
операторов, то их объединяют в один составной оператор. Составные операторы
заключаются в операторные скобки begin и end.
Условный оператор будет иметь вид:
if условие then begin …… end else begin …… end.
Пример.
Составить программу, определяющую наименьшее значение из двух чисел.
Program Minimum; Var a, b, min : real; begin writeln('Введите два числа'); write('a='); readln(a); write('b='); readln(b); if a< b then min:=a ELSE min:=b; writeln ('Минимальное из двух чисел ',min); end.
Вложенные операторы
ветвления
Когда после ключевых слов then или else
вновь используются условные операторы, они называются вложенными.
Число вложений может быть произвольно, при этом действует правило:else всегда относится к ближайшему оператору if, для которого ветка else еще не
указана, однако это можно изменить с помощью операторных скобок.
Оператор множественного ветвления (оператор выбора)
Условный оператор позволяет при выполнении программы выбирать одно из двух
возможных действий. Если же необходимо сделать много взаимоисключающих
проверок, то удобней воспользоваться оператором множественного ветвления
(оператор выбора).
Оператор выбора является обобщением условного оператора: он дает
возможность выполнить один из нескольких операторов в зависимости от
значения некоторого выражения, называемого селектором.
В общем случае оператор имеет вид:
case <селектор> of <метка 1>:<оператор 1>; <метка 2>:; ............................ <метка N>:<оператор N> else <оператор (n+1)>; end;
где case (выбор), of (из ), end (конец) – зарезервированные слова;
СЕЛЕКТОР – переменная или выражение порядкового типа;
ОПЕРАТОР – любой оператор языка, в том числе и составной;
МЕТКА – список значений выражения СЕЛЕКТОР или одно его значение.
Тип МЕТКИ совпадает с типом СЕЛЕКТОРА и состоит из любого числа отделенных
друг от друга запятыми констант или диапазонов, за которыми следует
двоеточие, например:
case berdsight of 'C','c': curlews := curlews+1; 'H','h': herons := herons+1; 'E','e': egrets := egrets+1; 'T','t': terns := terns+1; end;
Диапазоны записываются как две константы, отделенные друг от друга
разделителем диапазона ‘..’. MЕТКА ВАРИАНТА – необычная метка: это не
обязательно целое число, она не описывается в разделе label, на нее нельзя
ссылаться в операторе goto.
ОПЕРАТОР, который следует за МЕТКОЙ, выполняется, если значение СЕЛЕКТОРА
равно одной из констант или если он лежит внутри одного из диапазонов. В
противном случае будет выполняться оператор, следующий за case.
Селектор иногда называют ключом выбора.
Пример.
Определить день недели по его номеру.
program day; var n: integer; Begin write('введите число 1–7 n= '); readln(n); case n of 1: writeln('понедельник '); 2: writeln('вторник '); 3: writeln('среда '); 4: writeln('четверг '); 5: writeln('пятница '); 6: writeln('суббота '); 7: writeln('воскресенье'); else writeln('дня недели с номером ', n,' нет'); end; end
Следует помнить, что все константы из списка выбора должны быть различны.
Любому из операторов списка выбора может предшествовать не одна, а
несколько констант выбора, разделенных запятыми. Например, следующая
программа при вводе одного из символов ‘y’ или ‘Y’ выведет на экран «Да», а
при вводе ‘n’ или ‘N’ – слово «Нет».
Пример
программы с использованием Case of с несколькими переменными.
Program P1; Var ch: char; Begin Write('Введите значение переменной: '); Readln(ch); Case ch of 'N', 'n': writeln('Да '); 'Y', 'y': writeln('Нет '); End; End.
Пример
программы, которая по заданному символу определяет, к какой группе он
относится.
Program P2; Var c: char; Begin Write('Введите символ: '); Readln(c); case c of 'A'..'Z','a'..'z': writeln ('Латинская буква'); 'А'..'Я','а'..'п','р'..'я': writeln ('Русская буква'); '0'..'9': writeln ('Цифра'); else writeln ('Другой символ'); end; end
Просмотров 2.2к. Обновлено
Урок из серии: «Язык программирования Паскаль»
В этом уроке будет рассмотрено использование оператора выбора Select Case.
На предыдущем уроке было показано, как использовать оператор If … hten для выбора одного из двух возможных продолжений алгоритма.
Если один оператор If может обеспечить выбор из двух альтернатив, то оператор выбора case позволяет сделать выбор из произвольного числа имеющихся вариантов.
С помощью операторе If … them тоже можно организовать проверку более двух условий, если использовать вложенные операторы If … then, но запись с оператором Select Case получается более компактной и более понятной.
Оператор выбора case состоит из выражения, называемого селектором (selection — выбор альтернативы) и списка операторов, каждому из которых предшествует список констант выбора (список может состоять из одной константы).
case <выражение -селектор> of <список 1>: <оператор 1;> <список 2>: <оператор 2;> . . . <список n>: <оператор n;> [else <оператор>] end;
Здесь ветвь else заключается в квадратные скобки, что говорит о том, что эта часть оператора выбора не обязательна.
Алгоритм выполнения оператора выбора:
- Вычисляется выражение, которое должно принимать значение, принадлежащее порядковому типу (например, оно не может быть вещественного типа).
- В случае если результат вычисления равен одной из перечисленных констант, то выполняется соответствующий оператор. Затем управление передается за пределы оператора выбора.
- Если значение выражения не совпадает ни с одной константой, то выполняется оператор, стоящий после else, если он есть, либо управление передается на оператор end и выполнение программы продолжается.
Для одной альтернативы вместо одного оператора можно указать несколько операторов, заключив их в операторные скобки.
Правила использования оператора:
- Тип константы должен совпадать с типом выражения
- В этой конструкции перед else стоит точка с запятой.
- Все константы в альтернативах должны быть уникальны в пределах оператора выбора (т.е. повторение констант в альтернативах не допускается).
Пример 1. По введенному номеру дня недели вывести на экран его название.
program primer7_1; var day:byte; begin writeln('Введите номер дня недели: '); readln(day); case day of 1: writeln('Понедельник'); 2: writeln('Вторник'); 3: writeln('Среда'); 4: writeln('Четверг'); 5: writeln('Пятница'); 6: writeln('Суббота'); else writeln('Воскресенье'); end; end.
Пример 2. В восточном календаре принят 60-летний цикл, состоящий из 12-летних подциклов, обозначаемых названиями цвета: зеленый, красный, желтый, белый и черный.
В каждом подцикле годы носят названия животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, курицы, собаки и свиньи.
По номеру года выведите его название, если 1984 год был началом цикла — годом зеленой крысы.
program case_a; var k, ost_12, ost_10, god_n, god_k: integer; color, animal: string; begin writeln('Введите номер года: '); readln(god_k); god_n := 1984; // Начало цикла k:= god_k - god_n+1; // Порядковый номер года в цикле ost_12:= k mod 12; ost_10:= k mod 10; case ost_12 of 1: animal:='крысы'; 2: animal:='коровы'; 3: animal:='тигра'; 4: animal:='зайца '; 5: animal:='дракона'; 6: animal:='змеи'; 7: animal:='лошади'; 8: animal:='овцы'; 9: animal:='обезьяны '; 10: animal:='курицы'; 11: animal:= 'собаки'; 0: animal:='свиньи'; end; case ost_10 of 1,2: if (ost_12=3) or (ost_12=4) then color:='зеленого' else color:='зеленой'; 3,4: if (ost_12=3) or (ost_12=4) then color:='красного' else color:='красной'; 5,6: if (ost_12=3) or (ost_12=4) then color:='желтого' else color:='желтой'; 7,8: if (ost_12=3) or (ost_12=4) then color:='белого' else color:='белой '; 9,0: if (ost_12=3) or (ost_12=4) then color:='черного' else color:='черной'; end; writeln('Год ', color, ' ', animal); end.
Пример 3. Составьте программу, которая по заданному году и номеру месяца определяет количество дней в этом месяце.
program case_b1; var god, mes, k: integer; begin // Год является високосным в двух случаях: либо он кратен 4, но при этом не кратен 100, либо кратен 400. writeln('Введите год и номер месяца:'); readln(god, mes); case mes of 1, 3, 5, 7, 8, 10, 12 : k:=31; 4, 6, 9, 11: k:=30; 2: if ((god mod 4 =0) and (god mod 100 <> 0)) or (god mod 400 = 0) then k:=29 else k:=28; else k:=0 end; If k<>0 then writeln('Кол-во дней в месяце:', k) else writeln('Неверный номер месяца.'); end.
Задания для самостоятельного выполнения
- Составьте программу, которая переводила бы арабские цифры в римские.
- Составить программу, которая по номеру месяца определяла время года.
В этом уроке было показано, как использовать оператор Select Case для выбора из нескольких вариантов.
Проверь себя!
На следующем уроке Вы познакомитесь со средой программирования Pascal ABC.
Следующий урок: Язык программирования Pascal ABC. Структура окна.