logo
методичка_1_05_ВНУ

Модулі Модуль і його структура

Модуль - це сукупність сталих, типів даних, змінних, про­цедур і функцій, які можна використати у програмі або в іншому модулі. Сам модуль не є виконуваною програмою. Мо­дульний підхід до проектування дає змогу розділити програму на частини, які компілюють окремо. Модулі можна створювати самостійно, а також використовувати стандартні, що їх надає Турбо Паскаль.

Структура модуля має такий вигляд:

unit <ім'я>

interface

uses <список модулів>

{відкриті оголошення}

implementation

uses <список модулів>

{власні оголошення}

{реалізація процедур і функцій}

begin

{коди ініціалізації}

end

Модуль починається зі слова unit, яке разом з іменем є заго­ловком модуля. Наступне службове слово interface означає по­чаток секції інтерфейсу модуля, доступного для всіх інших модулів і програм, які використовують цей модуль. В інтерфейсі модуля можуть бути оголошені сталі, типи даних, змінні, про­цедури і функції. Будь-яка програма, що застосовує цей модуль, має доступ до всіх елементів, оголошених у його інтерфейсі. Щодо процедур і функцій, то в секції інтерфейсу зазначені тіль­ки їхні заголовки, а самі оператори, що реалізують їх, описані в наступній секції реалізації.

Секція інтерфейсу закінчується словом implementation, яке одночасно розпочинає секцію реалізації. Все, що описане в І секції інтерфейсу, є доступним секції реалізації. Крім цього, в секції реалізації можуть бути свої описи, уже недоступні програмам, що використовують цей модуль. Ці описи використовують процедури і функції, зазначені у секції інтерфейсу. Ці процедури і функції повторно описують в секції реалізації, їхній заголовок може бути такий же, як у секції інтерфейсу, або мати коротку форму, що містить слово procedure (function), після якого йде ім'я без зазначення параметрів і типу. Підпрограми секції реалізації, не описані в секції інтерфейсу, повинні мати повний заголовок.

Слово uses можна застосовувати як у секції інтерфейсу, так і в секції реалізації. В першому випадку його записують відразу після слова interface і воно означає те, що сталі, типи даних і змінні, оголошені в інтерфейсі модулів, імена яких пелічені після слова uses, можна використати в будь-якому оголошенні в інтерфейсі цього модуля. В другому випадку слово uses записують відразу після слова implementation і воно означає те, що сталі, типи даних і змінні, оголошені в інтерфейсі перелічених після uses модулів, доступні тільки в секції реалізації цього модуля.

Секція реалізації розміщена між словами implementation і end. Якщо ж перед end є слово begin і деякі оператори, то одержаний складений оператор стає секцією ініціалізації модуля. В цій секції відбувається ініціалізація структур даних, що їх використовує модуль або які доступні програмам, що застосовують цей модуль. Також тут відкриваються файли, які використовуються в програмах. Під час виконання програми секцію ініціалізації викликає тіло програми, що застосовує мо­дуль. Якщо ж у програмі є декілька модулів, то спочатку будуть викликані секції ініціалізації всіх модулів, а потім послідовно виконуються оператори з тіла програми.

Відтрансльовані модулі зберігаються в спеціальному двійковому форматі, стандартні - у файлі TURBO.TPL (вони автоматично завантажуються в пам'ять разом з Турбо Паскалем).

Для використання модулів треба, щоб після заголовка програми було речення uses, а далі зазначений список імен усіх модулів, що їх використовує програма. Наприклад:

program PRG;

uses MOD1, MOD2, MODS;

Імена модулів розділяють комами, вони можуть бути оголошені в будь-якому порядку. Якщо ж речення uses нема, то Турбо Паскаль приєднує стандартний модуль System, який забезпечує виконання стандартних підпрограм (процедур і функцій).

Наведемо приклад використання модулів і посилання на елементи, оголошені в модулі. Нехай є модуль

unit MODL;

interface

const

MV=75;

type

MS=(A,B,C);

var

MW: string[30];

procedure SMW(s: MS);

function ТА: integer;

implementation

...............................

end.

Наведена нижче програма використовує елементи, оголо­шені в секції interface цього модуля:

program TS;

uses MODL;

const

MV=12;

type

TP=1..30;

var

i: integer;

AS: MS;

function ТА: ТР;

begin

TA:=-1;

end;

begin

AS:=A;

SMW(AS);

writeln(MODL.MV);

writeln(MV);

I:=TA;

writeln(l);

end.

У програмі деякі індентифікатори, оголошені у використо­вуваному нею модулі, можна перевизначити (MV, ТА). Під час виконання програма застосовує свої власні описи, оскільки вони зроблені пізніше, ніж у модулі. Якщо ж треба використати . оголошення ідентифікатора з модуля, то для цього перед ідентифікатором зазначають ім'я модуля з крапкою. В нашому при­кладі в програмі TS для функції ТА використано її опис у самій програмі, тоді як для сталої MV має сенс її визначення, оголо­шене в секторі інтерфейсу модуля MODUL.

Може трапитися, що описи перетинаються в модулях, які використовує програма чи модуль. Тоді дійсні ті описи (видимі), які містяться в інтерфейсній частині модуля, зазначеного піз­ніше в списку uses цієї програми чи модуля.

В Турбо Паскалі можна робити рекурсивні посилання мо­дулів. У секції реалізації кожного з двох модулів може бути звертання до процедури, оголошеної в секції реалізації іншого з цих двох модулів. Для забезпечення такої можливості по­трібно в реченні uses секції реалізації кожного модуля зазна­чити ім'я іншого модуля, на який є посилання.

Приклад програми опрацювання матриць (множення мат­риць, додавання вектора до рядка матриці):

unit MODI;

interface

const

М=100;

t=2;

type

VECT=array [1..M] of integer,

TABL=array [1..M, 1..M] of integer;

var

i,j,r: integer;

procedure MULT(var A,B,C: TABL; m,n,k: integer);

procedure ADD(var A: TABL; var Q: VECT; m,n: integer);

implementation

procedure MULT;

{Множення матриць}

begin

for i:=1 to m do

for j:=1 to k do

begin

C[i,j]:=0;

for r:=1 to n do C[I,j]:=C[I,j]+A[I,r]*B[r,j]

end

end;

procedure ADD;

{Додавання вектора до 1-го рядка матриці}

begin

for i:=1 to n do A[l,i]:=A[l,i]+Q[i];

end

end.

unit MOD2;

interface

uses MOD1 ;

procedure VVD(var A: TABL; m,n: integer);

procedure VYV(var A: TABL; m,n: integer);

implementation

procedure VVD;

{Уведення матриці}

begin

for i:=1 to m do

for j:=1 to n do read(A[i,j])

end; {ofVV}

procedure VYV;

{Виведення матриці}

begin

for i:=1 to m do

begin

for j:=1 to n do write(A[i,j]);

writeln

end;

end; {of VYV}

end. {of MOD2}

program MATR(input.output);

uses MOD1,MOD2;

{Опрацювання матриць}

var

A1,B1,C1:TABL;

P: VECT;

m1,n1,k1: integer;

t,i: integer;

begin

VVD(A1,m1,n1);

VVD(B1,n1,k1);

MULT(A1,B1,C1,m1,n1,k1);

VYV(C1,m1,k1);

for i:=1 to n1 do read(P[i]);

read(t);

ADD(A1,P,t,n1);

{Якщо в ADD замість t записати MODl.t, то відповідний ідентифікатор t буде переданий з модуля MOD1}

VYV(C1,m1,n1)

end.