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

Пераменныя – працэдуры і функцыі

Прымяненне працэдурнага тыпу не абмяжоўваецца толькі адным апі­сан­нем параметраў – працэдур ці функцый. Калі ёсць тып, значыць, могуць быць і пераменныя такога тыпу.

Працэдурныя пераменныя па фармаце сумяшчальныя з пераменнымі ты­пу Pointer і пасля прывядзення тыпаў могуць абменьвацца з імі зна­чэн­ня­мі.

Адносна папярэдняй праграмы могуць быць такія змяненні. Дабавім

VAR Oper : Func;

Cond : Char;

У галоўнай праграме выканаем наступныя дзеянні:

Writeln('задай аперацыю (*/+)');

Readln(Cond);

Writeln;

CASE Cond OF

'*' : Oper := Mult;

'+' : Oper := Add

END;

MakeTable(16, 16, Oper, Cond); ...

Заўвага. Падпраграма, якая надаецца працэдурнай пераменнай:

1) не павінна быць стандартнай працэдурай ці функцыяй.

Гэта абмежаванне можна абысці такім, напрыклад, прыёмам: выклік стан­дар­т­най падпраграмы заключыць у «абалонку».

VAR Func : FUNCTION(x : Real) : Real;

FUNCTION MySin(x : Real) : Real; FAR;

BEGIN

MySin:=Sin(x)

END;

Func:=MySin;

2) не можа быць укладзена ў другія падпраграмы;

3) не можа быць падпраграмай спецыяльнага віду, якая мае спе­цы­фі­ка­цыю INTERRUPT ці канструкцыю INLINE.

Пераменныя працэдурных тыпаў, каб быць сумяшчальнымі па на­дан­ні зна­чэн­ня, павінны мець:

аднолькавую колькасць фармальных параметраў;

параметры на адпаведных пазіцыях павінны належаць аднаму і таму ж ты­пу (супадаць).

У выніку функцый павінны супадаць тыпы значэнняў, якія вяр­та­юц­ца.

Разгледзім задачу падліку значэння вызначанага інтэграла, сэнс яко­га – плош­ча крывалінейнай трапецыі.

Прыклад. Саставіць падпраграму вылічэння значэння інтэграла па фор­му­ле трапецый.

дзе i = 1, 2, …, n – 1, – лік адрэзкаў разбіўкі інтэрвалу інтэгравання.

Па гэтай праграме падлічыць і для нейкага зададзенага n.

Рашэнне.

PROGRAM Int;

CONST n = 20;

TYPE

TFunc = FUNCTION(x : Real) : Real;

VAR fu: TFunc;

FUNCTION f1(x : Real) : Real; FAR;

BEGIN

f1 := (x * x * ln(x)) / (Sin(x) + x)

END;

FUNCTION f2(x : Real) : Real; FAR;

BEGIN

f2 := x * x / (Cos(x) + x)

END;

FUNCTION Trap(n : Integer; a,b: Real; f : TFunc) : Real;

VAR

h, s, x : Real;

i : Integer;

BEGIN

h := (b - a) / n;

s := (f(a) + f(b)) * 0.5;

x := a;

FOR i := 1 TO n - 1 DO

BEGIN

x := x + h;

s := s + f(x)

END;

Trap := h * s;

END;

BEGIN

Writeln('n=', n);

fu := f2;

Writeln(Trap(n,pi/4,pi/2, f1),Trap(n,pi/6,pi/3,fu));

END.

Модулі

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

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

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

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

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

Усе праграмныя рэсурсы модуля можна разбіць на дзве часткі:

 аб’екты, прызначаныя для выкарыстання другімі праграмамі ці мо­дулямі;

 аб’екты рабочага характару.

Модуль мае тры часткі – інтэрфейсную, рэалізацыі і ініцыялізацыі.

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

Агульная структура модуля:

UNIT Unitname;

INTERFAСE

Frame10

Апісанне тыпаў, канстант, пераменных, працэдур, функцый

IMPLEMENTATION

Frame11

Рэалізацыя працэдур і функцый, якія апі­саны ў інтэрфейснай частцы, і да­па­мож­ных алгарытмаў, тыпаў, канстант і пе­ра­мен­ных

BEGIN

Frame12

Прызначаны для ўстаноўкі пачатковых значэнняў пераменных модуля перад яго выкарыстаннем

END.

Пры апісанні модуля выкарыстоўваюцца службовыя словы: UNIT, INTERFAСE, IMPLEMENTATION.

Прыклад.

UNIT Calendar;

INTERFAСE

TYPE

Days = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

WorkingDays = Mon .. Fri;

Months = (Jan, Feb, Mar, Apr, May, June,

Jule, Aug, Sept, Oct, Nov, Desem);

Summer = June .. Aug;

Autumn = Sept .. Nov;

Spring = Mar .. May;

Dayno = 1 ..31;

Yearno = 1900 ..2020;

Date = RECORD

Day : Dayno;

Month : Months;

Year : Yearno

END;

{тут можна апісаць падпраграмы на атрыманне дня

нядзелі па зададзеным мінулым дні, месяцы, годзе ...}

IMPLEMENTATION

END.

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

Падключэнне модуля адбываецца ў пачатку праграмы аператарам Uses.