Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AEP_LEKTsII.doc
Скачиваний:
90
Добавлен:
28.03.2015
Размер:
1.27 Mб
Скачать

12 Лекция

12.1 Пайдаланушының ішкі программалары (процедуралар) классификациясы. Ішкі программаларды рәсімдеу тәсілдері және оларды программа құрамында пайдалану.

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

Паскальда ішкі программалардың екі түрі: процедуралар және функциялар бар. Олардың арасындағы негізгі айырмашылық – функция мәнді қайтарады және өрнектің ішінде пайдаланылуы мүмкін, мысалы: X:= Sin(A); ал процедура бір немесе бірнеше есептерді орындау үшін шақырылады: Writeln('Бұл тексеру'); Функциялардың форматы процедураның форматына ұқсас айырмашылығы олар function тақырыбынан басталады және функцияның қайтаратын мәні үшін деректер типімен аяқталады: function функция_аты (параметрлер) : деерктер типі; Кәдімгі программаның құрылымынан тек екі айырмашылық бар: процедуралар және функциялар program емес procedure немесе function тақырыптарынан басталады, және нүктемен емес нүктелі үтірмен аяқталады. Процедуралар және фукнциялар өздерінің жеке тұрақтыларына, деректер типтеріне, айнымалылар мен жеке өздерінің процедуралары мен функцияларына ие болуы мүмкін. Бырақ, барлық бұл элементтер тек олар анықталған процедуралар мен функциялардың ішінде ғана пайдаланылуы мүмкін.

Процедуралар мен функциялардың параметрлері. Ішкі программаны сипаттау барысында көрсетілетін параметрлер формальды деп аталады. Ішкі программаны шақыру барысында көрсетілетін параметрлер фактілі деп аталады.

Егер формальды параметр var қызметші сөзімен сипатталған болса, онда оны параметр-айнымалы деп атайды да ол сілтеме бойынша жіберіледі деп айтады. Егер параметр var қызметші сөзін пайдаланбай сипатталған болса, онда оны параметр-мән деп атайды да ол мәні бойынша жіберіледі деп айтады

Егер параметр мәні бойынша жіберілетін болса, онда ішкі программаны шақыру барысында фактілі параметрлердің мәндері сәйкесінше формальды параметрлерге меншіктеледі. Мысалы, процедураның келесідей сипатталуы бар болсын:

procedure PrintSquare(i: integer);

begin

writeln(i*i);

end;

Онда PrintSquare(5*a-b) шақырылғанда 5*a-b мәні есептеліп і айнымалыға меншіктеледі, одан кейін процедураның тұлғасы орындалады.

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

procedure Mult(var a: integer);

begin

a:=a*2;

end;

онда Mult(d) шақырылған кейін d-нің мәні екі есе өседі.

Фактілі параметр-мән ретінде типі формальды параметрдің типімен сәйкес болатын немесе айқын емес түрде соған келтірілетін кез келген өрнек болуы мүмкін. Фактілі параметр-айнымалы ретінде типі формальды параметрдің типімен дәл сәйкес келетін айнымалыны ғана көрсетуге болады.

Параметрді сілтеу бойынша ішкі программаға жіберу барысында фактілі параметрдің адресі жіберіледі. Сондықтан, егер параметр жадыдан көп орын алатын болса (массив, жазба), онда әдетте ол да сілтеу бойынша жіберіледі. Нәтижесінде процедурураға параметрдің өзі емес оның адресі жіберіледі, бұл жадыны және жұмыс жасау уақытын үнемдейді. мысалы:

procedure Print(var a: array [1..10] of integer; n: integer);

var i: integer;

begin

for i:=1 to n do

write(a[i],' ');

writeln;

end;

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

procedure PrintSquare1(i: integer);

begin

i:=i*i; // дұрыс

writeln(i);

end;

procedure PrintSquare2(const i: integer);

begin

i:=i*i; // қате!!!

writeln(i);

end;

Pascal ABC-те тұрақты параметр мәні бойынша жіберіледі (Delphi-де – сілтеу бойынша).

Программаны компиляциялап іске қосқанда программаның тұлғасында бірінші болып GetData(А,В) операторы орындалады. Оператордың бұл түрі процедураны шақыру деп аталады. Бұл шақыруды өндеу барысында программа Х пен Y (формальды параметрлерді) А мен В (фактілі параметрлерге) алмастырып GetData ішіндегі операторларды орындайды. GetData процедурасын шақыру операторындағы Х пен Y –тің алдындағы var кілттік сөзі фактілі параметрлер айнымалы болуы тиіс және айнымалылардың мәндері өзгеріліп және қайтадан шақырушы программаға жіберілуі мүмкін екендігін білдіреді. Сондықтан GetData процедурасына литералдарды, тұрақтыларды, өрнектерді және с.с. жіберуге болмайды. GetData орындалуы аяқталғаннан кейін басқару программаның негізгі тұлғасындағы GetData-ны шақырушыдан кейінгі операторға беріледі. Ол келесі оператор GetRatio функциясын шақыру болып табылады.

Мұндағы кейбір маңызды ерекшеліктерді атап кетейік. Біріншіден, GetRatio мән қайтарады, ол мән кейін бір жерде пайдаланылуы тиіс; бұл жағдайда ол мән Ratio-ға меншіктеледі. Екіншіден, функцияның негізгі тұлғасында мән GetRatio-ға меншіктеледі. Сонымен, функция қандай мәнді қайтару керек екендігін анықтайды. Үшіншіден, бұл жерде I және J формальды параметрлердің алдында var кілттік сөзі жоқ. Ол фактілі параметрлер кез келген бүтінсанды өрнек бола алатындығын білдіреді, мысалы, Ratio:=GetRatio(А+В,300), және тіпті егер формальды параметрлердің мәндері функцияның тұлғасының ішінде өзгертілсе де жаңа мәндер қайтадан шақырушы программаға жіберілмейді. Бұл процедуралар мен функциялардың арасындағы айырмашылық болып табылмайды; параметрлердің екі типін де ішкі программалардың кез келген түрінде пайдалануға болады. Процедураның сипатталуы идентификаторды процедуралық блокпен байланыстыруға мүмкіндік береді. Процедураны одан кейін процедураның операторы арқылы белсендіруге болады. Процедураны іске қосу оның ішінде процедураның аталуы және қажетті параметрлер қамтылған процедураның операторы арқылы жүзеге асырылады. Процедура іске қосылған кезде орындалуы тиіс операторлар процедура модулінің операторлық бөлімінде қамтылған. Егер процедурада қамтылған операторда процедура модулінің ішінде процедураның идентификаторы пайдаланылатын болса, онда процедура рекурсиялы түрде орындалады (орындалу барысында өзіне өзі сілтейді). Процедураны сипаттау мысалы:

program DoRatio;

var

A,B : integer;

Ratio : real;

procedure GetData(var X,Y : integer);

begin

Write('Екі сан енгізіңіз: ');

Readln(X,Y)

end;

function GetRatio(I,J : integer) : real;

begin

GetRatio := I/J

end;

begin

GetData(A,B);

Ratio := GetRatio(A,B);

Writeln('Қатынас тең',Ratio)

end.

procedure NumString(N: integer; var S: string);

var

V: integer; begin

V := Abs(N); S := '';

repeat

S := Chr(N mod 10 + Ord('0')) + S; N := N div 10;

until N = 0;

if N < 0 then S := '-' + S;

end;

Процедураның сипатталуында операторлар блогының алдында үзіліс жасау (interrupt) директивасы көрсетілуі мүмкін. Бұл жағдайда процедура үзіліс жасау процедурасы ретінде қарастырылады. Процедура немесе функцияның сипатталуында операторлар блогының орнына алға кететін сипаттау (forward), сыртқы сипаттау (external) немесе ішкі сипаттауды (inline) жазуға болады.

Функцияның сипатталуы оның ішінде мән есептеліп және қайтарылатын программаның бөлімін анықтайды. Функцияның тақырыбында функцияның идентификаторы, формальды параметрлер (бар болса) және функция нәтижесінің типі анықталады.

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

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

function Max(a: Vector; n: integer): extended;

var

x: extended;

i: integer;

begin

x := a(1);

for i := 2 to n do if x < a[i] then x := a[i];

Max := x; end;

function Power(x: extended; y: integer): extended;

var

z: extended;

i: integer;

begin

z := 1.0; i := y;

while i > 0 do

begin

if Odd(i) then z := z*x;

x := Sqr(x);

end;

Power := z;

end;

Процедура немесе функцияны сипаттауда формальды параметрлер тізімі беріледі. Формальды параметрлер тізімінде сипатталған әр параметр сипатталатын процедура немесе функцияға қатысты локальды болып табылады да берілген процедура немесе функциямен байланысты модульдің ішінде оған оның идентификаторы бойынша сілтеуге болады.

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

Локальды және глобальды айнымалылар. Ішкі программаның сипаттау бөлімінде сипатталған айнымалылар оның локальды айнымалылары деп аталады. Ішкі программадан тыс сипатталған айнымалылар оған қатысты глобальды айнымалылар деп аталады.

Ішкі программаның параметрлері оның локальды айнымалылары болып саналады. Егер локальды айнымалының аталуы глобальды айнымалының аталуымен сәйкес болса, онда локальды айнымалы глобальды айнымалыны жасырады, сондықтан ішкі программаның ішінен глобальды айнымалыға сілтеуге болмайды. Мысалы:

var i: real;

procedure p;

var i: integer;

begin

// глобальды i айнымалыға процедураның ішінде сілтеуге мүмкін емес

i:=5; // локальды i айнымалыға меншіктеу; ...

end;

Процедуралар, функциялар, сыртқы библиотекалар.

Программа Р30, символдар жолы арқылы экранды екі бөлімге бөліп 1, 2,..., 10 сандар үшін квадрат түбірлері кестесін және 1, 2,..., 5 сандар үшін натурал логарифмдерінің кестесін құрады. Символдар жолын экранға шығару line процедурасы ретінде ұйымдастырылған. Процедурадан программаға ешқандай ақпаратты жіберу қажет болмағандықтан процедураның аргументтері (символдардың түрі және саны) мән-параметрлер ретінде сипатталған. Бұл программада процедура бес рет орындалады.

Программа Р31, берілген төрт натуральных а, b, с, d сандар үшін сандардың бірінші және екінші паралардың ең үлкен ортақ бөлгіштерін (ЕҮОБ) экранға шығарып оларды мәні бойынша салыстырады. Программада nod(x,y) рекурсиялы функция анықталған, ол келесі ережені жүзеге асырады:

21 және 15 санларға nod(x,y) –ті ретімен қолданып, табамыз:

nod(21,15) = nod(6,15) = nod(15,6) = nod(3,6) = nod(6,3) = nod(0,3) = nod(3,0) = 3.

Сыртқы библиотекалар. Ішкі программалар (процедуралар мен функциялар) программаларда оларды құрылымдау мақсатында, сонымен қатар, программаның кейбір бөліктерін бірнеше рет қайталау барысында пайдаланылады. Процедуралар мен функциялар программалық бірліктердің ішкі программаларды сипаттау бөлімінде сипатталады. Олар бұл программалық бірліктер үшін ішкі болып табылады. Бірдей бір ішкі программалар түрлі программаларда пайдаланылған жағдайлар кездеседі. Мұндай жағдайларда оларды қажетті моментте кез келген программаларға қосуға болатын сыртқы ішкі-программаларды құрған дұрыс. Әдетте, сыртқы ішкі-программаларды жеке пакеттерге біріктіреді, оларды сыртқы ішкі-программалардың библиотекалары деп атайды. Кірістірілген библиотекалар компиляциялау барысында кез келген программаға автоматты түрде қосылады.

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

Келесі мысалда екі процедурадан және бір функциядан тұратын сыртқы библиотека құрылады. Бірінші процедура privet экранды тазартады, сәлемдемені шығарады, одан кейін бос орын клавишасы басылғаннан кейін қайтадан экранды тазартады. Екінші stepen процедурасы а санды b санға дәрежелейді. Үшінші ішкі-программа-функция mexp Тейлор қатарының негізінде жуық шамамен экспонента мәнін есептейді.

procedure PRIVET;

var a:char;

begin

clrscr; gotoxy(20,10);

write('Сәлеметсіз бе, сау болыңыз !'};

repeat {цикл экранды алмастыруға }

gotoxy(35,50);write('пробел');{мүмкіндік береді }

read(kbd,a); {бос орынды басу бойынша }

until а=' ';

clrscr;

end;

procedure STEPEN(a,b:real;var y:real);

begin

y:=exp(b*ln(a));

end;

function MEXP(x:real):real;

begin

mexp:=l+x+x*x/2+x*x*x/6+x*x*x*x/24;

end;

Осы үш ішкі-программалар lab.pas атаулы файлға жазылған болсын. Р32 программасы құрылған сыртқы библиотеканы пайдалану мысалын көрсетеді:

program Р32;

{$i lab} {библиотеканы қосу директивасы}

var a,b: real;

begin

PRIVET;

STEPEN(2,4,a);writeln('2 –нің 4 дәрежесі »',a);

b:=MEXP(l);

write('машинаның есептегені exp(1)=',EXP(1):6:4,'менің есептегенім ехр(1)=',b:6:4);

end.

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

Модуль құрамына келесі бөлімдер кіреді:

  • тақырып (unit <модуль аталуы> түрінде) модульге сілтеу үшін керек. Модульді қамтитын файл аталуы модуль аталуымен бірдей болуы тиіс;

  • интерфейс, ол interfase сөзінен басталады да тақырыптар тізімі арқылы бейнеленген және оларға негізгі программа тұлғасынан қол жеткізуге болатын процедуралар мен функцияларды қоса жариялауларды қамтиды;

  • жүзеге асыру, ол implementation сөзінен басталады да модульдің интерфейстік бөлімінде санақтап шығарылған процедуралар мен функциялардың тұлғаларын қамтиды;

  • инициализация, ол бос болып тек end–ты қамтуы мүмкін немесе модульді инициализациялау бойынша қажетті амалдарды орындайтын (мысалы, айнымалыларға бастапқы мәндерді меншіктейтін) операторларды қамтуы мүмкін.

Сонымен, модуль – ол тұрақтылар, деректер типтері, процедуралар мен функциялар жиынтығы. Әр модуль жеке компиляцияланады; компиляциялау нәтижесі – кеңейтпесі tpu (Turbo Pascal Unit) файл. Модульдің әр элементін қосымша жариялаусыз тұтынушының программасында пайдалануға болады, ол үшін тақырыптан кейін программаның басында пайдаланылатын модуль аталуын Uses директивасында жазған жеткілікті. Стандартты Crt, Graph және басқа модульдерді пайдаланады. Бұл модульдерде дисплей экранымен, клавиатурамен, графикалық примитивтермен және с.с. жұмыс жасауға арналған сервистік процедуралар және функциялар қамтылған.

Кешенді сандарға арифметикалық амалдарды қолданумен Паскальдің математикалық мүмкіндіктерін толықтыратын модульді құру мысалын қарастырайық. Кешенді сандарды нақты сандарды (а,b) жұптары арқылы бейнелейміз. Оларға амалдар келесі ережелерге сәйкес қолданылады:

(a,b) + (c,d) = (a+c,b+d),

(a,b)-(c,d) = (a-c,b-d),

(а,b) * (c,d) = (a*c-b*d , a*d+b*c),

(a,b) / (c,d) = ((a*c+b*d)/(c*c+d*d), (b*c-a*d)/(c*c+d*d)).

Құрылатын модуль төрт процедураны қамтиды: Sum - қосынды, Raz - айырым, Proiz – көбейтінді, Chastn – бөлінді. Бұл модуль жеке компиляциялануы мүмкін. Одан кейін кез келген программа Uses CompChisla директива арқылы осы модульдің интерфейстік объекттеріне (бұл жағдайда – процедураларына) қол жеткізе алады. Модульдің интерфейстік бөлімінде процедуралардың тек тақырыптары көрсетіледі, ал «жүзеге асыру» бөлімінде процедуралардың тақырыптарынан тек атаулары қалады.

unit CompChisla;

interface

procedure Sum(a,b,с,d: real; var x,y: real);

procedure Raz(a,b,c,d: real; var x,y; real);

procedure Proiz(a,b,c, d: real; var x,y: real);

procedure Chstn(a,b,c,d; real; var x,y: real);

implementation

procedure Sum;begin x:=-a+c; y:=b+d end;

procedure Raz;begin x:=a-c; y:=b-d end;

procedure Proiz;begin x:=a*c-b*d; y:=a*d+b*c end;

procedure Chastn;

var z:real;

begin z:= c*c+d*d; x: = (a*c-)-b*d) /z; y;= (b*c-a*d) /z

end;

end.

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