- •Составитель а.М. Сулейманова
- •Содержание
- •Список литературы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 лабораторная работа
- •Цель работы
- •Теоретическая часть
- •2.1. Оператор присваивания
- •2.2. Составной оператор
- •2.3. Условные операторы
- •Оператор if
- •2.3.2. Оператор case
- •Оператор case имеет вид
- •2.4. Операторы цикла
- •2.4.1. Оператор while
- •2.4.2. Оператор repeat
- •2.4.3. Оператор for
- •2.5. Вложенные циклы
- •2.6. Оператор перехода и пустой оператор Оператор перехода имеет вид
- •3. Порядок выполнения работы
- •4. Требования к отчету
- •5. Контрольные вопросы
- •6. Варианты заданий
2.3.2. Оператор case
Рассмотренный выше оператор IF позволяет осуществить выбор одной из двух альтернатив. Но что если число вариантов нужно иметь больше? Например, если требуется согласно номерам дней недели отображать на экране их названия? Многие начинающие программисты для решения подобной задачи предпочтут воспользоваться последовательностью операторов IF:
if х=1 then write (понедельник);
if х=2 then write (вторник);
if x=3 then write (среда);
if x=4 then write (четверг);
if x=5 then write (пятница);
if x=6 then write (суббота);
if x=7 then write (воскресенье);
Однако такой подход затрудняет понимание исходного текста программы, поскольку сразу неочевидно, что здесь будет выполнен один и только один из семи операторов IF. Кроме того, такая конструкция малоэффективна, поскольку при этом условие придется проверять во всех семи операторах IF и это неизбежно увеличит время выполнения программы.
Целесообразнее воспользоваться вложенным оператором IF. Один вложенный оператор часто будет выполняться быстрее последовательности из нескольких операторов IF, поскольку при совпадении первого условия управление сразу передается следующему (после вложенного) оператору, без проверки оставшихся условий, но такая конструкция чересчур громоздка. (Считается, что в операторе IF допустимы не более двух-трех уровней вложения.) Здесь всего семь альтернатив, а что если вариантов выбора потребуется иметь несколько десятков? Применение оператора IF в этом случае крайне неудобно. Выйти из положения позволяет оператор CASE.
Оператор case имеет вид
case р of
a: s1;
b:s2;
…
n:sn;
else s(n+1)
end;
При выполнении этого оператора сначала вычисляется некоторое выражение Р, называемое селектором выбора, а затем, в зависимости от полученного значения (если оно равно одной из констант А, В, ..., N, которые называются константами выбора), выполняется один из операторов: S1, S2,..., Sn, - помеченный соответствующей константой. Причем каждый из этих операторов может быть составным. Операторы S1, S2, ..., Sn отделяются один от другого точками с запятой. Значение селектора выбора в операторе CASE может повторяться, однако в этом случае будет выполнена только первая подходящая ветвь, а затем управление передается следующему (после CASE) оператору в программе.
Если значение выражения Р не совпадает ни с одной из констант выбора, выполняется оператор S(n+1), содержащийся после ключевого слова ELSE, причем ветвь ELSE в операторе CASE необязательна. Использованные здесь зарезервированные слова CASE, OF, ELSE и END имеют смысл вариант, из, иначе и конец соответственно.
Выражение, играющее роль селектора выбора, должно принадлежать порядковому типу данных (т.е. типу, имеющему конечное число значений). К порядковым относятся, например, типы данных Integer, Boolean и Char. Однако тип Real порядковым не является.
Кроме одиночных констант, в вариантах оператора CASE могут использоваться диапазоны значений и списки (представленные через запятую):
case x of
1..5: sl
2, 3, 8:s2
4, 6, 9..13:s3
else
s4
end;
Так, в этом примере оператор s3 будет выполнен, если переменная X имеет одно из значений: 4, 6, 9, 10, 11, 12, 13.
Вернемся теперь к предыдущему примеру вложенного оператора IF (отображение названий дней недели). Попробуем реализовать эту задачу с помощью оператора CASE. Вот как это должно выглядеть:
case x of
1:write ('понедельник');
2:write ('вторник');
3:write ('среда');
4:write ('четверг');
5:write ('пятница');
6:write ('суббота');
7:write ('воскресенье');
end;