- •Уводзіны Ключавыя палажэнні
- •Развіццё моў камп’ютарнага праграміравання
- •Эвалюцыя мовы Pascal
- •Структурная метадалогія распрацоўкі праграм Алгарытм
- •Асноўныя этапы рашэння задач на эвм
- •Блок-схемы
- •Структураграмы
- •Тэсціраванне праграм
- •Адладка праграм
- •Структурнае праграміраванне і дакладнасць праграм
- •Асноўныя канструкцыі структур кіравання
- •Метады распрацоўкі праграм
- •Праграміраванне зверху ўніз (ад агульнага да асобнага)
- •Модульнае праграміраванне
- •Праграміраванне знізу ўверх
- •Структурнае кадзіраванне
- •Арыфметыка эвм Сістэмы злічэння
- •Пераклады лікаў з адной сістэмы злічэння ў другую
- •Пераклад цэлых дадатных лікаў з сістэмы злічэння з асновай «p» у сістэму злічэння з асновай «q»
- •Пераклад правільных дробаў з сістэмы злічэння з асновай «p» у сістэму злічэння з асновай «q»
- •Пераклад змешаных дробаў
- •Формы прадстаўлення даных
- •Формы прадстаўлення лікаў у персанальным камп’ютары
- •Захаванне лікаў з фіксаванай кропкай
- •Захаванне цэлых лікаў
- •Алгарытм прадстаўлення адмоўнага ліку ў адваротным кодзе
- •Прынцыпы захавання лікаў з плаваючай кропкай
- •Фарматы лікаў з плаваючай кропкай арыфметычнага супрацэсара ibm pc/aт 8087
- •Сродкі алгарытмічнай мовы Pascal Агульная характарыстыка алгарытмічных моў
- •Базавыя элементы мовы Pascal
- •Алфавіт
- •Лексічная структура мовы
- •Агульная структура Pascal-праграмы
- •Простыя даныя мовы Pascal і работа з імі Тыпы звестак
- •Канстанты і пераменныя
- •Абсалютныя пераменныя
- •Цэлалікавыя даныя
- •Бітавая арыфметыка
- •Дзеянні бітавай арыфметыкі
- •Сапраўдныя даныя
- •Аперацыі над сапраўднымі данымі
- •Выразы мовы
- •Літарныя даныя
- •Функцыі
- •Булеўскія даныя
- •Даныя адраснага тыпу
- •Даныя карыстальніцкага тыпу
- •Даныя пералічальнага тыпу
- •Даныя інтэрвальнага тыпу
- •Элементарныя сродкі па рабоце з данымі Наданне значэння даным
- •Найпрасцейшае вызначэнне працэдур і функцый
- •Параметры
- •Знаёмства з файлавай сістэмай
- •Файлавы тып
- •Тэкставыя стандартныя файлы
- •Увод даных розных тыпаў
- •Вывад даных розных тыпаў
- •Вывад сімвалаў
- •Вывад радковых даных
- •Вывад лагічных значэнняў
- •Вывад цэлалікавых значэнняў
- •Вывад даных сапраўднага тыпу
- •Базавыя аператары мовы і метады праграміравання Аператары
- •Простыя аператары
- •Аператар безумоўнага пераходу goto
- •Аператар выкліку працэдуры
- •Пусты аператар
- •Састаўны аператар
- •Аператары выбару
- •Умоўны аператар
- •Метады і прыёмы праграміравання
- •Аператар варыянта
- •Прыклады праграм
- •Аператары паўтарэння
- •Аператар паўтарэння for
- •Аператар паўтарэння repeat
- •Аператар паўтарэння while
- •Хуткая ступень
- •Ітэрацыйныя алгарытмы вышэйшай матэматыкі
- •Структуры даных і праца з імі сродкамі мовы Pascal Парадкавыя тыпы
- •Мноствы
- •Тыпізаваныя канстанты тыпу «мноства»
- •Дзеянні над масівамі
- •Дзеянні над элементамі масіву
- •Пераменныя тыпу «масіў» са стартавым значэннем, ці тыпізаваныя канстанты-масівы
- •Канстанты з тыпам «масіў»
- •Камбінаваны тып «запісы»
- •Змяненне (прывядзенне) тыпаў і значэнняў
- •Радкі сімвалаў
- •Наданне значэння радкам
- •Радковыя выразы
- •Рэдагаванне радкоў
- •Пераўтварэнне радкоў
- •Механізмы структуравання праграм Працэдуры і функцыі
- •Функцыі карыстальніка
- •Параметры
- •Параметры-значэнні
- •Параметры-пераменныя
- •Прынцып лакалізацыі
- •Пабочны эфект
- •Рэкурсія і ітэрацыі
- •Параметры без тыпу
- •Працэдуры і функцыі як параметры. Працэдурныя тыпы
- •Пераменныя – працэдуры і функцыі
- •Падпраграмы ў модулях
- •Выкарыстанне модуля
- •Стандартныя бібліятэчныя модулі
- •Працэдуры кіравання праграмай
- •Эфектыўнасць праграм
- •Аптымізацыя ў час кампілявання
- •Індэксацыя
- •Выкарыстанне цыклаў
- •Арганізацыя цыклаў
- •Аптымізацыя цыклаў
- •Літаратура
Падпраграмы ў модулях
Працэдуры і функцыі могуць выкарыстоўвацца ў модулях нараўне з іншымі 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 бібліятэку.