Оператор выбора CASE
Данный оператор является обобщением условного оператора. Его общий вид следующий: case выражение of список_констант_1: оператор_1; список_констант_2: оператор_2; ... список_констант_n: оператор_n end; Здесь значения выражения и констант должны быть одного и того же скалярного типа (кроме real), т. е. integer, boolean, char, ограниченный тип или тип “перечисление”. Оператор выбора действует следующим образом: если значение выражения равно одной из констант, то выполняется соответствующий ей оператор. Затем управление передается за пределы оператора выбора. Если значение выражения не совпадает ни с одной константой, то управление сразу передается за пределы оператора выбора. Пример: case I+1 of 2: X: =0; 1OO, 3: X: =X*X; 4: X: =sin(X) end; A: =A+1; Если значение I+1 есть 100 или 3, то выполняется оператор X: =Х*Х, а затем управление передается на оператор А: =А+1. Замечание. Метки оператора case не описываются в разделе lаbel, и на них нельзя переходить оператором goto. В Тurbo Pascale оператор case может использоваться с ключевым словом else, имеющем тот же смысл, что и слово else в операторе if: case выражение of список_констант_1: оператор_1; .............................. список_констант_n: оператор_n else оператор end; Перед else, как и в операторе if, точка с запятой не ставится. Пример: program pr; Var I: char; Begin read (I); case I of 'A'.. 'Z', 'a'.. 'Z': Write (' Введена буква'); '0'.. '9': Write (' Введена цифра') else Write (' Введен символ, отличный от буквы и цифры') end; end. Кроме одиночных констант в альтернативах оператора варианта могут быть заданы списки и / или диапазоны значений, которые в этом случае должны разделятся символом ', ' (запятая), например: case Switch of 1.. 2: Proc1; 3, 4, 10.. 20: Proc2; 5, 6: Proc3 Else Proc4 End В этом примере оператор процедуры Proc 2 будет выполнен в том случае, когда переменная switch будет иметь одно из следующих значений: 3, 4, 10, 11, 12, …, 19, 20 При использовании оператора варианта должны выполнятся следующие правила: Значение выражения - “переключателя”, записанного после служебного слова case, должно принадлежать дискретному типу; для целого типа они должны лежать в диапазоне -32769.. 32768. Все константы, предшествующие операторам альтернатив, должны иметь тип, совместимый с типом выражения. Все константы в альтернативах должны быть уникальны в пределах оператора варианта (то есть повторения констант в альтернативах не допускаются); диапазоны не должны пересекаться и не должны содержать констант, указанных в данной или других альтернативах. Следует обратить внимание на то, что синтаксис языка предполагает один оператор для каждой альтернативы; при необходимости задания нескольких операторов следует сгруппировать их в составной оператор. В то же время ветвь else допускает последовательность операторов, разделенных символом ';' (точка с запятой). Примеры выполнения заданий алгоритмов разветвляющей структуры Пример 4.1 Составить структурную схему и программу для вычисления функции m: где а=0,0372; b=1, 74*10-2 Структурная схема алгоритма приведена на рис. 1. { Разветвляющейся алгоритм } Program razvet; Var A, B, M: real; M1, M2: real; Begin readln (A, B); M1: =-(Abs(A)+Abs(b))/(A*A+B*B); M1: =Exp(M1); M2: =Abs(A+B); C: =A*B; if C>0. 5 then WriteLn('M=', M1); Else if C>0,4 then {0,4<c<=0,5} WriteLn ('M=', M2); Else WriteLn (‘ счет завершен’) End. Рисунок 1 - Структурная схема к примеру 4.1 Пример 4.2 Составить структурную схему и программу для вычисления функции y: где Структурная схема приведена на рис. 2. Рисунок 2 - Структурная схема к примеру 4.2 program F1; Const Pi: =3.1416; Var A, B, X, Xн, Xк, Hx, Y: real; Begin read(A, B, Xн, Xк, Hх); X: =Xн while X<=Xк DO Begin if X<=-Pi/2 then Y: =2*sin(x) Else if X<Pi/2 then Y: =A*sin(X)+B Else Y: =cos(X); WriteLn(' X=', X, ' Y=', Y); X: =X+Hх end; end. Пример 4.3. Ввести номер дня недели и вывести соответствующий ему день недели на русском и английском языках. Program dnedeli; Var N: integer; (* номер дня недели *) Begin WriteLn ('Введите номер дня недели: '); read (N); case N of 1: WriteLn ('понедельник'); 2: WriteLn ('вторник'); 3: WriteLn ('среда'); 4: WriteLn ('четверг'); 5: WriteLn ('пятница'); 6: WriteLn (' суббота'); 7: WriteLn ('воскресенье') End end. Рис. 3 - Структурная схема к примеру 4.3 Пример 4. 4 Заданы три числа, обозначающие число, месяц и год. Составить программу определения номера этого дня с началом года. Указание: Високосный год это тот, у которого номер делится на 4, но не делится на 100, или у которого номер делится на 400. { Определение номера дня года } program ndg; Var D, M, G, DN, MM: integer Begin read (D, M, G); {D-день месяца, М-месяц, G-год} Write (D: 3, '. ', M: 2, '. ', G: 4, ' - '); Dg=D; (* Dg-день года *) for Mm: =1 to M-1 DO case Mm of 1, 3, 5, 7, 8, 10, 12: Dg: =Dg+31; 4, 6, 9, 11: Dg=Dg+30; 2: if (G mod 4=0) and (G mod 100<>0) OR (G mod 400=0) then Dg: =Dg+29 Else Dg: =Dg+28; End; WriteLn (Dg: 3, 'день года') End. Контрольные вопросы 1. Какой вычислительный процесс называется разветвляющимся? 2. Какие операторы передачи управления Вы знаете? 3. Оператор перехода, укажите на его общий вид. Целесообразность его использования в программе? Приведите пример. 4. Какие формы записи условного оператора Вы знаете? Приведите примеры. 5. Может ли условный оператор содержать в себе другие условные операторы? Как называется такая конструкция? Приведите примеры. 6. Зачем необходимо при отладке программы тестировать все ветви алгоритма? 7. Оператор выбора и его назначение. 8. Приведите пример программы с использованием вложенных операторов выбора. 9.Приведите пример программы с использованием вложенных операторов if. 10. Приведите пример программы с использованием условного оператора, внутри которого имеется составной оператор.
|