Часть программы, предшествующая разделу операторов, называется разделом описаний.
Основным в программе является раздел операторов. Именно в нем с предварительно описанными переменными, константами, значениями функций выполняются действия, позволяющие получить результат, ради которого создавалась программа. Это раздел начинается словом Begin, далее следуют операторы языка, отделенные друг от друга «;». Завершает раздел слово End и точка. Операторы выполняются строго последовательно в том порядке, в котором они записаны, а также в соответствии с синтаксисом языка и правилами пунктуации. Раздел операторов завершает программу.
Кроме конструкций языка программа может содержать комментарии и ключи компиляции. Комментарии - это произвольный поясняющий текст в любом месте программы, заключенный в фигурные скобки { } или между двойными символами (* *). В ограничителях (* *) пробелы между скобкой и звездочкой запрещены. В тексте не должны находиться ограничители, с которых комментарий начинается (т.е. {пример {1}}). Однако ограничители { } можно вложить в (* *), и наоборот. Ограничений на длину комментрия нет. Комментарий игнорируется компилятором и поэтому никакого влияния на программу не оказывает. Ограничители {} ((* *)) удобно использовать при отладке программы, когда с их помощью временно исключаются части программы.
Текст программы может также содержать директивы компилятора, которые используются программистом для управления режимами компиляции, т.е. включать или выключать контроль ошибок, использовать или эмулировать математический сопроцессор, изменять распределение памяти и т.д. Эти директивы, как и комментарии, заключаются в фигурные скобки, но они имеют отличительный признак $, после чего указывается буква-ключ с последующим знаком “+” (включить режим) или “-“ (выключить) (не допускаются пробелы между открывающей скобкой, знаком $ и ключом компилятора). Директивы могут быть переключающими, условными и параметрическими. Переключающие директивы воздействуют на те опции, которые включены в диалоговое окно OPTIONS/COMPILER; условные директивы определяют условия, при которых компилируются те или иные франменты программы; параметрические директивы задают параметры, которые должен учитывать компилятор. Некоторые директивы могут действовать только на часть текста программы (локальные директивы). В отличие от этого глобальные директивы располагаются в начале текста программы (модуля) и действуют сразу на всю программу (модуль) в целом. Например, {$R-} – отключить проверку диапазонов индексов массивов, {$N+} – использовать сопроцессор 80Х87.
7. ТИПЫ ДАННЫХ ЯЗЫКА ТР
Любые данные (константы, переменные, значения функций или выражения) в ТР характеризуются своими типами. Тип - это множество значений, которые могут принимать объекты программы, а также совокупность операций, допустимых над этими значениями. Кроме того, тип определяет также и формат внутреннего представления данных в памяти компьютера.
Общая структура данных ТР.
ПРОСТЫЕ ТИПЫ
Эти типы определяют тип только одного отдельного значения.
Простые типы можно разделить на два класса. Порядковые типы отличается тем, что каждый из них имеет конечное число возможных значений. Эти значения можно определенным образом упорядочить, и, поэтому с каждым из них можно сопоставить некоторое целое число - порядковый номер значения. Вещественные типы, строго говоря, тоже имеют конечное число значений (количество этих значений определяется форматом внутреннего представления вещественного числа). Однако количество возможных значений настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным.
К любому из порядковых типов (целые, логический, символьный, перечисляемый и тип-диапазон) применима функция ORD(X), которая возвращает порядковый номер значения Х. Применительно к целым эта функция возвращает само значение Х (т.е. ORD(X) = X). Применительно к логическому типу дает в результате 0 или 1, к символьному - целое число от 0 до 255 (коды), к перечисляемому - целое число от 0 до 65535. Тип-диапазон сохраняет все свойства базового порядкового типа, поэтому результат применения к нему функции ORD(X) зависит от свойств этого типа.
К порядковым типам также применимы функции:
- PRED(X) - возвращает предыдущее значение порядкового типа (значение, которое соответствует порядковому номеру ORD(X)-1). Следовательно, ORD(PRED(X)) = ORD(X) - 1.
- SUCC(X) - возвращает следующее значение порядкового типа (соответствует номеру ORD(X) +1). Т.е. ORD(SUCC(X)) = ORD(X) + 1;
Запрещены Pred ( первый элемент перечисления ) и Succ (последний элемент перечисления).
Пример,
Var
c,d : char;
begin
c := ‘f’;
d := PRED(c);
end.
Значение переменной d - это символ ‘e’.
Рассмотрим вначале особенности порядковых типов.
ЦЕЛЫЕ ТИПЫ
Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два или четыре байта.
НАЗВАНИЕ | Длина, байт | Диапазон значений |
Byte | 1 | 0..255 |
ShortInt | 1 | -128..+127 |
Word | 2 | 0..65535 |
Integer | 2 | -32768..+32767 |
LongInt | 4 | -2 147 483 648..+2 147 483 647 |
Целочисленные значения записываются привычным способом: 123 4 -5 -63333. Число должно быть записано без всяких преобразований. Будет ошибкой задать целое число следующим образом: 1е+2 (в смысле 100), 123.0.
Как говорилось ранее, при действиях с целыми числами тип результата будет соответствовать типу операндов, а если операнды относятся к разным типам, - типу того операнда, который имеет максимальную мощность (максимальный диапазон значений (иначе называется общим типом).
Стандартные функции, которые применяются к целым типам, будут рассмотрены после рассмотрения вещественных типов.
ЛОГИЧЕСКИЙ ТИП
Значениями переменных логического типа может быть либо TRUE, либо FALSE (это по сути логические константы). Требуется 1 байт памяти. С логическими переменными связаны рассмотренные ранее логические операции. Широко применяются в условных операторах языка. Обозначение Var X:Boolean; (ORD(false) = 0; ORD(true) = 1).
СИМВОЛЬНЫЙ ТИП
Значениями переменных символьного типа является множество всех символов ПК. Каждому символу приписывается целое число (код) в диапазоне 0...255 (оно возвращается функцией ORD) - всего 8 бит (1 байт).
Для кодировки используется код ASCII (American Standard Code of Information Interchange). Это 7-битный код, с его помощью кодируются буквы латинского алфавита, знаки препинания и служебные символы (можно закодировать лишь 128 символов в диапазоне 0...127). Символы с номерами 128...255 отводятся под национальный алфавит и могут меняться для разных компьютеров. Наибольшее распространение в России получила т.н. альтернативная кодировка (альтернативная ГОСТу), в которой символы псевдографики расположены на тех же места как в кодировке IBM (символы 176-223) (в кодировке IBM вместо русских букв расширение латинского алфавита для западноевропейских языков). Формат: Var X:Char; К типу Char применимы операции отношения, а также встроенные функции:
CHR(X) (обратная ORD) - преобразует выражение Х:Byte в символ и возвращает этот символ;
UPCASE(X) - возвращает прописную букву, если Х - строчная латинская буква, в противном случае (например, если Х - русская буква) возвращает сам символ Х.
В программе значения переменных (как и констант) символьного типа должны быть заключены в апострофы (например, Х := ‘ф’). Кроме того, допускается использование записи символа путем указания его кода, которому предшествует символ # (операция присваивания Х := #228 аналогична предыдущей).
ПЕРЕЧИСЛЯЕМЫЙ ТИП
Перечисляемый тип задается перечислением тех значений, которые он может получать. В качестве значения д.б. использован любой идентификатор, он располагается в списке, обрамленном круглыми скобками. Например,
Type
colors = (red,white,blue);
Var
Color1,Color2 : colors;
или иначе
Var
Color3 : (red,white,blue);
Переменные Сolor1,Color2,Color3 могут принимать только одно из трех перечисленных значений. Имена внутри круглых скобок являются константами. Паскаль не поддерживает операции ввода-вывода значений перечисляемого типа. Значения перечисляемого типа должны иметь синтаксис идентификаторов, поэтому не допускаются использование цифр, строк, служебных символов. Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений (которые возвращаются функцией ORD) устанавливается следующим образом: первое значение в списке получает номер 0, второе – 1 и т.д. Максимальная мощность перечисляемого типа составляет 65536 значений.
ТИП–ДИАПАЗОН
Тип-диапазон есть подмножество некоторого базового типа (рассмотренных ранее), в качестве которого может выступать любой порядковый тип, кроме самого типа-диапазона.
Тип-диапазон задается границами своих значений внутри базового типа. Например,
Type
digit1 = ‘1’..’9’; (базовый тип – Сhar)
digit2 = 1..9; (базовый тип – целый)
или
Var
LatChr : ‘A’..’Z’;
Левая граница не должна превышать правую границу. Два символа .. рассматриваются как один, поэтому между ними недопустимы пробелы.
В библиотеке ТР есть две функции, поддерживающие работу с типами-диапазонами:
HIGH(X) – возвращает максимальное значение типа-диапазона (для digit2 – это 9);
LOW(X) – возвращает минимальное значение (digit2 – 1).
ВЕЩЕСТВЕННЫЕ ТИПЫ
В отличие от порядковых типов, значения которых всегда сопоставляются с рядом целых чисел и представляются в компьютере абсолютно точно, значения вещественных типов определяют произвольное число лишь с некоторой точностью, зависящей от внутреннего формата вещественного числа. Существуют следующие вещественные типы.