Возможность работы с двоичным представлением чисел (так работают кроме рассмотренных операций shl и shr, также и логические операции) часто возникает при работе с видеопамятью в текстовом или графическом режимах. Кроме того, есть ряд число математических задач, которые удобно решать в двоичном представлении.
К логическим операциям относятся and – логическое И, or – логическое ИЛИ, not – логическое отрицание, xor – исключительное ИЛИ. Они применяются к операндам как логического типа, так и целого типа. Логические операнды (логическая константа, логическая переменная, элемент массива логического типа,...) могут принимать значения True или False. Логические операции над логическими данными дают результат логического типа по следующим правилам (табл.)
Операнд 1 | Операнд 2 | and | or | xor | not |
False | False | False | False | False | - |
True | False | False | True | True | - |
False | True | False | True | True | - |
True | True | True | True | False | - |
True | - | - | - | - | False |
False | - | - | - | - | True |
Если операндами являются целые числа, то оперирование происходит с двоичным представлением чисел. При этом результат – общий тип. При использовании этих операций осуществляется побитное (поразрядное) сравнение операндов. Двоичные цифры результата образуются по следующим правилам (табл.)
Операнд 1 | Операнд 2 | and | or | xor | not |
0 | 0 | 0 | 0 | 0 | - |
1 | 0 | 0 | 1 | 1 | - |
0 | 1 | 0 | 1 | 1 | - |
1 | 1 | 1 | 1 | 0 | - |
1 | - | - | - | - | 0 |
0 | - | - | - | - | 1 |
Например, 12 or 22 соответствует сравнению, соответственно, 01100 и 10110. В соответствии с правилами получаем 11110, что соответствует (30)10. Т.е. 12 or 22 = 30.
Некоторая особенность появляется при работе с типами целых чисел, которые могут принимать отрицательные значения. К таким типам относятся ShortInt (-128..127) – 8 бит, Integer (-32768..32767) – 16 бит, LongInt (-2 147 483 648..2 147 483 647) – 32 бита. У этих типов старший разряд отводится под знак (0 – при положительном, 1 – при отрицательном). Для остальных разрядов, если число положительное, то кодировка осуществляется обычным образом (если Х = 12 и Х:ShortInt, то (Х)2 = 0 0001100). Если число отрицательное, то в остальных разрядах записывается число, которое в сумме с исходным дает модуль максимально допустимого значения для данного типа. Т.е., если X = -12, Х:ShortInt, модуль максимально допустимого значения для данного типа – 128, 116 + 12 = 128, поэтому (Х)2 = 1 1110100 – последние 7 цифр образуют число 116.
Учитывая это обстоятельство, рассмотрим применение операции not к переменной, которая имеет определенное значение (Х = 5), но описывается с помощью разных типов.
Х:Byte, (X)2 = 00000101, not X = (11111010)2 = (250)10.
X:ShortInt, (X)2 = 0 0000101, not X = (1 1111010)2 = - (128-122)10 = -(6)10.
Операции отношения выполняют сравнение двух операндов и определяют, истинно значение выражения или ложно. Сравниваемые величины должны быть совместимыми (совместимость типов – далее). Результат всегда имеет логический (булевский) тип и принимает одно из двух значений: True или False.
Операция | Название | Выражение | Результата |
= | Равно | А = В | True, если А равно В |
<> | Не равно | A <> B | True, если А не равно В |
> | Больше | А > B | True, если А больше В |
< | Меньше | А < B | True, если А меньше В |
>= | Больше или равно | А >= В | True, если А больше или равно В |
<= | Меньше или равно | А <= B | True, если А меньше или равно В |
in | Принадлежность | А in M | True, если А находится в списке М |
Операции отношения, а также логические операции интенсивно используются для управления циклами и в условных операторах.
Приоритет операций.
Первый (высший) приоритет имеют унарные операции @, not.
Следующий (второй) приоритет у операций типа умножения *, /, div, mod, and, shl, shr.
Третий приоритет имеют операции типа сложения +, -, or, xor.
Четвертый (низший) приоритет - у операций отношения =, <>, <, >, <=, >=, in.
Имеются три основных правила для определения старшинства операций:
- операнд, находящийся между двумя операциями с различными приоритетами, связывается с операцией, имеющей более высокий приоритет;
- операнд, находящийся между двумя операциями с равными приоритетами, связывается с операцией, которая находится слева;
- выражение, заключенной в скобки, перед выполнением вычисляется, как отдельный операнд;
Обобщение последних двух правил дает следующее: операции с равным приоритетом производятся слева направо с возможным регулированием порядка выполнения скобками.
СТРУКТУРА ПРОГРАММЫ
Программа на языке ТР состоит из строк. Набор текста программы осуществляется с помощью текстового редактора среды ТР.
Общее число символов в файле не должно быть больше 64535. Компилятор ТР воспринимает строки программы длиной не более 126 символов. Редактор ТР вставляет в конец каждой строки невидимый на экране символ-разделитель (вставляется клавишей Enter).
Программист имеет право произвольно располагать строки на экране. Строка может располагаться с любой колонки, т.е. величина отступа слева устанавливается программистом с целью получить наиболее читабельный, по его мнению, текст программы.
В полном варианте программа на языке ТР имеет следующий вид (по мере объяснения).
Program <имя программы>;
Uses <имя1>,<имя2>,…;
Label
1, 234, m1, Stop;
Const
MaxN: word = 100; {Типизированная константа}
Vxod = ‘Блок_1’; {Строковая константа}
Kod = $124; {Константа – шестнадцатеричное число}
Type
Matrix = array[1..10] of real;
LatBukva = (‘a’..’z’);
Dni = 1..31;
Var
A, B, C : integer;
Result, Summa : real;
Vxod : boolean;
Procedure <имя>;
<тело процедуры>;
…;
Function <имя>;
<тело функции>;
…;
BEGIN
<операторы>;
END.
Регистр написания заголовков неважен. Любой раздел, кроме раздела операторов, может отсутствовать (если в нем нет необходимости). Название программы в ТР имеет чисто декоративное назначение, как комментарий. Конструкция Program <имя> не является необходимой в ТР, по сравнению с другими версиями Паскаля.
Раздел Uses состоит из этого зарезервированного слова и списка имен подключаемых стандартных из набора ТР и пользовательских (разработанных программистом) модулей. Включение дополнительных модулей расширяет список используемых в программе процедур, функций, переменных, констант. Если директива Uses присутствует, то она должна стоять перед прочими директивами. Она может появиться в программе только один раз.
Раздел описания меток Label содержит перечисленные через запятую метки переходов, установленные в основном блоке программы. Метка, поставленная перед каким-либо оператором, позволяет выполнить прямой переход к этому оператору из любого места программы с помощью оператора безусловного перехода goto. Метки могут обозначаться целым числом 0..9999 или символьными конструкциями длиной не более 63 букв (см. пример).
В разделе описания констант Const производится присваивание идентификаторам констант постоянных значений (см. пример).
Тип данных может быть описан непосредственно в разделе описания переменных, либо определяется идентификатором (именем) типа. Стандартные типы данных не требуют специального описания. Пользовательские типы, которые имеют имена описываются разделе Type (см. пример) (подробное рассмотрение типов данных ТР – позднее).
Раздел описания глобальных переменных (переменных, которые могут быть использованы в любом месте, процедуре, функции программы) начинается зарезервированным словом Var. После чего перечисляются имена переменных с указанием через двоеточие их типа (см. пример).
В отличие от стандартного языка Pascal в ТР разделы Label, Type, Const, Var могут следовать друг за другом в любом порядке и встречаться в разделе описаний сколько угодно раз. Если в них нет необходимости, они могут отсутствовать. Однако поскольку программа компилируется последовательно, начиная с начала, важно соблюдать правило: все, что в программе используется должно быть перед этим описано. Например, если переменная, описывается, как массив М :array[1..Max] of integer, то величина Мах = 20 должна быть ранее (выше по программе) описана в разделе Сonst.
В разделе описания процедур и функций размещаются тела подпрограмм. Подпрограмма - это программная единица, имеющая имя, по которому она может быть вызвана из других частей программы. В языке ТР роль подпрограмм выполняют процедуры и функции. В общем случае подпрограмма имеет ту же структуру, что и программа (состоит из раздела описаний и раздела операторов). Для описания подпрограмм используются зарезервированные слова Procedure и Function. Заголовки процедур и функций записываются в начале программы до раздела операторов. Обычно за заголовком сразу следует реализация (тело) процедуры и функции, но они могут быть и разнесены внутри программы. Процедуры и функции подразделяются на стандартные и определенные пользователем. Стандартные - являются частью языка и могут вызываться без предварительного описания. Описание процедур и функций пользователя обязательно. Более подробное рассмотрение будет в следующих разделах.