Оператор case разрешает сделать выбор между несколькими вариантами:
case of
: ;
[ : ;]
[ : ;]
[else ;]
end;
Замечание: Обратите внимание, что по окончании else двоеточие не ставится.
Существуют дополнительные правила, относящиеся к структуре этого оператора:
1. Тумблер обязан относиться лишь к порядковому типу данных, но не к типу longint.
2. Тумблер возможно переменной либо выражением.
3. Перечень констант может задаваться как явным перечислением, так и промежутком либо их объединением.
4. Повторение констант не допускается.
5. типы и Тип переключателя всех констант должны быть совместимыми.
Пример оператора выбора:
case symbol(* :char *) of
‘a’..’z’, ‘A..’Z’ : writeln(‘Это латинская буква’);
‘а’..’я’, ‘А..’Я’ : writeln(‘Это русская буква’);
‘0’..’9′ : writeln(‘Это цифра’);
‘ ‘,#10,#13,#26 : writeln(‘Это пробельный знак’);
else writeln(‘Это служебный знак’);
end;
Исполнение оператора case происходит следующим образом:
1. вычисляется значение тумблера;
2. полученный итог проверяется на принадлежность к тому либо иному перечню констант;
3. в случае если таковой перечень отыскан, то предстоящие испытания уже не производятся, а выполняется оператор, соответствующий выбранной ветви, по окончании чего управление передается оператору, следующему за главным словом end, которое закрывает всю конструкцию case.
4. в случае если подходящего перечня констант нет, то выполняется оператор, стоящий за главным словом else. В случае если else-ветви нет, то не выполняется ничего.
Иллюстрация if и case
Как пример, иллюстрирующего применение операторов ветвления, приведем пара разных реализаций функции sgn(x) — символ числа х. Из математики как мы знаем, что эта функция имеет следующие значения:
sgn(x) = -1, в случае если x 0;
sgn(x) = 0, в случае если x = 0;
sgn(x) = 1, в случае если x 0.
Реализовать эту функцию для случая, в то время, когда х вещественное, возможно следующими методами (при условии, что x:real; sgn: -1..1;):
1. if x=0 then sgn:= 0;
2. if x
3. if x0 then sgn:= 1;
Это так называемая реализация в лоб. Тут нет никаких попыток и никаких хитростей оптимизации: кроме того в случае если сработает первый вариант, второй и третий все равно будут проверены, несмотря на то, что итог уже взят.
4. if x=0
5. then sgn:= 0
6. else if x
7. else sgn:= 1;
Данный вариант свободен от излишних испытаний , если значение переменной не положительно.Эту реализацию направляться признать более действенной, чем прошлая
8. if x=0
9. then sgn:=0
10. else sgn:=x/abs(x);
Еще одна попытка сократить текст программы. Тут употребляется стандартная функция abs(), которая возвращает полное значение довода. Неприятность в этом случае пребывает в том, что / — деление дробное, но так как нам нужен целый, а не вещественный ответ! Давайте воспользуемся стандартной функцией округления, — вероятнее, сообщит внимательный читатель.
11. if x=0
12. then sgn:=0
13. else sgn:=round(x/abs(x));
И вправду, исправленный вариант будет выдавать верный итог.
14. case x=0 of
15. true: sgn:=0;
16. false:
17. sgn:=round(x/abs(x));
18. end;
А вот еще один (действительно, пара неестественный) метод с применением оператора выбора. Вся хитрость этого варианта в том, что выбирающий ветви тумблер обязан принадлежать к перечислимому типу, как раз исходя из этого было нужно заменить х на х = 0. Отметим, что эта операция сравнения выдает итог логического типа boolean, и как раз логические константы true и false фигурируют в качестве меток выбора.
Конечно же, мы перебрали не все вероятные методы реализации функции sgn(x) (так как какое количество людей, столько и способов высказывать собственные мысли — хоть в литературе, хоть в программировании). Но уже на этом простеньком примере видно, что способов запрограммировать желаемое неизменно больше, чем один, и вряд ли самое простое ответ будет и оптимальным.
Лекция 4
Циклічні розрахункові процеси
Разбор задачи на оператор выбора case