![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Оператор ветвления case является удобной альтернативой оператору if, если необходимо сделать выбор из конечного числа имеющихся вариантов. Он состоит из выражения, называемого переключателем, и альтернативных операторов, каждому из которых предшествует свой список допустимых значений переключателя:
case <переключатель> of
<список 1 значений переключателя>: <оператор 1>;
<список 2 значений переключателя>: <оператор 2>;
……
<список N значений переключателя>: <оператор N>;
else <оператор N+1>
end;
Оператор case вычисляет значение переключателя (который может быть задан выражением), затем последовательно просматривает списки его допустимых значений в поисках вычисленного значения и, если это значение найдено, выполняет соответствующий ему оператор. Если переключатель не попадает ни в один из списков, выполняется оператор, стоящий за словом else. Если часть else отсутствует, управление передается следующему за словом end оператору.
Переключатель должен принадлежать порядковому типу данных. Использовать вещественные и строковые типы в качестве переключателя не допускается.
Список значений переключателя может состоять из произвольного количества констант и диапазонов, отделенных друг от друга запятыми. Границы диапазонов записываются двумя константами через разграничитель в виде двух точек (..). Все значения переключателя должны быть уникальными, а диапазоны не должны пересекаться, иначе компилятор сообщит об ошибке. Тип значений должен быть совместим с типом переключателя. Например:
case StrToInt(Edit1.text) of
20..31: Label1.Caption:= 'День попадает в диапазон 20 - 31.';
1, 5..10: Label1.Caption:= 'День попадает в диапазон 1, 5 - 10.';
else Label1.Caption := 'День не попадает в заданные диапазоны.';
end;
Если значения переключателя записаны в возрастающем порядке, то поиск требуемого оператора выполняется значительно быстрее, так как в этом случае компилятор строит оптимизированный код. Учитывая сказанное, перепишем предыдущий пример:
case StrToInt(Edit1.text) of
1, 5..10: Label1.Caption:= 'День попадает в диапазон 1, 5 - 10.';
20..31: Label1.Caption:= 'День попадает в диапазон 20 - 31.';
else Label1.Caption := 'День не попадает в заданные диапазоны.';
end;
16.6. Исключительные ситуации
Для чего они нужны? Допустим, что у тебя есть участок кода, где может произойти ошибка. Как сделать так, чтобы программа не вылетала при её возникновении? Очень просто. Надо заключить этот код в блок проверки исключений и тогда твоя программа выдержит даже цунами.
Блок try...except (Рисунок 17.1) служит для обработки конкретных исключительных ситуаций(или более кратко - исключений). Этот блок имеет два наиболее характерных способа записи (полный и сокращенный), первый из которых неформально можно представить в следующем виде:
try
<СписокОператоров1>
except
on <Исключение1> do <Оператор1>;
on <Исключение2> do <Оператор2>;
....
on <ИсключениеN> do <ОператорN>
else <СписокОператоровM>
end;
Рисунок 16.1 - Исключительные ситуации
Опишем принцип работы полного варианта блока try...ехсерt. Если в процессе работы проекта ошибок времени выполнения не происходит, то наличие блока обработки исключительных ситуаций никакого влияния на работу не оказывает. Если же при выполнении СпискаОператоро1 между зарезервированными словами try и except возникает исключительная ситуация, то выполнение СпискаОператоров1 прерывается, и управление передается в блок обработки исключения (Exception Block), который по структуре похож на оператор case. В случае, когда возникшая исключительная ситуация совпадает с одним из заголовков альтернатив on...do, то выполняется соответствующий этой альтернативе Оператор, в противном случае выполняется СписокОператоров2 (после зарезервированного слова else).
Кроме описанного полного варианта записи блока try...except, возможен еще и сокращенный, который в неформальном синтаксисе выглядит так:
try
<СписокОператоров1>
except
<СписокОператоров2>
end;
При использовании такого блока обработки исключений управление на Список0ператоров2 будет передано при любой ошибке, возникшей в процессе выполнения СпискаОператоров1. Если же ошибок при обработке СпискаОператоров1 не было, то СписокОператоров2 также, как и в полном варианте блока try...except, выполняться не будет.
Рассмотрим простейший пример:
TRY
x:=y/0;
EXCEPT
// Здесь можно вывести сообщение об ошибке.
END;
x:=0;
Между TRY и EXCEPT я вставил маленькое действие - деление на ноль. Компьютер не умеет делать такие вещи, поэтому произойдёт ошибка и выполнится код между EXCEPT и END. После обработки ошибки процедура заканчивает выполнение и все остальные операторы не будут выполнены, как, например, в нашем случае - x:=0; Если бы мы поменяли 0 на любое другое число, то ошибки бы не было, и код между EXCEPT и END никогда не выполнился бы.
Циклы
Дата публикования: 2014-11-18; Прочитано: 306 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!