Составной оператор
При решении задач часто приходится рассматривать не два, а большее количество вариантов. Это можно реализовать, используя несколько условных операторов. В этом случае после служебных слов Then и Else записывается новый условный оператор. Если в условном операторе после then или после else нужно выполнить несколько операторов, то используют составной оператор – конструкцию вида:
begin <последовательность операторов> end.
Пример 1. Нахождение корней квадратного уравнения.
program n_11;
var a, b, c: real; var d: real; var x, x1, x2: real;
begin
writeln ('Решение квадратного уравнения');
write ('Введите коэффициенты a, b, c >>');
readn (a, b, c);
d:=b*b-4*a*c;
if d<0 then writeln ('Корней нет');
if d=0 then
begin
x:=-b/2/a;
writeln ('Корень уравнения x=', x:9:3)
end;
if d>0 then
begin
x1:=(-b+sqrt(d))/2/a;
x2:=(-b-sqrt(d))/2/a;
writeln ('Корни уравнения:');
writeln ('x1=', x1:9:3);
writeln ('x2=', x2:9:3)
end;
end.
Пример 2. Написать программу, которая по введенному с клавиатуры числу будет определять название месяца, количество дней в месяце и время года.
program number_of_month;
var month:byte;
begin
write('Введите номер месяца: ');
readln (month);
if (month<1) or (month>12) then writeln('Вы ввели неверный номер месяца!')
else
begin
write('Название месяца месяца: ');
if month=1 then writeln('январь')
else
if month=2 then writeln('февраль')
else
if month=3 then writeln('март')
else
if month=4 then writeln('апрель')
else
if month=5 then writeln('май')
else
if month=6 then writeln('июнь')
else
if month=7 then writeln('июль')
else
if month=8 then writeln('август')
else
if month=9 then writeln('сентябрь')
else
if month=10 then writeln('октябрь')
else
if month=11 then writeln('ноябрь')
else writeln('декабрь');
end;
write('Количество дней в месяце: ');
if (month=1) or(month=3)or(month=5)or(month=7) or (month=8)or(month=10)or(month=12) then writeln('31')
else
if (month=4)or(month=6)or(month=9)or(month=11)then writeln('30')
else writeln('28 или 29');
write('Время года: ');
if (month>=3)and (month<=5)then writeln('весна')
else
if (month>=6)and (month<=8)then writeln('лето')
else
if (month>=9)and (month<=11)then writeln('осень')
else writeln('зима');
End.
Программа выполняет все заданные условия, но она очень громоздкая. Вы уже заметили насколько этот подход однообразный и утомительный. Язык Паскаль предоставляет для этих целей другую управляющую структуру (оператор выбора case), которая позволяет построить ветвление по ряду условий в форме, более удобной для чтения программ.
Оператор выбора CASE
Оператор выбора позволяет выбрать одно из нескольких возможных продолжений программы. Параметром, по которому осуществляется выбор, служит так называемый ключ выбора (или селектор) - выражение любого типа (кроме типов REAL и STRING).
Общая форма записи следующая:
case выражение of
значение1 : оператор (группа операторов);
значение2 : оператор (группа операторов);
. . . . . . . . . . . . . . . . . . . . . .
значениеN : оператор (группа операторов)
else оператор (группа операторов);
end;
Оператор выбора работает следующим образом. Сначала вычисляется значение выражения, стоящее после зарезервированного слова case, а затем выполняется оператор (или составной оператор), соответствующий результату вычисления выражения.
Может случиться, что в списке выбора не окажется константы равной вычисленному значению ключа. В этом случае управление передается оператору, стоящему за словом ELSE.
Например,
case NUMBER mod 2 of
0 : writeln (NUMBER, ‘-
число
четное
‘)
else : writeln (NUMBER, ‘-
число
нечетное
‘);
end;
Если один оператор выполняется при нескольких значениях, то их можно перечислить через запятую.
case MONTH of
1, 2, 3 : writeln (‘Первый квартал‘);
4, 5, 6 : writeln (‘Второй квартал‘);
7, 8, 9 : writeln (‘Третий квартал‘);
10, 11, 12 : writeln (‘Четвёртый квартал‘);
end;
Оператором может являться не только простой оператор, но также составной и пустой операторы.
case CODE of
1 : for i := 1 to 5 do
writeln (‘*******‘);
2 : begin {
составной
оператор
}
x:=sqr(y-1);
writeln (x);
end;
3 : {
пустой
оператор
}
end;
Любому заданному значению селектора соответствует лишь один вход в списке операторов. Константы должны принадлежать тому же типу, что и селектор. Если селектор принимает значение, которому не соответствует ни один вход, то будет выполняться оператор, следующий за словом else. Если же этого оператора нет, то никакие альтернативы не будут выполняться.
Если оператор должен выполняться при нескольких значениях селектора следующих друг за другом, образуя некоторый промежуток, то это можно записать в более сжатой форме. Например,
case Chislo of
0..9 : write (‘Это число является цифрой‘);
Упростим наш второй пример, используя оператор выбора CESE.
program number_of_month;
var month:byte;
begin
write('Введите номер месяца: ');
readln (month);
if (month<1) or (month>12) then writeln('Вы ввели неверный номер месяца!')
else
begin
write('Название месяца месяца: ');
case month of
1: writeln('январь');
2: writeln('февраль');
3: writeln('март');
4: writeln('апрель');
5: writeln('май');
6: writeln('июнь');
7: writeln('июль');
8: writeln('август');
9: writeln('сентябрь');
10: writeln('октябрь');
11: writeln('ноябрь')
else writeln('декабрь');
end;
write('Количество дней в месяце: ');
case month of
1,3,5,7,8,10,12: writeln('31');
4,6,9,11: writeln('30');
else writeln('28 или 29');
end;
write('Время года: ');
case month of
3..5: writeln('весна');
6..8: writeln('лето');
9..11: writeln('осень');
else writeln('зима');
end;
end;
End.
Теперь программа выглядит более компактно и читабельно.