Модули
Структура модуля
unit <идентификатор>;
interface
uses <список модулей>; { Необязательный }
{ глобальные описания }
implementation
uses <список_модулей>; { Необязательный }
{ локальные описания }
{ реализация процедур и функций }
begin
{ код инициализации }
end.
Пример готового модуля
unit IntLib;
interface
procedure ISwap(var I,J: integer);
function IMax(I,J: integer): integer;
implementation
procedure ISwap;
var
Temp: integer;
begin
Temp:= I; I:= J; J:= Temp
end; { конец процедуры ISwap }
function IMax;
begin
if I > J
then IMax:= I
else IMax:= J
end; { конец функции IMax }
end. { конец модуля IntLib }
Теория
Модуль — автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний(типы, константы, переменные, процедуры, функции) и, возможно, некоторые исполняемые операторы инициирующей части.
Используется для:
ñ Разбития сложной программы на несколько простых самостоятельных частей(как следствие — простое обновление готовой программы)
ñ Повторное использование функционала в разных программах
ñ Распространение скомпилированных модулей — отличная идея, если вы хотите поделится своими наработками, но не хотите показывать свой исходный код
Заголовок
Заголовок начинается зарезервированным словом unit и следующего за ним имени модуля.
Имя модуля должно совпадать с именем файла модуля. Например
Unit primer1;
файл primer1.tpu
Интерфейсная часть
В интерфейсной части содержится объявления всех глобальных объектов — типов, констант, переменных и подпрограмм. В случае подпрограмм(функций и процедур) записывается только заголовок.
Пример
Unit complexn;
Interface Type Complex= record
Re, im: real;
End;
Procedure AddC(x,y: complex, var z: complex);
Procedure MulC (x,y: complex, var z: complex);
Теперь если в программе написать
uses complexn;
То в ней будут доступы тип Complex, процедуры AddC, MulC
В интерфейсной части модулей паскаля нельзя использовать опережающее описание.
Исполняемая часть
Исполняемая часть начинается с ключевого слова implementation и содержит описание подпрограмм, объявленных в интерфейсной части.
В описании могут быть использованы локальные объекты. В описании подпрограмм можно опустить описание формальных переменных и тип возвращаемого значения(это уже описано в интерфейсной части).
Пример
Implementation
Procedure AddC;
z.re:= x.re + y.re;
z.im:= x.im + y.im;
end;
Инициируемая часть
Завершает модуль. Необязательна, begin-end этой части могут быть опущены.
Операторы в инициируемой части выполняются до передачи управления основной программе.
Это означает, что операторы в инициируемой части модуля будут выполнятся до основной программы, если мы подключили этот модуль.
Множества
Множество — это структурированный тип данных, представляющий собой набор взаимосвязанных по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое целое. Каждый объект в множестве называется элементом множества.
Нельзя использовать стандартные процедуры ввода-вывода для множественных переменных.
Объявление множеств
Пример:
Var A, D: Set Of Byte;
B: Set Of 'a'..'z';
C: Set Of Boolean;
D: Set Of 'a','b','c';
Операции над множествами
ñ Объединение
ñ Пересечение
ñ Разность
ñ Вхождение
Объединение обозначается знаком +
Как это работает: [1, 2, 3, 4] + [3, 4, 5, 6] => [1, 2, 3, 4, 5, 6]
Пересечение обозначается символом *
Разность обозначается символом -
Операция вхождения обозначается in
Возвращает истину, если значение(первый операнд) входит во множество (второй операнд)
g in ['a'..'z'] – true
4 in [6..10] – false
Инициализация переменных
Всем переменным при объявлении по умолчанию присваивается нулевое значение.
Pascal позволяет задавать значение переменной уже при её объявлении.
Конструкция выглядит так
Имя_переменной: тип = значение;
Эта конструкция должна быть размещена в разделе описания констант, хотя не имеет с последними ничего общего.
Пример
const
N = 130;
temp: integer = 20;
Объявили переменную temp типа integer и инициализировали её значением 20.
Работа с файлами
Файловый тип переменной
Синтаксис:
ñ Типизированные файлы - <имя>: FILE OF <тип>
ñ Нетипизированные файлы - <имя>: FILE
ñ Текстовые файлы - <имя>: TEXT
Процедуры и функции работы с файлами
Assign
Assign(f, FileName)
Связывает файловую переменную f с файлом, который имеет путь FileName.
Эту связь можно будет в последствии переназначить с помощью этой функции.
Reset
Reset(f)
открывает файл на чтение
Close
Close(f)
Сбрасывает буфер и закрывает файл
EOF
EOF(f): boolean
истина — достигнут конец файла
Rename
Rename(f, NewName)
позволяет переименовать физический файл на диске, связанный с файловой переменной f. Переименование возможно после закрытия файла.
Erase
Erase(f)
уничтожает физический файл на диске, который был связан с файловой переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт.
IOResult
Без аргументов
возвращает целое число, соответствующее коду последней ошибки ввода - вывода. При нормальном завершении операции функция вернет значение 0
Работа с типизированными файлами
Типизированный файл - это последовательность компонент любого заданного типа (кроме типа "файл"). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту.
Запись в файл:
Write(f, список переменных);
Процедура записывает в файл f всю информацию из списка переменных.
Чтение из файла:
Read(f, список переменных);
Процедура читает из файла f компоненты в указанные переменные. Тип файловых компонент и переменных должны совпадать. Если будет сделана попытка чтения несуществующих компонент, то произойдет ошибочное завершение программы. Необходимо либо точно рассчитывать количество компонент, либо перед каждым чтением данных делать проверку их существования (функция eof, см. выше)
Смещение указателя файла:
Seek(f, n);
Процедура смещает указатель файла f на n-ную позицию. Нумерация в файле начинается с 0.
Определение количества компонент:
FileSize(f): longint;
Функция возвращает количество компонент в файле f.
Определение позиции указателя:
FilePos(f): longint;
Функция возвращает порядковый номер текущего компонента файла f.
Отсечение последних компонент файла:
Truncate(f);
Процедура отсекает конец файла, начиная с текущей позиции включительно.