Otevřít hlavní menu

Změny

Procedura

Přidáno 5 645 bajtů, 22. 9. 2012, 22:40
procedura, funkcia, globalne premenné, lokálne premenné
'''Procedúry a funkcie'''

==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:

:{| class="wikitable" style="text-align: left; color: black;"
|'''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==

:{| class="wikitable" style="text-align: left; color: black;"
| ||'''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
|Môžu spôsobiť kolízie ak majú rovnaký názov ako globálna premenná
|-
| || Zaberajú miesto v pamäti len počas behu procedúry ||
|-
|}

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é.