В языке существует четыре логических операций. Приоритет операций показан в табл. 9.
Таблица 9
Операция | Наименование | Приоритет |
NotAndOrXor | ОтрицаниеКонъюнкцияДизъюнкцияСпец. дизъюнкция | 3456 |
Значения элементарных логических выражений, поясняющих назначение этих операций, приведены в табл. 10.
Таблица 10
A | B | not A | A and B | A or B | A xor B |
TrueTrueFalseFalse | TrueFalseTrueFalse | FalseFalseTrue True | TrueFalseFalseFalse | TrueTrueTrueFalse | FalseTrueTrueFalse |
В табл. 11 представлены логические отношения.
Таблица 11
Отношение | Наименование |
> < >=<==<> | БольшеМеньшеБольше или равноМеньше или равноРавноНе равно |
Все отношения равноприоритетны.
Порядок выполнения операций при вычислении логического выражения следующий:
сначала вычисляются арифметические выражения;
затем – отношения;
в последнюю очередь вычисляются логические операции.
Примеры (для x=12, z = 0, y=1):
Таблица 12
Выражение | Результат |
5 > 8(5 < 3) and (z = 0)((4 + 8) < 0) or not (y = 0)not ((x < y) and (z > y))('ab' = 'ac') and (x=z)(4 in [ 2 .. 23 ]) | TrueFalseTrueTrueFalseTrue |
Пример, демонстрирующий порядок выполнения операций при вычислении логического выражения:
Выражение: | Not ((x > 6 + 8 * 2) and (y < 7) or (z > 7)) and (x <> y) |
Порядок: | 9 3 2 1 6 4 7 5 10 8 |
9.3. Строковые выражения
Строковые выражения, частными случаями которых могут быть пустой символ '' или одиночный символ (например 'A'), строятся из строковых или символьных значений, констант, переменных и строковых функций при помощи строковой операции конкатенации (присоединения). Эта операция обозначена символом + (плюс). Скобки в строковых выражениях не применяются.
Пример:
Выражение: | 'Object '+'Pascal '+' для Delphi' |
Результат: | 'Object Pascal для Delphi' |
10. Операторы
Оператор – языковая конструкция, представляющая описание команды или комплекса команд по обработке и преобразованию данных.
Все операторы делятся на две части – простые операторы и структурные операторы.
11. Простые операторы
К их числу относятся: оператор присваивания, оператор безусловного перехода, составной оператор, оператор процедур, специальные операторы.
11.1. Оператор присваивания
В параграфе 1.4 было дано краткое определение этого оператора – одного самых простых и наиболее часто используемых операторов. Напомним, что его синтаксис имеет вид
x := y;
где x – имя переменной или функции; y – совместимое по типу выражение (о совместимости типов см. гл. 8). Символы ":=" обозначают операцию присваивания, в соответствии с которой вычисленное значение выражения y присваивается переменной x.
Примеры операторов присваивания (комментарии показывают присвоенные значения):
Var
Ch: Char;
S: String[5];
Q: String[18];
L, J: Integer;
P: Byte;
R: Real;
B: Boolean;
Rec: Record
A: Word;
B: String[20];
End;
…
Таблица 13
Оператор присваивания | Значение |
Q:= 'd:\Dir1\Word\a.txt';S:= Q;Q:= S+'r\';Ch:=Q[2];L:= 450;P:= L;J:= 100;R:= -L / J;J:=-L / J;J:=-L - 200;B:= J > L;B:= (J < L) and (Q[5] = 'i');Rec.A:= J-20;Rec.B:= 20;Rec.B:= S[1]+S[3]+'\d'; | 'd:\Dir1\Word\a.txt''d:\Di''d:\Dir\'':'450Ошибка, т. к. max P = 255100-4.5Ошибка. Несоответствие типов250 FalseTrue230Ошибка. Несоответствие типов'd\d' |
11.2. Оператор безусловного перехода
Этот оператор выполняет передачу управления оператору, которому предшествует метка. Синтаксис оператора:
Goto Метка;
Язык допускает в качестве меток использовать имя или значение целого типа из диапазона 1 .. 9999.
При использовании операторов перехода необходимо придерживаться следующих правил:
Все метки, используемые в блоке, должны быть описаны словом Label.
Пример оператора описания меток:
Label 1, 2, Met1, Met2, Met3;
Метка должна располагаться в том же блоке, что и оператор, который ею помечен.
Недопустим переход к метке внутрь структурного оператора (например, внутрь цикла, минуя его заголовок). Компилятор не реагирует на эту ситуацию, однако поведение программы может быть непредсказуемо. Недопустимы также вход или выход по метке в процедурах или функциях.
П р и м е ч а н и е. Не используйте меток, если в этом нет особой необходимости. В технике современного программирования использование меток считается правилом плохого тона, т. к. их применение часто ведет к составлению плохо структурированных модулей, усложняющих чтение, сопровождение и отладку программ.
11.3. Оператор обращения к процедуре
Этот оператор вызывает активизацию операторов, расположенных в теле процедуры (см. параграф 15.1). После выполнения процедуры управление передается к оператору, расположенному вслед за оператором процедуры.
При вызове процедуры её формальным параметрам должны строго соответствовать по совместимости типов и количеству фактические параметры.
Примеры обращения к процедурам:
Val (s, r, Code);
Sort (a, n * 2);
SaveParameters;
11.4. Обращение к функции
Следует подчеркнуть, что не существует специального оператора обращения к функции (см. параграф 15.1). Обычно такое обращение производится посредством другого оператора, часто оператора присваивания.
Обращение к функции активизирует ее внутренние операторы точно так же, как это происходит в процедурах. Принципиальное отличие между выполнением процедуры и функции состоит в следующем:
после выполнения оператора процедуры управление передается к следующему за ним оператору;
после выполнения функции управление вновь передается в оператор, который содержит обращение к этой функции, с целью передачи в него вычисленного значения функции и для завершения вычислений внутри этого оператора.
Поясним это на примере оператора присваивания, содержащего обращение к функции Func8:
G:= 2 * Pi * Func8(m, n, a) / Sqr (z);
При выполнении этого оператора сначала происходит обращение к функции Func8. После выполнения операторов, составляющих тело этой функции, вычисленное значение возвращается в этот оператор, где оно используется для выполнения дальнейших вычислений внутри оператора.
12. Стандартные процедуры и функции
Язык содержит ряд процедур и функций, которые в практике программирования ипользуются наиболее часто. Расширенный список процедур и функций, которые могут найти применение в практике программирования, приведен в приложении.
12.1. Строковые процедуры и функции
Function Length (St): LongInt;
Возвращает длину строки символов St, т. е. количество символов в ней (не путать с размером строки).
St:= '1234abc';
L:= Length(St); {L= 7}
Procedure Delete (St, Pos, Num);
Удаляет Num символов из строки St начиная с позиции Pos, если Pos<Length (St).
St:= '1234abc';
Delete(St, 4, 2); { St= '123bc'}
Delete(St, 3, 120); { St= '12'}
Procedure Insert (Obj, Target, Pos);
Вставляет строку Obj в строку Target начиная с позиции Pos. Если Pos>Length (Target), то результат Target + Obj.
St1:= '***';
St2:= '1234abc';
Insert (St1, St2, 3) { St2= '12***34abc'}
Procedure Str (Value, St);
Преобразует значение Value числового типа в строку символов St. Value может сопровождаться форматом.
L:=19;
Str (L, g); {g= '19'}
R:= 2.123155;
Str (R: 8:3, h); {h= ' 2.123' (длина 8, в дробной части 3}
Procedure Val (St, Vr, Code);
Преобразует строку символов St в числовую величину Vr целого или вещественного типа. Code = 0, если преобразование прошло успешно, иначе в Code будет записан номер первого ошибочного символа конвертируемой строки, при этом значение Vr не определено.
St:='319';
Val (St, k, Cod); {k= 319, Cod = 0}
St:='81yy9';
Val (St, k, Cod); {k= ?, Cod = 3}
Function Copy (St, Pos, Num): String;
Выделяет из строки St подстроку символов длиной Num начиная с позиции Pos. Если Pos>Length, то возвращает пустую строку.
St1:='АБВГДЕ';
St2:= Copy(St1, 2, 3); {St2= 'БВГ'}
St2:= Copy(St1, 2, 27); {St2= 'БВГДЕ'}
St2:= Copy(St1, 44, 2); {возвращает пустую строку St2= ''}
Function Concat (St1, St2{, …, StN}): String;
Объединяет строки в одну строку.
St:='abc';
St1:=Concat( 'sss', St, '1234'); {St1= 'sssabc1234'}
St1:=Concat( St, '123'); {St1= 'abc123'}
Function Pos (Obj, Target): Integer;
Возвращает номер символа, начиная с которого строка Obj первый раз входит в строку Target. Если строка Obj отсутствует в строке Target, то Pos = 0.
Q:= 'Иванов Сергей Петрович';
H:= Pos ('Сергей', Q); {H= 7}
H:= Pos ('Игорь', Q); {H= 0}
Function SizeOf (Obj): Integer;
Возвращает размер переменной Obj.
Function FormatFloat(const Format: string; Value: Extended): string;
Возвращает форматированное вещественное значение в виде строки. Format – формат числа, Value – число. В табл. 14 даны форматы функции FormatFloat.
Таблица 14
Формат | Описание |
0#.,E+, E-; | Поле для цифры. Недостающие позиции заменяются нулями Поле для цифры. Если в позиции имеется значащая цифра, то оно выводится. Нули не выводятсяРазделитель целой и дробной частейПоле разделителя тысяч, миллионовФормат представления чисел с плавающей точкой. Если "+" указан, то перед порядком выводится знак. Если указан "-", то минус выводится только для отрицательных порядковРазделитель форматов |
Примеры действия форматов при конвертации числа в строку представлены в табл. 15.
Таблица 15
Формат | Число 1 | Число 2 | Число 3 | Число 4 |
0 0.00#.###,##0.00#,##0.00;(#,##0.00)#,##0.00;;Zero0.000E+00#.###E-0 | 123412341234.0012341,234.001,234.001,234.00.234E+031.234E3 | -1234-1234-1234.00-1234-1,234.00(1,234.00)-1,234.00-1.234E+03-1.234E3 | 0.510.50.50.500.500.505.000E-015E-1 | 000.000.000.00Zero0.000E+000E0 |
12.2. Стандартные функции
Function Char (X: byte): Char;
Возвращает символ с номером X.
Ch:= Char(74); {Ch= 'J'}
Function Ord (X): LongInt;
Возвращает порядковый номер скалярного аргумента.
j:= Ord('J'); {j= 74}