Otevřít hlavní menu

Procedura

Verze z 19. 10. 2012, 16:16, kterou vytvořil Zdeno Sekerák (diskuse | příspěvky) (1 revízia)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)

Procedúry a funkcie


Obsah

Vysvetlenie procedúry

Pri písaní programu sa často stáva, že niektoré príkazy, lepšie povedané sústava príkazov sa opakuje. Aby sme sa tomu vyhli, sprehľadnili program a hlavne uľahčili si prácu môžeme takéto príkazy zlúčiť do jedného a dať mu nové meno. Programátor tým vlastne vytvorí nový príkaz. Toto nám poskutujú procedúry (funkcie). Procedúra je vlastne taký malý program v programe. Takže až na malé zmeny má tú istú štruktúru.

Štruktúra:

PROCEDURE meno_procedúry(definícia vstupných premenných);
   CONST definovanie_konštánt_procedúry;
   TYPE definovanie_nových_typov_premenných;
   VAR definovanie_lokálnych_premenných_pre_procedúru;
BEGIN     { begin - začiatok procedúry }
   príkaz;
   ..
END;     { end - koniec procedúry }

V definícii vstupných premenných napíšem s akými typmi premenných môžeme volať procedúru. Ako príklad nám poslúži procedúra ktorá zlúči príkazy GotoXY a Write nazvime je WriteXY. Vstupné parametre budú súradnice X,Y a text aký sa ma na tieto súradnice vypísať. Preto napíšem:

procedure WriteXY(x,y:integer;s:string);

Ostatné je intuitívne jasné, preto prejdeme hneď k príkladu a napíšeme si program, ktorý bude nahradzovať sústavu príkazov GotoXY a Write jediným WriteXY.

Program Sucet:
   Uses Crt,Dos;
   Var X,Y,Z:Integer;

Procedure WriteXY(X,Y:Integer; S:String);
   Var SucXY:Integer;
Begin
   SucXY:=X+Y;
   GotoXY(X,Y);
   Write(S);
End;

Begin     { hlavne begin programu }
   ClrScr;
   WriteXY(10,4,'Ahoj ja som tvoje PC');
   WriteXY(10,5,'Stlač kláves ak chceš pokracovať');
   Readln;
End.     { hlavne end programu }


Vysvetlenie funkcie

Napísali sme si už jednoduchú procedúru, ale často sa stáva že potrebujeme prenášať údaje medzi procedúrou a programom. Ináč povedané aby nám procedúra vrátila neaké číslo. Môžeme preto definovať funkciu, ktorá má skoro rovnakú štruktúru ako procedúra s jedným rozdielom, že naviac definujeme akú premennú nám bude dávať. V tele funkcie sa názov funkcie správa ako premenná, takže môžeme do nej zapisovať výsledok jednoduchým priradením.

Štruktúra:

FUNCTION meno(definícia vstupných premenných):typ_výstupu;
   CONST definovanie_konštánt_funckie;
   TYPE definovanie_nových_typov_premenných;
   VAR definovanie_lokálnych_premenných_pre_funkciu;

BEGIN     { begin - začiatok funkcie }
   príkaz;
   ..
   meno:=výsledok;
END;     { end - koniec funkcie }

Program Mocnina;
   Uses Crt,Dos;
   Var X,Vys:Integerl;

Function Moc(X:Integer):Integer;
   Var Pom:Integer;
Begin
   Pom:=(X+X)*2;
   Moc:=Pom;
End;

Begin
   ClrScr;
   X:=10;
   Vys:=Moc(X);
End.


Rozdiel medzi lokálnymi a globálnymi premennými.

Ak si podrobne preštudujeme príklad s procedúrami všimneme si, že sú tam premenné X,Y definované dvakrát. Prvýkrát v hlavnej deklaračnej časti programu (hneď za USES) a druhýkrát v premenných, ktoré vstupujú do procedúry. Dôležitou otázkou je akú hodnotu bude mať premenná SucXY. Bude sčítavať X,Y ktoré sú nadefinované hneď za hlavným begin, alebo čísla ktorými volám procedúru. A tu je vlastne rozdiel medzi globálnou a lokálnou premennou, pretože v procedúre platia hodnoty 10,4 pri prvom WriteXY a 10,5 pri druhom. Premenné X=4, Y=8 budú platné pre zbytok programu. Ale Z bude viditeľné aj v procedúre WriteXY. Naopak premenná SucXY sa dá použiť len v nej. Takže ak mám definovanú globálnu premennú potom je viditeľná v celom programe, pokiaľ sa v niektorej časti nenachádza lokálna, ktorá má rovnaké meno.


Napíšme si teraz definície.


Globálna premenná: Je definovaná v hlavnom tele programu a je viditeľná v celom programe aj v procedúrach a funkciách.


Lokálna premenná: Jej definíciu píšem v záhlaví procedúry (funkcie) a je viditeľná len v tomto module. Ak má rovnaký názov ako globálna je viditeľná len lokálna.

Príklad:

Program premenné; X-hodnota X-typ Y-hodnota Y-typ
Uses Crt,Dos;
Var X,Y:integer; globálna globálna
Procedure Moc(X:Integer); lokálna globálna
Begin
  Sucet:=X+X; 2 lokálna 4 globálna
End;
Begin
  X:=3;Y:=4; 3 globálna 4 globálna
  Moc(2);
End.


Výhody a nevýhody lokálnych a globálnych premenných

Výhody Nevýhody
Globálne Sú viditeľné v celom programe Zaberajú miesto v pamäti aj keď už nie sú potrebné
Lokálne Sprehľadňujú program, takže stále vieme
o akú premennú sa jedná a načo ju používame

Zaberajú miesto v pamäti len počas behu procedúry

Môžu spôsobiť kolízie ak majú rovnaký názov
ako globálna premenná

Z tabuľky vyplýva, že pokiaľ programátor chce mať správny a prehľadný program mal by čo najčastejšie používať a definovať lokálne premenné.


Kam ďalej: Obsah | Popis procedúr a funkcií knižnice CRT