Оператор выбора case. Примеры задач.
Язык Паскаль имеет оператор выбора case, которая позволяет построить ветвление по ряду условий в форме, более удобной для чтения программ. Оператор выбора позволяет выбрать одно из нескольких возможных продолжений программы. Параметром, по которому осуществляется выбор, служит так называемый ключ выбора (или селектор) – выражение любого типа (кроме типов REAL и STRING).
Общая форма записи следующая:
case выражение of
значение1 : оператор (группа операторов);
значение2 : оператор (группа операторов);
. . . . . . . . . . . . . .
значениеN : оператор (группа операторов)
else оператор (группа операторов);
end;
Оператор выбора работает следующим образом. Сначала вычисляется значение выражения, стоящее после зарезервированного слова case, а затем выполняется оператор (или составной оператор), соответствующий результату вычисления выражения.
Может случиться, что в списке выбора не окажется константы равной вычисленному значению ключа. В этом случае управление передается оператору, стоящему за словом ELSE.
Если один оператор выполняется при нескольких значениях, то их можно перечислить через запятую.
case MONTH of
1, 2, 3 : writeln (’Первый квартал’);
4, 5, 6 : writeln (’Второй квартал’;
7, 8, 9 : writeln (’Третий квартал’;
10, 11, 12 : writeln (’Четвёртый квартал’);
end;
Любому заданному значению селектора соответствует лишь один вход в списке операторов. Константы должны принадлежать тому же типу, что и селектор. Если селектор принимает значение, которому не соответствует ни один вход, то будет выполняться оператор, следующий за словом else. Если же этого оператора нет, то никакие альтернативы не будут выполняться.
Var ch: char;
Begin
Readln(ch);
Case ch of
N, n: writeln(‘Да ’);
Y, y: writeln(‘Нет ’);
End;
End.
Case CH of {выражение-селектор литерного типа}
'A'.. 'z': WriteLn ('Введена латинская буква');
'0'.. '9': WriteLn ('Введена цифра')
end;
Пример.
Type
Month =(jan,feb,mar,apr,may,jun,
Jul,aug,sept,oct,nov,dec);
Var tec_mes: Month;
If tec_mes=okt then writeln(‘октябрь’);
If tec_mes<apr then writeln(‘первый квартал’);
Case tec_mes of
Jan.feb,mar:writeln(‘1 rv’);
…
Oct.nov,dec:writeln(‘4 rv’);
End;
Пример. Вычислить значения функций f и g:
Написать две программы, использующие:
вещественные значения;
целочисленную арифметику (целочисленные данные, промежуточные и конечные результаты, операции целочисленной арифметики, константу MAXINT, диапазоны оператора выбора Case).
Program example1;
{Программирование ветвящихся вычислительных процессов}
{использование вещественных значений }
Uses Crt;
Var
x,y,f,g:Real;
Begin
Clrscr; {Очистка экрана}
WriteLn('Введите значения x,y');
ReadLn (x,y);
WriteLn ('При x=',x:5:2,' y=',y:5:2);
If x+y<0 then
begin
WriteLn ('x+y=',x+y:5:2,'<0');
f:=1/sqrt(x*x+y*y);
g:=x-y;
end
else
If x+y<=5 then
begin
WriteLn ('0<=x+y=',x+y:5:2,'<=5');
f:=2*x*y;
g:=2*x+3;
end
else begin
WriteLn ('x+y=',x+y:5:2,'>5');
f:=1/(x+y);
g:=1/sqrt(x*x+1);
end;
WriteLn ('f=',f:6:4);
WriteLn ('g=',g:6:4);
ReadLn; {Задержка экрана}
End.
Program example2;
{Программирование ветвящихся вычислительных процессов}
{использование целочисленной арифметики }
Uses Crt;
Var
x,y,f,g:Integer;
Begin
Clrscr; {Очистка экрана}
WriteLn('Введите значения x,y');
ReadLn (x,y);
WriteLn ('При x=',x,' y=',y);
Case x+y of
-Maxint..-1: begin
WriteLn ('x+y=',x+y,'<0');
f:=1 div round(sqrt(x*x+y*y));
g:=x-y;
end;
0..5 : begin
WriteLn ('0<=x+y=',x+y,'<=5');
f:=2*x*y; g:=2*x+3;
end;
6..Maxint : begin
WriteLn('x+y=',x+y,'>5');
f:=1 div (x+y);
g:=1 div round (sqrt(x*x+1));
end
end;
WriteLn ('f=',f);
WriteLn ('g=',g);
ReadLn; {Задержка экрана}
End.
