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

Параметры без тыпу

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

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

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

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

Прыклад. Раздрукаваць значэнне пераменнай любога тыпу ў 16-й с/зл.

Алгарытм. Вызначым працэдуру Dump ад двух параметраў: імя пе­ра­мен­най і яе даўжыня ў байтах. Тады рашэнне будзе такое:

PROGRAM Write_Value;

VAR x : Real;

s : STRING;

a : ARRAY[1..255] OF Integer;

PROCEDURE Dump(VAR z; len : Word}; {даўжыня z у байтах}

... {рэалізацыю разгледзім крыху пазней}

END;

BEGIN

Dump(x, SizeOf(x));

Dump(a, SizeOf(a));

{там выпадковая інфармацыя – смецце}

x:=1;

s:='0-x-0x-0x';

Dump(x, SizeOf(x));

Dump(s, SizeOf(s));

END.

Зараз распрацуем Procedure Dump.

Алгарытм. На перададзеную пераменную Z даўжынёй len байтаў на­ло­жым масіў байтаў. У кожным байце змяш­ча­юц­ца дзве 16-я лічбы з мноства базісных лікаў: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.

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

PROCEDURE Dump(VAR Z; len : Word);

TYPE

St2 = STRING[2];

VAR M : ARRAY[1..$FFF0] OF Byte ABSOLUTE Z;

{гэта размяшчэнне масіву па канкрэтным адрасе ў аператыўнай памяці (Absolute)}

i : Word;

FUNCTION Hext(B : Byte) : St2;

CONST HexDigit : ARRAY[0..15] OF

Char = '0123456789ABCDEF';

BEGIN

Hext:=HexDigit[B SHR 4]+HexDigit[B AND $F];

END;

BEGIN

Writeln;

Writeln;

FOR i:=1 TO len DO Write(Hext(M[i]));

Writeln

END; {Dump}

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

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

Вызначэнне працэдурнага ці функцыянальнага тыпу аналагічна за­га­лоў­ку падпраграмы з тым адрозненнем, што імя падпраграмы не за­да­ецца.

Працэдурны тып:

Імёны параметраў могуць быць выбраны адвольна.

Прыклады.

TYPE

Proc = PROCEDURE;

BinOperation = FUNCTION(x, y : Real) : Real;

UnOperation = FUNCTION(x : Real) : Real;

Reading = PROCEDURE(VAR F:Text; VAR Elem:Char);

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

Прыклад.

TYPE

Proc = PROCEDURE(T : Real);

VAR

ArProc : ARRAY[1..10] OF Proc;

Да азначаных вышэй даных можна звяртацца наступным чынам: ArProc[7]((x + 17,5) * 2).

Пасля аб’яўлення працэдурнага ці функцыянальнага тыпу яго можна вы­ка­рыс­тоў­ваць у апісаннях параметраў падпраграм. І ясна, што не­аб­ход­на на­пі­саць тыя рэальныя працэдуры і функцыі, якія будуць пе­ра­да­вацца як па­ра­мет­ры. Патрабаванне да іх адно: яны павінны кампілявацца ў рэжыме да­лёкага выкліку (опцыя FAR або {$F+}).

Прыклад. Надрукаваць у 16-й с/зл табліцу складання ці множання.

PROGRAM Tables;

CONST

HD : ARRAY[0..15] OF Char = '0123456789ABCDEF';

TYPE

TFunc = FUNCTION(a, b : Integer) : Integer;

TSt2 = STRING[2];

FUNCTION Add(a, b : Integer) : Integer; FAR;

BEGIN

Add := a + b;

END;

FUNCTION Mult(a, b : Integer) : Integer; FAR;

BEGIN

Mult := a * b;

END;

PROCEDURE MakeTable(w, h : Integer; Op : TFunc;

c : Char);

VAR i, j : Integer;

FUNCTION Hext(i : Integer) : TSt2;

VAR H : Char;

BEGIN

H := HD[i DIV 16];

{вылучылі старэйшую лічбу; можна і SHR 4}

IF H = '0' THEN H := ' ';

{каб не друкаваць нявартасны нуль}

Hext := H + HD[i MOD 16]; {або i AND $F}

END; {Hext}

BEGIN

Write(c:2, ' I');

FOR i := 1 TO w - 1 DO Write(HD[i]:4);

Writeln;

FOR i := 1 TO w DO Write('----');

Writeln;

FOR i := 1 TO h - 1 DO {колькасць радкоў}

BEGIN

Write(HD[I]:2, ' I');

FOR j := 1 TO w - 1 DO

Write(Hext(Op(i, j)):4);

Writeln;

END;

END; {MakeTable}

BEGIN

MakeTable(16, 16, Add, '+');

Writeln;

MakeTable(16, 16, Mult, '*');

END.