Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование на паскале2.doc
Скачиваний:
145
Добавлен:
31.03.2015
Размер:
935.94 Кб
Скачать

2.6. Модули

2.6.1. Общие сведения

Единственно возможное положение подпрограмм в стандартном Паскале – это раздел процедур и функций программы. Отсюда следует один из основных недостатков стандартной версии - невозможность раздельной компиляции подпрограмм и программы. Этот недостаток делает невозможным создание библиотеки алгоритмов в кодах ЭВМ. Процедуры можно хранить только как тексты на алгоритмическом языке, включать их в текст программы-блока и компилировать блок как единое целое.

Для обеспечения возможности компиляции программы по частям в реализациях Паскаля, начиная с Турбо Паскаля, введено новое средство языка - модули (Units).

Модуль - это автономно компилируемая программная единица, включающая в себя различные разделы описаний (типов, констант, переменных, процедур и функций) и, возможно, некоторые исполняемые операторы (например, присваивание переменным начальных значений или установление связи между программными и физическими именами файлов).

При рассмотрении модулей следует остановиться на двух вопросах: как создавать (программировать) модули и как использовать готовые модули. Этому посвящены следующие параграфы.

2.6.2. Структура модуля

Схематично структуру модуля можно изобразить следующим образом:

UNITимя_модуля;

INTERFACE

интерфейсная_часть

IMPLEMENTATION

исполняемая_часть

[BEGIN

инициирующая_часть]

END.

Модуль начинается ключевым словом UNIT, после которого пишется имя модуля, и заканчивается словомЕND, после которого ставится точка.

Модуль состоит из трех частей19. Первая часть содержит описания, доступные другим программам или модулям. Часто ее называютвидимой(ее как бы "видят" другие программы) илиинтерфейсной(она начинается с ключевого словаINTERFACE, что в переводе с английского означает "внешние связи"). От процедур и функций в первую часть включаются только заголовки.

Вторая часть содержит описания подпрограмм, заголовки которых находятся в интерфейсной части. Она называется исполняемой, так как содержит исполняемые операторы подпрограмм, и начинается с ключевого слова IMPLEMENTATION, которое переводится с английского как "исполнение". Содержание второй части доступно только данному модулю и не может использоваться другими программными единицами, поэтому ее также называют невидимой(для других программных единиц). В частиIMPLEMENTATIONв заголовках подпрограмм могут отсутствовать списки формальных параметров, так как они имеются в частиINTERFACE.

Третья часть называется инициирующей. Она содержит операторы, выполняемые до передачи управления основной программе. Они подготавливают работу модуля. Обычно это операторы инициализации переменных, открытия файлов (см. §3.3) и т. д. Инициирующая часть начинается с ключевого словаBEGIN. Она может отсутствовать (вместе с открывающим ее словомBEGIN).

Пример

Ниже приведен модуль VECTOR, позволяющий осуществлять некоторые операции над векторами. Число компонент вектора не превышает 10. Смысл процедур поясняется в комментариях.

Unit VECTOR; {операции над векторами}

INTERFACE

Type AR=Array[1..10] of real;

Function Scpr(Var a,b:Ar;N:Integer):Real;

{вычисление скалярного произведения двух векторов}

Function Lngth(Var a:Ar; N:Integer):Real;

{вычисление длины вектора}

Function UngleRad(Var a,b:Ar; N:Integer):Real;

{вычисление угла между двумя векторами в радианах}

Function UngleGr(Var a,b:Ar;N:Integer):Real;

{вычисление угла между двумя векторами в градусах}

Procedure Sum(Var a,b,c:Ar;N:Integer);

{вычисление суммы двух векторов}

Procedure Inp(Var a:Ar; N:Integer);

{ввод координат вектора}

IMPLEMENTATION

Function Scpr;

Var I:Integer; S:Real;

Begin

S:=0;

For i:=1 To N Do

S:=S+a[i]*b[i];

Scpr:=S;

End;

Function Lngth;

Begin

Lngth:=Sqrt(Scpr(a,a,N));

End;

Function UngleRad;

Var x:Real;

Begin

x:=Scpr(a,b,N)/Lngth(a,N)/Lngth(B,N);

If x=0 then UngleRad:=pi/2

Else

UngleRad:=ArcTan(Sqrt(1-x*x)/x);

End;

Function UngleGr;

Begin

UngleGr:=UngleRad(a,b,3)/pi*180;

End;

Procedure Sum;

Var i:Integer;

Begin

For i:=1 to N Do

c[i]:=a[i]+b[i]

End;

Procedure Inp;

Var I:Integer;

Begin

For i:=1 To N Do

Read(a[i]);

Readln

End;

End.

В Объектном Паскале допустима рассмотренная структура модуля. Но можно также отмечать начало инициализирующей части ключевым словом INITIALIZATION(вместоBEGIN). Модуль Объекьного Паскаля может иметь завершающую часть, которая содержит операторы, выполняемые при завершении программы, и начинается со словаFINALIZATION.

Имя файла, содержащего исходный текст модуля, должно совпадать с именем модуля и иметь расширение .PAS(для примера предыдущего раздела VECTOR.pas). Результатом компиляции будет файл с тем же именем. Расширение откомпилированного файла .TPU(например,VECTOR.tpu) для средTurboиBorlandPascalи.DCUдляDelphi.