Команда выбора «Case»

 В предыдущей статье мы говорили о возможности оптимизации программы. Вместо двух команд If мы использовали слово Else и экономили одну строку. Если представить, что по канонам программистов простая программа состоящая из нескольких сотен строк может нести в себе сотни проверок, то экономия существенная. А можно ли еще экономнее писать код?

А вот как поступить, если нужно по порядковому номеру месяца указать количество дней в нем. Как вариант:

var n: byte;
begin
write('Номер месяца: '); readln(n);
if n=1 then write('31 день');
if n=2 then write('28 дней');
if n=3 then write('31 день');
...
if n=12 then write('31 день');
writeln('Press Enter to Exit');
Readln;
end.

Как мы видим, код для номера месяца фактически одинаковый и рутинный. Может, существует структура, которая нам позволит сократить наш программный код. Действительно, таковая имеется в наборе команд Паскаля, и называется команда выбора «Case»
Общая структура команды:

case Выражение of
значение1 : оператор (группа операторов);
значение2 : оператор (группа операторов);
. . . . . . . . . . . . . . . . . . . . . .
значениеN : оператор (группа операторов)
else оператор (группа операторов);
end;

Выражение, по которому осуществляется выбор, может быть любого типа (кроме REAL и STRING).
Напоминаю: перед Else «;» не ставиться.
Оператор выбора работает следующим образом. Для начала вычисляется значение выражения, которое находится после зарезервированного слова case, а затем выполняется команда (или набор команд), которая соответствует результату выражения.
Бываю случаи, что в списке выбора не окажется значения, которое равно вычисленному значению в команде Case. В этом случае управление передается набору команд, стоящих после слова ELSE. Если ELSE отсутствует, то в этом случае просто ничего не выполняется.
Например:

a:=a mod 2
case a of
0 : writeln ('число четное')
else writeln ('число нечетное');
end;

Если один оператор выполняется при нескольких значениях проверяемой переменной, то их можно перечислить через запятую.
Пример: По номеру месяца указать квартал.

var n_month:byte;
Begin
write('N month='); readln(n_month);
case n_month of
1, 2, 3 : writeln ('Первый квартал');
4, 5, 6 : writeln ('Второй квартал');
7, 8, 9 : writeln ('Третий квартал');
10, 11, 12 : writeln ('Четвёртый квартал');
end; 
writeln('Press Enter to Exit');
Readln;
End.

Если оператор должен выполняться при нескольких последовательных значениях проверяемой переменной, образующих некоторый промежуток, можно использовать следующую форму записи:

var n_month:byte;
Begin
write('Номер месяца='); readln(n_month);
case n_month of
1..3 : writeln ('Первый квартал');
4..6 : writeln ('Второй квартал');
7..9 : writeln ('Третий квартал');
10..12 : writeln ('Четвёртый квартал');
end; 
writeln('Press Enter to Exit');
Readln;
End.

Пример: указать, является число цифрой или нет.

var Digits:integer;
Begin
write('Digits='); readln(Digits);
case Digits of
0..9 : writeln ('Число является цифрой');
else writeln (' Это не цифра, это число');
end;
writeln('Press Enter to Exit');
Readln;
End.

Пример: По номеру дня недели указать какой это день.

Var n: byte; 
Begin 
write('Порядковый номер дня=');Readln(n); 
Case n of 
1: writeln(‘понедельник ’); 
2: writeln(‘вторник ’); 
3: writeln(‘среда ’); 
4: writeln(‘четверг ’); 
5: writeln(‘пятница ’); 
6: writeln(‘суббота ’); 
7: writeln(‘воскресенье’); 
else writeln(‘дня недели с номером’, n,’нет’);
end;
end. 

Давайте теперь напишем нашу программу используя полученные новые знания:

var n: byte;
begin
write('Номер месяца: '); readln(n);
case n of
1,3,5,7,8,10,12: write(' 31 день');
2: write(' 28 дней');
4,6,9,11: write(' 30 дней');
end;
end.

Что нужно запомнить:
1. Общую структуру команды.
2. Формат записи.
3. Выражение, по которому осуществляется выбор, может быть любого типа (кроме REAL и STRING).
4. Перед Else «;» не ставиться.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии