|
|||
Примеры операторов CASE.17.1.1. Примеры операторов CASE.
Операторы CASE особенно полезны с перечислимыми типами. Процедура WriteMonth записывает строковое хначение, соотвествующее значению перечислимого типа Month.
PROCEDURE WriteMonth(VAR Fout: TEXT; Mo: Month); {Fout.3=W and Mo<>NoMonth --> записываем три символа соответствущих значению Mo в Fout.1} BEGIN {WriteMonth} CASE Mo OF Jan: WRITE(Fout, ‘Jan’); Feb: WRITE(Fout, ‘Feb’); Mar: WRITE(Fout, ‘Mar’); Apr: WRITE(Fout, ‘Apr’); May: WRITE(Fout, ‘May’); Jun: WRITE(Fout, ‘Jun’); Jul: WRITE(Fout, ‘Jul’); Aug: WRITE(Fout, ‘Aug’); Sep: WRITE(Fout, ‘Sep’); Oct: WRITE(Fout, ‘Oct’); Nov: WRITE(Fout, ‘Nov’); Dec: WRITE(Fout, ‘Dec’); END; END; {WriteMonth}
WriteMonth пердполагает, что Mo было присвоено одно из константных значений типа Month и явно исключает из своей области определения NoMonth. Более robust версия WriteMonth может проверять, что Mo имеет одно из двенадцати значений типа Month перед выполнением оператора CASE.
IF Mo IN [Jan .. Dec] THEN CASE Mo OF Jan: WRITE(Fout, ‘Jan’); Feb: WRITE(Fout, ‘Feb’); Mar: WRITE(Fout, ‘Mar’); Apr: WRITE(Fout, ‘Apr’); May: WRITE(Fout, ‘May’); Jun: WRITE(Fout, ‘Jun’); Jul: WRITE(Fout, ‘Jul’); Aug: WRITE(Fout, ‘Aug’); Sep: WRITE(Fout, ‘Sep’); Oct: WRITE(Fout, ‘Oct’); Nov: WRITE(Fout, ‘Nov’); Dec: WRITE(Fout, ‘Dec’); END;
Защищая оператор CASE таким способом, программист может быть уверен, что он всегда (на всех Паскаль-машинах) будет выполняться корректно. Операторы CASE также полезны при работе с типами данных, содержащими много значений, если одрабатываются небольшие наборы возможных вариантов. Например, процедура, которая считывает символы и выполняет специальные действия для некоторых символов, может быть написана с использованием следующего шаблона.
WHILE NOT EOF DO BEGIN READ(Ch); IF Ch IN [‘+’, ‘-‘, ‘*’, ‘/’] THEN CASE Ch OF ‘+’, ‘-‘: BEGIN WRITELN(‘Обнаружен аддитивный оператор’); CASE Ch OF ‘+’: NumPlus := NumPlus + 1; ‘-‘: NumMinus := NumMinus + 1 END END; ‘*’, ‘/‘: WRITELN(‘Обнаружен мультипликативный оператор’); END ELSE NumOther := NumOther + 1; END
Обратите внимание на вложенный оператор CASE в котором действия группируются и вновь разбиваются. Похожим образом несколько вариантов неограниченного типа могут быть удобно обработаны:
IF AnswerCount <= 1 THEN CASE AnswerCount OF 0: WRITE(‘There are none.’); 1: WRITE(‘There is 1.’); END ELSE WRITE(‘There are ’, AnswerCount:3)
|
|||
|