- •Лабораторная работа № 2 Модули
- •Теоретическая часть
- •Что такое модуль?
- •Структура модуля
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Как используются модули?
- •Ссылки на описания модуля
- •Оператор uses секции реализации
- •Создание ваших собственных модулей
- •Компиляция модуля
- •Практическая часть
- •Задания
Оператор uses секции реализации
Borland Pascal позволяет вам размещать в секции реализации оператор uses. В случае его присутствия оператор uses должен следовать непосредственно за ключевым словом implementation (аналогично тому, как в интерфейсной секции оператор uses должен следовать непосредственно за ключевым словом interface).
Размещение в секции реализации оператора uses позволяет "скрыть" внутренние детали модуля, поскольку используемые в секции реализации модули оказываются "невидимыми" для того, кто этот модуль использует. Более важным, однако, является то, что это позволяет вам строить взаимнозависимые модули.
Поскольку программные модули в Borland Pascal не обязаны иметь строго иерархическую структуру, то допускается использовать циклические ссылки на модули.
Создание ваших собственных модулей
Если вы хотите написать модуль, содержащий некоторые полезные подпрограммы, и использовать эти подпрограммы в своих программах, напишите модули и сохраните его под именем, заданным в заголовке модуля. Borland Pascal сохраняет файл с расширением .PAS, как и любой другой файл, созданный в редакторе Borland Pascal. В исходном файле может содержаться только один модуль.
Компиляция модуля
При компиляции модуля вместо создания файла .EXE Borland Pascal создает файл .TPU. Модуль является независимой единицей компиляции, но исполняться не может.
Пример
Теперь напишем небольшой модуль. Назовем его IntLib и вставим в него две простые подпрограммы для целых чисел - процедуру и функцию:
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 }
Наберите этот модуль, запишите его в файл INTLIВ.PAS, а затем скомпилируйте его. Программа, которая использует модуль IntLib, будет иметь вид:
program IntTest;
uses IntLib;
var
A,B : integer;
begin
Write('Введите два целочисленных значения: ');
Readln(A,B);
ISwap(A,B);
Writeln('A = ',A,' B = ',B);
Writeln('Максимальное значение равно ',IMax(A,B));
end. { конец программы IntTest }
Практическая часть
Разработать модуль одного из двух вариантов:
Модуль приближенного решения алгебраических и трансцендентных уравнений;
Модуль приближенного вычисления интеграла.
В качестве примера рассмотрим упрощенный модуль приближенного вычисления интеграла методом трапеций.
unit Proc;
interface
type
MathFunc = function(x: Real): Real;
function Area(a, b: Real; n: Integer; f: MathFunc): Real;
implementation
function Area(a, b: Real; n: Integer; f: MathFunc): Real;
var
i: Integer;
s, h, c, d: Real;
begin
s := 0;
h := (b-a)/n;
for i:= 1 to n do
begin
c := a+h*(i-1);
d := a+h*i;
s := s+h*(f(c)+f(d))/2;
end; { for }
Area := s;
end; { Area }
end. { Proc }
Здесь функция приближенного вычисления определенного интеграла методом трапеций Area имеет четыре параметра: a, b, n и f. a и b имеют тип Real, представляющие соответственно начало и конец интервала, на котором выполняется аппроксимация; n - это целое число подынтервалов; f - формальный параметр процедурного типа MathFunc, используемый в качестве имени функции. Фактический параметр, связанный с f, должен быть именем функции вещественного типа. Эта функция определяет кривую, площадь под которой вычисляется.
Программа, тестирующая функцию Area для подынтегральной функции
f(x) = x2 - x
может иметь вид
program ProcTypeDemo;
uses Proc;
var
a, b: Real;
n: Integer;
{$F+}
function Func(x: Real): Real;
begin
Func := Sqr(x)-x;
end;
{$F-}
begin
Write('A - нижняя граница интервала : '); Readln(a);
Write('B - верхняя граница интервала: '); Readln(b);
Write('N - число подинтервалов : '); Readln(n);
Writeln('---------------------------------------------');
Writeln('S - площадь под кривой : ', Area(a,b,n,Func):10:2);
Readln;
end. { ProcTypeDemo }
