Procedura: Porovnání verzí
m (1 revízia) |
|||
(Není zobrazeno 5 mezilehlých verzí od 2 dalších uživatelů.) | |||
Řádek 1: | Řádek 1: | ||
'''Procedúry a funkcie''' | '''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. | 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. | ||
Řádek 41: | Řádek 42: | ||
End. { hlavne end programu } | 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. | 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. | ||
Řádek 75: | Řádek 77: | ||
End. | 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. | 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. | ||
Řádek 90: | Řádek 93: | ||
Príklad: | Príklad: | ||
− | :{| class="wikitable | + | :{| class="wikitable" |
− | + | ! Program premenné; !! X-hodnota !! X-typ !! Y-hodnota !! Y-typ | |
|- | |- | ||
− | |Uses Crt,Dos; | + | | Uses Crt,Dos; || || || || |
|- | |- | ||
− | | Var X,Y:integer; | + | | Var X,Y:integer; || || globálna || || globálna |
|- | |- | ||
− | |Procedure Moc(X:Integer); || | + | | Procedure Moc(X:Integer); || || lokálna || || globálna |
|- | |- | ||
− | |Begin | + | | Begin || || || || |
|- | |- | ||
− | | Sucet:=X+X; | + | | Sucet:=X+X;|| 2 || lokálna || 4 || globálna |
|- | |- | ||
− | |End; | + | | End; || || || || |
|- | |- | ||
− | |Begin | + | | Begin || || || || |
|- | |- | ||
− | | X:=3;Y:=4; | + | | X:=3;Y:=4; || 3 || globálna || 4 || globálna |
|- | |- | ||
− | | Moc(2); | + | | Moc(2); || || || || |
|- | |- | ||
− | |End. | + | | End. || || || || |
|} | |} | ||
− | |||
− | :{| class="wikitable | + | =Výhody a nevýhody lokálnych a globálnych premenných= |
− | + | ||
+ | :{| class="wikitable" | ||
+ | ! !! Výhody !! Nevýhody | ||
|- | |- | ||
|'''Globálne ''' | |'''Globálne ''' | ||
Řádek 124: | Řádek 128: | ||
|- | |- | ||
|'''Lokálne''' | |'''Lokálne''' | ||
− | |Sprehľadňujú program, takže stále vieme o akú premennú sa jedná a načo ju používame | + | |Sprehľadňujú program, takže stále vieme <br>o akú premennú sa jedná a načo ju používame<br> |
− | |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 |
− | + | |Môžu spôsobiť kolízie ak majú rovnaký názov <br>ako globálna premenná | |
− | |||
− | |||
|} | |} | ||
Aktuální verze z 19. 10. 2012, 16:16
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