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

Параметры-значэнні

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

Сінтаксічная дыяграма параметраў значэнняў:

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

Параметры-пераменныя

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

Сінтаксічная дыяграма параметраў-пераменных:

Прыклад. Надрукаваць у двайковым уяўленні нейкі цэлы лік.

PROCEDURE Write_Integer_To_Binary;

FUNCTION Binary (x : Longint; NumOfbits : Byte) : STRING;

{дзе Longint – 4 байты = 32 біты,

а NumOfbits – колькасць рэальных бітаў}

VAR bit, I : Byte;

S : STRING[32];

BEGIN

S := '';

FOR i := 0 TO 31 DO

BEGIN

bit := (X SHL i) SHR 31;

S := S + chr(Ord('0') + bit);

END;

Delete (S, 1, 32 - NumOfbits);

Binary := s;

END;

VAR i : Integer;

BEGIN

FOR i := -5 TO 5 DO

Writeln(i:7, '->', Binary(Longint(i),8*sizeof(i)));

Readln

END;

Заданне. Цэлы дадатны лік m запісваецца ў двайковай сі­стэ­ме злі­чэн­ня, і разрады ў гэтым уяўленні перастаўляюцца ў адва­рот­ным парадку (рэверс). Узяць атрыманы лік у якасці значэння функцыі Вit_Re­ve­res(m). Надрукаваць значэнні Bit_Reveres(m) для m = 512 да 1012 з крокам 50.

Яшчэ адзін механізм перадачы звестак падпраграмам засноўваецца на прынцыпе лакалізацыі.

Прынцып лакалізацыі

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

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

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

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

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

Вывад. Адзін і той жа аб’ект можа быць лакальным і глабальным. Трэба кожны раз уяўляць, адносна чаго мы яго разглядаем.

Трэба памятаць, што змяненне ў падпраграме лакальнага аб’екта ніяк не праяўляецца ў ахопліваючай праграме. Калі ж змяняецца глабальны аб’ект – гэта іншая справа.

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

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

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

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

Прыклад. Што будзе надрукавана?

PROGRAM Pr;

VAR x, y : Integer;

PROCEDURE P;

VAR y : Byte;

BEGIN

x := x + 1; y := 1;

Writeln ('у падпраграме x=', x : 4, ' y=', y : 4);

END;

{ у падпраграме x=1 y=1}

VAR a, b, c : …;

{гэтыя глабальныя пераменныя ўжо недаступныя ў P,

бо яны апісаны пазней за P}

BEGIN

x := 0; y := 0;

P;

{тут актывізуецца падпраграма P,

у якой глабальная пераменная x атрымае другое значэнне}

Writeln ('у праграме x=', x : 5, ' y=', y : 5);

{у праграме x=1 y=0}

END.