В предыдущей статье мы говорили о возможности оптимизации программы. Вместо двух команд 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 «;» не ставиться.