Бейстандартты процедуралар мен функциялар


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

Ішкі программаның құрылымы негізгі программаның құрылымына ұқсас болып, оның тақырыбынан және денесінен тұрады, бірақ ішкі программаның денесінде модульдерді пайдалану бөлімі қолданылмайды. Сонымен қатар, ішкі программалардың тақырыптары басқаша жазылады.

Ішкі программамен жұмыс атқаруда негізгі екі кезеңді ажыратады:

  • Ішкі программаның анықталуы;
  • Ішкі программаның шақырылуы.

Кез келген ішкі программа алдын ала анықталады, тек сонан кейін ғана оны шақыруға болады. Ішкі программаны анықтау кезінде оның аты, формальді параметрлер тізімі (егер параметрлері болса) және орындалатын әрекеттер дің тізбегі көрсетіледі.

Процедура мен функцияның айырмашылығы келесіде: функция шақырылғанда оның аты арқылы тек қана бір мән қатарылады, сондықтан оны өрнектің операнды ретінде қолдануға болады. Ал процедураның қайтаратын мәндерінің саны шектелмейді.

Процедуралар мен функциялар параметрлі және параметрсіз деп екі топқа бөлінеді.

6.1 Процедура мен функцияны анықтау

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

Параметрсіз процедураның сипатталуы:

Procedure < процедураның аты>;

< белгілерді анықтау>;

< тұрақтыларды сипаттау>;

< түрлерді сипаттау >;

< айнымалыларды сипаттау >;

<қатарластырылған процедуралар мен функцияларды анықтау>;

Begin

  < орындалатын операторлар тізбегі>;

End;

Параметрлі процедураның сипатталуы

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

Procedure < процедураның аты > (Var G1: T1; G2: T2;...);

Мұндағы Gi-формальды параметрлер аты; Тi – формальды параметрлер түрі.

Бірінің артынан бірі орналасқан бір түрдегі параметрлерді арасын үтірмен ажыратып, ішкі тізімге біріктіруге болады.

Ішкі программаны шақырғанда (пайдаланғанда) оның атын және формальді параметрлер орнына нақты аргументтерінің тізімін көрсету қажет.

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

Параметрсіз функцияның анықталуы:

Function < функцияның аты> : функцияның түрі;

< белгілерді анықтау>;

< тұрақтыларды сипаттау>;

< түрлерді сипаттау >;

< айнымалыларды анықтау>;

<қатарластырылған процедураны және функцияны анықтау >;

Begin

< орындалатын операторлар тізбегі>;

< функцияның аты> := <өрнек>;

                                // міндетті түрде көрсетілу керек

End;

Параметрлі функцияның анықталуы параметрсіз функцияның анықталуымен бірдей, тек функцияның тақырыбы басқаша келтіріледі:

Function <функцияның аты> (Var G1: T1; G2: T2;...) : <функцияның түрі>;

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

Ішкі программаның денесінде (тақырыбында емес) анықталған түрлер, айнымалылар, тұрақтылар, белгілер “жергілікті” деп аталады және олар тек қана ішкі программа шақырылғанда ғана “өмір сүреді”, яғни негізгі программадан оларға қол жеткізуге болмайды.

Ішкі программалардың тақырыбы және денесі міндетті түрде болу керек, ал басқа бөлімдері болмауы да мүмкін.

Ішкі программалардың тақырыбынан соң кейбір стандартты нұсқаулар орналасуы мүмкін: Assembler, External, Far, Forward, Inline, Interrupt, Near. Бұл нұсқаулар ішкі программалар туралы компиляторға қосымша мәлімет беріп отырады (берілгендеді алмастыру әдісін, программалау тілі туралы мәлімет және т.с.с.).

Ішкі программаның тақырыбынан соң тұрған нұсқау тек қана осы процедура мен функцияға қатысты деп саналады. Осы нұсқауларға қысқаша түсініктеме беріп кетейік:

  • Assembler – компиляциялу орындалғанда Ассемблер тілінде жазылған ішкі программаны Delphi құрамындағы Ассемблер компиляторы автоматты түрде машина тіліне аударады;
  • Externalсыртқы процедураны немесе функцияны жариялайды;
  • Far қашықтағы шақыру моделді (ішкі программа және оны шақыру нүктесі жадтың әртүрлі сегменттерінде орналасқан) ішкі программаны құрастырады;
  • Forward ішкі программаның денесі алда келтірілгені туралы компилятроға жариялайды;
  • Inline – ішкі программаның денесі машиналық нұсқаулардан құрылғанын көрсетеді;
  • Interrupt үзілісті өңдейтін процедураларда қолданылады;
  • Near – жақындағы шақыру модельді (ішкі программа және оны шақыру нүктесі жадтың бір сегментінде орналасқан) ішкі программаны құрастырады.

6.2 Процедура мен функцияны шақыру операторлары 

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

  1. Төменгі программа бойынша берілген екі бүтін санның үлкені Max_2 (x,y:integer):integer және кішісі Min_2 (x,y:integer):integer екі бөлек функциялар арқылы табылады.

6.3 Параметрді мән, айнымалы немесе тұрақты түрінде анықтау

Формальды параметрлерінің кез келгені параметр-мән, параметр-айнымалы немесе параметр-тұрақты ретінде қолданылуы мүмкін. Алдыңғы мысалда х және у параметрлері мәндер түрінде анықталған. Егер параметр  айнымалы немесе тұрақты түрінде анықталса, онда ішкі программаның тақырыбында var  немесе const  түйінді сөздерді көрсетеді. Мысалы,

Procedure MyProc(var А: real; B: integer; const C: Char);  мұнда А параметр-айнымалы, B параметр – айнымалы, С параметр-тұрақты.

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

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

Function Power (var a,b : real):real;, онда функцияның s:= Power(x, -y); шақырылуында компилятор формальды және нақты параметрлерінің сәйкес келмеуі туралы хабар шығарады, себебі (- у) - өрнек, ал оған сәйкестелген формальды параметр айнымалы түрінде анықталған.

Жалпы негізгі программаға мәндері қайтарылатын параметрлерді айнымалы түрінде анықтау қажет.

6.4 Процедуралық түрлер

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

Type

Proc1= procedure (x,y,r:Double);

Proc2= procedure (var a,b:Integer);

Func1= function():Boolean;

Процедуралық түрлерді қолдануды қарастырайық. Мысалы, нәтижесін = (x+y)+(x*y) берілген формула бойынша есептеу керек. Мұнда х және у мәндері 1 мен 3 аралығындағы бүтін сандар.

6.5 Рекурсиялық ішкі программалар

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

Мысалы, факториал мәнін есептеу программасын келтірейік.

Function Fact(n:integer):integer;

Begin

If n<=0 then Fact:=1 

 else Fact:=n*Fact(n-1);

 end;

Fact (n) функциясы n мәнін қабылдап, оның факториалын есептейді. Егер n мәні нөлден кіші немесе оған тең болса, онда функцияның мәні 1-ге тең, керісінше n мәні 1-ге азаяды және функция өзін өзі шақырады. Осындай рекурсиялық шақыру n мәні 1-ге тең болғанға дейін орындалып отырады.

Fact (n) функциясы және оның параметрі Integer түрінде анықталған, осындай түрде анықтау Longint түріне сәйкес деп саналады және айтарлықтай үлкен шамалардың факториал мәнін табуға мүмкіндік туғызады (n<=31).

7.4-суретінің оң жағындағы көріністе Memo терезесіне шығып тұрған соңғы жолында 35!=0 деген нәтижені көруге болады. Осындай қателіктерді жібермеу үшін функция аргументінің қабылдай алатын мәндер аралығын кеңейтуге, яғни нақты түрлерді пайдалануға болады, мысалы Real түрін.

6.6 Ішкі  программаларды алдын ала анықтау

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

      Procedure A (i:byte);

          Begin

         …………..

         B(i):

          …………..

           End;

      Procedure B (j:byte);

Begin

………

A (j);

……..

End;

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

 Procedure B (j:byte);    Forward; 

 Procedure A (i:byte);

         Begin

         …………..

         B(i):

          …………..

           End;

      Procedure B ;

Begin

………

A (j);

……..

End;

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