|
Средства и алгоритмы представления, хранения и обработки текстовой и числовой информации
Ветвление Действие операций отношения соответствует их математическому пониманию. Результатом этих операций является булевское значение (True, False). При использовании операций отношения для строковых значений, сравнение выполняется посимвольно слева направо согласно значениям кодов символов. Все строковые значения независимо от длины считаются совместимыми. Кроме того, значения символьного типа также считаются совместимыми со значениями строкового типа, и обрабатываются как строки длиной в один символ. При сравнении операндов указательного типа допустимо использование только операций = и <>. В табл. 20 приведены все операции отношения. Два указателя равны только в том случае, если они ссылаются на один и тот же объект. Таблица 20 Операцииотношения
В табл. 21 приведены примеры операций отношений. Таблица 21 Примеры операций отношения
12.2 Логические (булевские) операции Результатом операции not будет целочисленное значение, равное десятичному числу, которое соответствует поразрядно инвертированному двоичному представлению исходного операнда. Результатом операции and будет целочисленное значение, равное десятичному числу, которое соответствует двоичному представлению поразрядно выполненной над исходными операндами логической операции И. Результатом операции or будет целочисленное значение, равное десятичному числу, которое соответствует двоичному представлению поразрядно выполненной над исходными операндами логической операции ИЛИ. Результатом операции хоr будет целочисленное значение, равное десятичному числу, которое соответствует двоичному представлению поразрядно выполненной над исходными операндами логической операции исключающее ИЛИ. Результатом операции A shl В будет целочисленное значение, равное десятичному числу, полученному в результате поразрядного сдвига влево двоичного представления операнда А на В разрядов. Освободившиеся при этом разряды заполняются нулями. Результатом операции A shr В будет целочисленное значение, равное десятичному числу, полученному в результате поразрядного сдвига вправо двоичного представления операнда А на В разрядов. Освободившиеся при этом разряды заполняются нулями. Результатом выполнения логических (булевских) операций является логическое значение True или False. Операндами в логическом выражении служат данные типа Boolean. Таблица 22 Логическиеоперации
Пример результатов выполнения типичных логических операций представлены в табл. 23 и 24. Таблица 23 Примеры
Таблица 24 Примеры
Составной оператор Составной оператор представляет собой группу из произвольного числа операторов, отделенных друг от друга точкой с запятой и заключенную в так называемые операторные скобки - begin и end:
begin <оператор 1>; <оператор 2>;
<оператор N> end
Частным случаем составного оператора является тело следующей программы:
var X, Y: Integer; begin X:= 4; Y:= 6; Edit.Text:=IntToStr(X + Y); // Точка с запятой после этого оператора не обязательна end.
Хотя символ точки с запятой служит разделителем между операторами и перед словом end может опускаться, мы рекомендуем ставить его в конце каждого оператора (как в примере), чтобы придать программе более красивый вид и избежать потенциальных ошибок при наборе текста. Составной оператор может находиться в любом месте программы, где разрешен простой оператор. Он широко используется с условными операторами и операторами повтора. Оператор ветвления if Оператор ветвления if - одно из самых популярных средств, изменяющих естественный порядок выполнения операторов программы. Вот его общий вид:
if <условие> then <оператор 1 > Else <оператор 2 >;
Условие - это выражение булевского типа, оно может быть простым или сложным. Сложные условия образуются с помощью логических операций и операций отношения. Обратите внимание, что перед словом else точка с запятой не ставится. При выполнении условного оператора сначала вычисляется условие, результат которого может принимать только булевский тип, а затем, в зависимости от значения результата (True, False), выполняется Оператор1, стоящий после ключевого слова then (если результат равен True), или Оператор2, стоящий после ключевого слова else (если результат равен False).
Поясним сказанное на примере: var A, B, C: Integer; begin A:= 2; B:= 8; if A > B then C:= A else C:= B; Edit.Text:=IntToStr(C); end.
В данном случае значение выражения А > В ложно, следовательно появится сообщение C=8. У оператора if существует и другая форма, в которой else отсутствует:
if <условие> then <оператор>;
Логика работы этого оператора if еще проще: выполнить оператор, если условие истинно, и пропустить оператор, если оно ложно. Поясним сказанное на примере: var A, B, C: Integer; begin A:= 2; B:= 8; C:= 0; if A > B then C:= A + B; Edit.Text:=IntToStr(C); end. В результате на экране появится сообщение С=0, поскольку выражение А > В ложно и присваивание С:= А + В пропускается. Один оператор if может входить в состав другого оператора if. В таком случае говорят о вложенности операторов. При вложенности операторов каждое else соответствует тому then, которое непосредственно ему предшествует. Например: var A: Integer; begin Readln(A); if A >= 0 then if A <= 100 then Edit1.Text:= 'A попадает в диапазон 0 - 100.'; else Edit1.Text:= 'A больше 100.'; else Edit1.Text:= 'A меньше 0.'; end.
Конструкций со степенью вложенности более 2-3 лучше избегать из-за сложности их анализа при отладке программ. Оператор ветвления case Оператор ветвления 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; * Исключительные ситуации Для чего они нужны? Допустим, что у тебя есть участок кода, где может произойти ошибка. Как сделать так, чтобы программа не вылетала при её возникновении? Очень просто. Надо заключить этот код в блок проверки исключений и тогда твоя программа выдержит даже цунами. Блок try...except (Рисунок 16) служит для обработки конкретных исключительных ситуаций (или более кратко - исключений). Этот блок имеет два наиболее характерных способа записи (полный и сокращенный), первый из которых неформально можно представить в следующем виде: try <СписокОператоров1> except on <Исключение1> do <Оператор1>; on <Исключение2> do <Оператор2>; .... on <ИсключениеN> do <ОператорN> else <СписокОператоровM> end; Рисунок 16 - Исключительные ситуации Опишем принцип работы полного варианта блока 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 никогда не выполнился бы.
Лекция 13 Циклы Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычислить, когда этот... Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все... Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)... ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|