Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцый для 1 курса-1 семестр.doc
Скачиваний:
3
Добавлен:
09.11.2019
Размер:
2.95 Mб
Скачать

Падпраграмы ў модулях

Працэдуры і функцыі могуць выкарыстоўвацца ў модулях нараўне з іншымі Pascal-аб’ектамі. Лічыцца, што загаловак падпраграмы з’яўля­ец­ца яе інтэрфейсам (бачны), а цела – рэалізацыяй (нябачны), бо загаловак утрымлівае ўсю інфармацыю, неабходную для выкліку: яе імя, колькасць і тыпы параметраў, а для функцый – і тып выніку. А цела падпраграмы раскрывае алгарытм.

Значыць, у інтэрфейснай частцы модуля прадстаўлены толькі за­га­лоў­кі пра­цэдур і функцый, бачныя (даступныя) для другіх праграм, а іх поўнае апісанне, якое змяшчаецца ў раздзеле рэалізацыі, можа мець скарочаны загаловак, які складаецца толькі са службовага слова PROCEDURE ці FUNCTION, імя падпраграмы і «;». (Але можна ідэнтычна паўтарыць і поўны загаловак.)

Прыклад. У наступным модулі сабраны сродкі работы з кам­плекс­ны­мі лікамі, якія далей можна пашырыць: а) на работу з масівамі: пера­мно­жыць матрыцы, матрыцу на вектар і г. д.; б) падлік трыганаметрычных функцый ад камплекснага аргумента і г. д.

UNIT CmplVals;

INTERFAСE

TYPE

Complex = RECORD

Re, Im : Real

END;

{загалоўкі працэдур, якія рэалізуюць аперацыі

над камплекснымі лікамі}

PROCEDURE InitC (R, I : Real; VAR C : Complex);

PROCEDURE AddC (C1, C2 : Complex; VAR R : Complex);

PROCEDURE MultC (C1, C2 : Complex; VAR R : Complex);

PROCEDURE DivC (C1, C2 : Complex; VAR R : Complex);

PROCEDURE WriteC (C : Complex);

FUNCTION ModC (C : Complex) : Real;

IMPLEMENTATION

{поўнае апісанне працэдур}

PROCEDURE InitC;

BEGIN

WITH C DO

BEGIN

Re := R;

Im := I

END

END;

PROCEDURE AddC (C1, C2 : Complex; VAR R : Complex);

BEGIN

WITH R DO

BEGIN

Re := C1.Re+C2.Re;

Im := C1.Im+C2.Im

END

END;

PROCEDURE MultC (C1, C2 : Complex; VAR R : Complex);

BEGIN

WITH R DO

BEGIN

Re := C1.Re * C2.Re – C1.Im * C2.Im;

Im := C1.Re * C2.Im + C2.Re * C1.Im

END

END;

FUNCTION ModC (C : Complex) : Real;

BEGIN

ModC := C.Re * C.Re + C.Im * C.Im;

END;

PROCEDURE DivC (C1, C2 : Complex; VAR R : Complex);

VAR Tmp : Real;

BEGIN

Tmp := ModC(C2);

WITH R DO

BEGIN

Re := (C1.Re * C2.Re + C1.Im * C2.Im)/Tmp;

Im := (C2.Re * C1.Im – C1.Re * C2.Im)/Tmp

END

END;

PROCEDURE WriteC (C : Complex);

BEGIN

WITH C DO

BEGIN

Write(Re); IF Im = 0 THEN Exit;

IF Im  0 THEN Write ('+');

Write(Im); Write ('i');

END

END;

END.

Такім чынам, механізм модуляў дазваляе скрыць дэталі рэалізацыі тых ці іншых праграмных падсістэм. Як вынік змяненне рэалізацыі якой-небудзь падпраграмы пры ўмове, што інтэрфейс модуля пры гэтым застанецца нязменным, ніяк не адаб’ецца на праграмах.

Разгледзім праграму, якая выкарыстоўвае модуль CmpVals:

PROGRAM UsingComplex;

USES CmpVals;

{каб атрымаць доступ да інтэрфейсных

аб'ектаў модуля, неабходна ўказаць

у праграме імя патрэбнага TPU-файла}

VAR C1, C2, C3 : Complex;

{тып Complex, які зададзены ў модулі, даступны тут

таксама, як быццам ён у праграме вызначаны}

BEGIN

InitC(1, 2, C1);

InitC(3, 4, C2);

MultC(C1, C2, C3);

WriteC(C3);

DivC(C1, C2, C3);

WriteC(C3)

END.

Модуль кампілюецца такім жа чынам, як і праграма, але паколькі мо­дуль не з’яўляецца непасрэдна выконваемай адзінкай, то ў выніку яго кам­піляцыі ўтвараецца дыскавы файл з пашырэннем .TPU (Turbo Pascal UNIT), пры гэтым імя TPU-файла бярэцца з іменем файла з зыходным тэкстам модуля. Значыць, калі мы хочам стварыць модуль UNIT, то трэ­ба, каб у файла, у якім ён будзе захаваны, імя было такім жа, як і ў мо­дуля UNIT.

Спецыфікацыя USES павінна ісці непасрэдна пасля загалоўка пра­грамы, таму што яна ўтрымлівае вызначэнні даных і падпраграм. Калі некаторы модуль падключаецца ў модуль, тады USES павінен ісці адразу пасля службовага слова INTERFAСE.

У сувязі з выкарыстаннем модуляў узнікаюць наступныя важныя мо­манты.

1. Можа здарыцца, што ідэнтыфікатары інтэрфейснай часткі модуля часткова перасякаюцца з ідэнтыфікатарамі праграмы. У гэтым выпадку ідэнтыфікатары праграмы «экраніруюць» (зацямняюць) аднайменныя ідэнтыфікатары модуля. Напрыклад:

PROGRAM Pr;

USES A, B; …

У такім выпадку ідэнтыфікатары праграмы Pr зацямняюць ідэн­ты­фі­ка­тары модуля B, а тыя зацямняюць ідэнтыфікатары модуля A.

2. Але калі ўсё ж трэба звярнуцца да аднайменнага данага з модуля, то ўтвараецца састаўное імя па прынцыпу Unitname.name, структура якога падобна на селектар поля запісу. Напрыклад:

X := A.X;

Пераменнай х праграмы Pr надаецца значэнне пераменнай х модуля А.

3. Магчымы выпадкі ўскоснага выкарыстання модуляў.

UNIT A;

INTERFAСE

END.

UNIT В;

INTERFAСE

USES A;

END.

PROGRAM P;

USES B; …

END.

Дастаткова ўказаць толькі модулі, якія непасрэдна выкарыстоўваюц­ца ў праграме.

4. Схема выкарыстання модуляў можа ўтвараць дрэвападобную струк­туру любой складанасці, але пры гэтым недапушчальны яўны ці ўскосны зварот модуля да самога сябе.

5. Калі ў модулі існуе раздзел ініцыялізацыі, то аператары з гэтага раз­дзела будуць выкананы перад пачаткам выканання праграмы (ці мо­ду­ля), у якой выкарыстоўваецца дадзены модуль.

Вывады. 1. Раздзел UNIT змяшчае імя бібліятэчнага модуля. Яно па­вінна супадаць з іменем дыскавага файла, дзе знаходзіцца зыходны тэкст модуля.

UNIT Stat stat.pas (захавалі ў файле) stat.tpu

У інтэрфейснай частцы апісваюцца канстанты, тыпы, пе­ра­мен­ныя, працэдуры і функцыі, якія з’яўляюцца глабальнымі, г. зн. да­ступ­нымі асноўнай праграме (ці модулю, які выкарыстоўвае дадзены мо­дуль). Асноўная праграма мае да іх просты доступ.

У секцыі рэалізацыі вызначаюцца модулі ўсіх глабальных пад­пра­грам. Акрамя таго, у ёй апісваюцца канстанты, пераменныя, пад­пра­гра­мы, якія ўжо лакальныя, г. зн. недаступныя асноўнай праграме.

2. Секцыя ініцыялізацыі – апошняя секцыя модуля. Пачынаецца сло­вам BEGIN, і далей размяшчаюцца аператары ініцыялізацыі, калі яны ёсць.

Структурная дыяграма модуля:

Убудаваны кампаноўшчык файлаў шукае падключаны UNIT спачатку ў TURBO.TPL (Turbo Pascal Library), а потым у UNIT-дырэкторыі, вызначанай у асяроддзі Turbo.

Свае модулі можна змяшчаць у TURBO.TPL спецыяльнай утылітай, але лепш пабудаваць сваю MyUnits бібліятэку.