BEGIN
Основной блок модуля
END.
Заголовок модуля аналогичен заголовку программы: в модуле вместо зарезервированного слова PROGRAM используется слово UNIT.
Здесь могут присутствовать директивы компилятору, дающие общие установки и соглашения для всего модуля.
Например,
{$S+} - директива компилятору: включить (отключить) контроль возможного переполнения стека;
{$N+} - директива компилятору: использовать числовой процессор (реализовать операции с плавающей точкой программно), применяют для переменных типа real;
{$E+} - директива компилятору: включить (отключить) режим программной эмуляции сопроцессора, применяют для переменных типа extended – вещественное число повышенной точности (10 байт).
При написании модуля необходимо придерживаться следующих основных правил:
- Имя модуля, как и имя программы не должно совпадать с именами объектов (процедур, функций и т. д.) внутри модуля (программы).
- Имя модуля должно совпадать с именем файла, в котором он будет храниться. Отсюда, имя модуля не может состоять более чем из 8 символов.
В интерфейсной части описываются все константы, типы данных и переменных, процедуры и функции, доступные в этом модуле для использования внешними программами. Интерфейсная часть модуля несёт всю информацию, необходимую для использования процедур и функций, определённых в модуле. Любая другая информация о модуле для обычного его использования не нужна.
Примечание. В рамках приложение Турбо Паскаль 7.0 поставляются стандартные модули System, Strings, Crt, Printer, Dos, WinDos, Graph, Overlay, Graph3 и Turbo3.
В интерфейсной части, возможно, сделать доступными для использования уже существующие готовые модули, указав их имена в операторе USES.
Следом за оператором USES описываются доступные извне и необходимые для описания процедур и функций определения типов данных, констант и переменных.
Все процедуры и функции, доступные для общего пользования и определённые в данном модуле, должны быть описаны в интерфейсной части своей строкой – заголовком с указанием типов параметров. Текст программы этих процедур и функций находится (с дубликатом их заголовка) в реализационной части.
Нет необходимости упоминать в интерфейсной части все процедуры и функции, используемые в реализационной части. Возможна ситуация, когда интерфейсная часть вообще ничего не содержит.
Реализационная часть – это часть, в которой определяются процедуры и функции.
Можем определить здесь, как и внутри обычной программы, глобальные (для модуля) переменные, типы данных и константы, которые не доступны извне, и могут использоваться программами, входящими в реализационную часть.
Как и интерфейсная часть, часть реализационная может быть пустой. Такую возможность используют, если необходимо определить некоторые общие для многих программ типы данных, константы и переменные. Имея такое определение в рамках одного проекта, легко включить его во все программы (неявные и подчинённые) с помощью оператора USES.
Инициализационная часть представляет собой основной блок модуля. Приведённые в ней операторы выполняются первыми, то есть они выполняются перед операторами основного блока главной программы, в которую включён данный модуль.
Чтобы окончательно оформить эту программу как модуль, необходимо сохранить объектный модуль данной программы на диске. Для опции Compile / Destination установить значение Disk и выполнить компиляцию с помощью комбинации клавиш [Ctrl + F9].
ТП7.0 распознаёт в начале текста модуля оператор модуля UNIT и автоматически создаст файл с расширением *.TPU вместо *.EXE (как для обычных программ). Выдаваемое при этом сообщение “Can not run a unit!” просто информирует Вас о том, что модуль самостоятельно не выполняется.
В опции Options / Directories установить значение параметра Include Directory равным пути, где расположен, подключаемый к основной программе, файл с расширением *.TPU (Turbo Pascal Unit), то есть модуль.
Задача 9.1. Вычислить значение функции F(x) по формуле
.
Нахождение корня n-ой степени осуществить через подпрограмму - функцию, а расчёт значения по формуле – через подпрограмму - процедуру. Подпрограммы поместить в модуль.
Листинг модуля Second
Unit second; {Имя модуля}
{second.pas}
interface {Начало раздела объявлений}
Function FunSqrt (x1: real; k: integer): real; {Вычисление корня числа}
Procedure ProcY (var y1: real; x1: real); {Расчёт значения по формуле}
Implementation {Начало раздела реализации}
Uses Crt;
Function FunSqrt; {Тело функции}
begin
FunSqrt:= exp((1/k) * ln(x1));
end;
Procedure ProcY; {Тело процедуры}
Const b = 10.7;
c = 0.4;
var a: real;
begin
a:= exp(0.1*x1) + x1;
y1:= ln(FunSqrt(a,2)) / (x1 + FunSqrt(b,3) + arctan(x1)) + c;
end;
End.
Листинг основной программы
program Task;
Uses crt,
second;{Подключение модуля, в котором хранятся функция вычисления корня и процедура вычисления значения по формуле}
Var x, y: real; {Глобальные переменные}
s: char;
begin
ClrScr;
Repeat
TextColor(12); {Розовый цвет текста}
Writeln('Введите значение переменной Х:');
Readln (x);
ProcY (y,x); {Вычисляется значение по формуле}
TextColor(9); {Синий цвет текста}
Writeln('Значение переменной Y равно:', '':2, y:10:6);
TextColor(14); {Жёлтый цвет текста}
Writeln('Продолжить (Y/N)?');
Readln (s);
Until (s = 'N') or (s = 'n');
end.
Примечание. Так как заголовки функции Funsort и процедуры Procy в модуле были описаны в интерфейсной части, то это позволит пользователю использовать эти подпрограммы в любой другой внешней программе, подключив соответствующий модуль. Учитывая условия задачи, где требовалось во внешней программе вычислить только значение переменной y по указанной формуле, подставляя каждый раз различные значения x, то есть использовать только процедуру, необходимо изменить листинг модуля. Для этого достаточно описание заголовка функции Funsort, вычисляющей корень n-ой степени, из интерфейсной части переместить в раздел реализации.
Задача 9.2. Дана матрица A(n, m). Необходимо: упорядочить элементы в каждой строке матрицы по возрастанию, а сами строки расположить по убыванию количества положительных элементов в строке. В программе организовать вызов процедуры, реализующей общую часть задания. Формирование элементов массива A случайным образом, вывод элементов массива оформить в виде процедур. Сортировку строк и элементов в строках матрицы A оформить в подпрограммах (процедурах). Нахождение количества положительных элементов в строке матрицы А выполнить с помощью функции. Процедуры и функцию описать в модуле.
Листинг модуля Second2
unit second2;