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

Параметр-жиындар және параметр-жолдар

Жалпы қарағанда айнымалыларды формальды параметрлер тізімінде жариялаудың бейнелеу бөлімінде жариялаудан айырмашылығы жоқ сияқты. Екі тәсілдің де ұқсастықтары көп болғанымен, бір үлкен айырмашылығы бар: формальды параметрлер тізімінде тек стандартты немесе алдын-ала жарияланған типті көрсетуге болады. Сондықтан келесідей процедураны жариялау мүмкін емес:

Procedure S (a: array [1..10] of real);

Себебі бұл процедурада формальды параметрлер тізімінде жиын индекстерінің диапазонын білдіретін тип жарияланады. Егер жиынның тек бір элемнтін процедураға жіберу керек болса, ол үлкен қиындық туғызбайды. Алайда барлық жиын элементтерін жіберу үшін типін алдын-ала жариялау қажет. Мысалы:

type

atype = array [1..10] of real;

Procedure S (a: atype);

. . . . .

Берілген жол өз бетімен жиын саналғандықтан, оны процедураға жіберу көрсетілген тәсілмен іске асады:

type

intype = string [15];

outype = string [30];

Function St (s: intype): outype;

. . . . .

Кез келген жиын немесе жолдық қатар типін процедура алдында жариялау аса маңызды емес болып саналады. Қарапайым бағдарламаларды құру кезінде қолданылатын барлық мәліметтердің құрылымы белгілі, сондықтан жиындарды жариялау қиындық туғызбайды. Дегенмен, күрделі универсальды бағдарламаларды құру үлкен қиындықтарға әкеліп соғады.

Ашық жиын дегеніміз жиын элементтерінің типін жариялап, жиын мөлшерін мен шекараларын белгілемейтін процедураның формальды параметрі:

Procedure MyProc(OpenArray: array of Integer);

Процедура ішінде мұндай параметрлер нөлдік төменгі шекаралы бір өлшемді массив ретінде сипатталады. Ашық жиынның жоғарғы шекарасы HIGH функциясын қайтарады. Процедура 0 санын минимальды индекс ретінде, ал HIGH функциясымен анықталатын санды максимальды индекс ретінде қабылдай отырып кез келген көлемді бір өлшемді жиындар құра алады:

Келесі бағдарлама ArrayPrint процедурасы көмегімен екі бірөлшемді жиындар элементтерінің мәндерін экранға шығарады.

Procedure ArrayPrint(aArray: array of Integer);

var

k: Integer;

begin

for k := 0 to High(aArray) do

Write(aArray[k]:8);

WriteLn

end;

const

A: array [-1..2] of Integer = (0,1,2,3);

В: array [5..7] of Integer = (4,5,6);

begin

ArrayPrint(A);

ArrayPrint(В)

end.

Бұл мысалда көрсетілгендей, ArrayPrint процедурасына параметр ретінде жіберілетін жиынның А және В шекараларының мәндері жоқ.

Процедуралық типтер және типтелмеген параметр-айнымалылар

Параметр-функциялар және параметр-процедуралар.

Процедуралық типтер - Borland фирмасының жаңадан енгізген ұғымы (стандартты Паскальда бұл типтер кездеспейді). Типтердің негізге атқаратын қызметі – бағдарламалаушыға процедуралар мен функцияларды жіберудің жаңа жолын ұсыну.

Процедуралық типті жариялау үшін процедура тақырыбы қолданылады, мысалы:

type

Proc1 = Procedure (a, b, c: real; var d: real);

Proc2 = Procedure (var a, b);

РrосЗ = Procedure;

Func1 = Function: String;

Func2 = Function (var s: String): real;

Жоғарыдағы мысалдарда көрсетілгендей процедуралық типтердің ек түрі бар: процедуралық тип және функциялық тип.

Келесі мысал процедураларды фактіленген шақыру параметрлері ретінде жіберудің механизмін көрсетеді. Бағдарлама экранға екі функцияның кестесін шығарады: sin1(x) = (sin(x)+1)*ехр(-х) и cos1(x) = (cos(x)+1)*ехр(-х). Функция мәндерін есептеу және экранға шығару PRINTFUNC процедурасында іске асады.

Uses CRT;

type

Func = Function (x: real): real;

{----------}

Procedure PrintFunc(XPos: byte; F: Func);

const

np = 20

var

x: real;

i: integer;

begin {PrintFunc}

for i := 1 to np do

begin

x := i * (2 * pi / np);

GotoXY (XPos, WhereY);

WriteLn (x:5:3, F(x):18:5)

end

end {PrintFunc}

{----------}

Function Sin1(x: real): real; far;

begin

sin1 := (sin(x) + 1) * exp(-x)

end;

{----------}

Function Cos1(x: real): real; far;

begin

cos1 := (cos(x) + 1) * exp(-x)

end;

{----------}

begin {негізгі бағдарлама}

ClrScr; {экранды тазарту}

PrintFunc (1, sin1);

GotoXY (1,1);

PrintFunc (40, cos1)

end.

Турбо Паскальдың стандартты процедуралары берілген иәсілмен жіберіле алмайды. Бағдарламада процедуралық типті айнымалалар жариялануы мүмкін, мысалы:

var

pi: Proc1;

f1, f2: Func2;

ар: array [1..N] of Proc1;

Процедуралық типтегі айнымалалар мән ретінде сәйкес процедуралар атауларын меншіктей алады. Мұндай меншіктеуден кейін айнымалы атаы процедура атауының синонимына айналады, мысалы:

type

Proc = Procedure (n: word; var a: byte);

var

ProcVar: Proc;

x, у: byte;

Procedure Proc1(x: word; var y: byte); far;

begin

if x > 255 then

y := x mod 255

else

у := byte(x)

end;

begin

ProcVar := Proc1;

for x := 150 to 180 do

begin

ProcVar (x + 100, у);

Write (у:8)

End;

end.

Әрине мұндай меншіктеулерді функциялық типтер де іске асыра

алады:

type

FuncType = Function (i: integer): integer;

var

VarFunc: FuncType;

i: integer;

Function MyFunc (count: integer): integer; far;

begin

. . . . .

end; {MyFunc}

begin {Негізгі бағдарлама}

. . . . .

i := MyFunc(1);

. . . . .

VarFunc := MyFunc;

end.

Келесі функцияны меншіктеу (VarFunc := MyFunc(1) қате болып саналады, себебі сол жақтағы және оң жақтағы типтер сәйкес келмейді: сол жақта – процедуралық тип, оң жақта – integer. Турбо Паскальда параметрлерімен берілген функция процедураны шақыруға әкеледі, ал параметрсіз берілсе процедура атауы ретінде анықталады.

Стандартты Паскаль тіліне қарағанда Турбо Паскальда жіберілетін процедураға кез келген типтегі параметрлерді меншіктеуге болады: параметр-айнымалылар, параметр-мәндер, параметр-константалар.

Типтелмеген параметр-айнымалылар.

Borland фирмасының тағы бір пайдалы жаңалығы – типтелмеген параметрлерді қолдану мүмкіндігі. Процедура тақырыбында формальды параметр-айнымалының типі көрсетілмесе, ол типтелмеген параметр болып саналады. Алайда, оған сәйкес фактілік параметр кез келген типте болуы мүмкін. Типтелмеген параметр ретінде тек параметр-айнымалы болаы алады.

Әдетте типтелмеген параметрлер мәліметтер типі маңызды емес жағдайларда қолданылады. Мұндай параметрлер көпшілік жағдайда әр түрлі жады облыстарын бір жерден екінші жерге көшіру кезінде іске асырылады. Мысалы, BLOCKREAD, BLOCKWRITE, MOVE стандартты процедуралары.

Типтелмеген параметрлерді процедураға өзгеріліп тұратын көлемді бірөлшемді жиындарды жіберу үшін қолдануға болады.

Келесі мысалда NORMA функциясы ұзындығы тұрақсыз вектор деңгейін есептеп шығарады. Стандартная MAXINT константасы INTEGER типінің максимальды мәніне, яғни 32767 тең.

const

NN = 100; {Вектордың максималды ұзындығы}

var

а: array [1..NN] of real;

i, j, N: integer;

{----------}

Function Norma (var x; N: integer): real;

var

a: array [1..2*MaxInt div SizeOf(real)] of real absolute x;

i: integer;

s: real;

begin {Norma}

s := 0;

for i := 1 to N do

s := s + sqr(a[i]);

Norma := sqrt(s)

end {Norma};

{----------}

begin {main}

for i := 1 to 10 do

begin

N := Random(NN) + 1;

for j := 1 to N do

a[j] := Random;

WriteLn ('N = ', N:2, ' норма -', Norma(a, N):10:7)

End;

end {main}.

Мысалда көрсетілгендей, бірөлшемді жиындарды жіберу үлкен қиындық туғызбайды. Көп өлшемді жиындарды жіберу әрине оңай емес, дегенмен берілген тәсілді қолдану басқа ұқсас әдістерге қарағанда біршама жеңіл әрі қарапайым.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]