Procedura: Porovnání verzí

Z Delphi & Pascal (česká wiki)
Skočit na navigaci Skočit na vyhledávání
m (1 revízia)
 
(Nejsou zobrazeny 2 mezilehlé verze od stejného uživatele.)
Řádek 1: Řádek 1:
 
'''Procedúry a funkcie'''
 
'''Procedúry a funkcie'''
  
==Vysvetlenie procedúry==
+
 
 +
=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==
+
 
 +
=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.==
+
 
 +
=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 97: Řádek 100:
 
|  Var X,Y:integer; ||          || globálna ||          || globálna
 
|  Var X,Y:integer; ||          || globálna ||          || globálna
 
|-
 
|-
|  Procedure Moc(X:Integer);  ||         || lokálna  ||          || globálna
+
|  Procedure Moc(X:Integer);  || || lokálna  ||          || globálna
 
|-
 
|-
 
|  Begin     ||          ||          ||          ||
 
|  Begin     ||          ||          ||          ||
 
|-
 
|-
|   Sucet:=X+X;   || 2 || lokálna  || 4   || globálna
+
|   Sucet:=X+X;|| 2 || lokálna  || 4   || globálna
 
|-
 
|-
 
|  End;     ||          ||          ||          ||  
 
|  End;     ||          ||          ||          ||  
Řádek 107: Řádek 110:
 
|  Begin     ||          ||          ||          ||
 
|  Begin     ||          ||          ||          ||
 
|-
 
|-
|   X:=3;Y:=4;     || 3 || globálna || 4   || globálna
+
|   X:=3;Y:=4; || 3 || globálna || 4   || globálna
 
|-
 
|-
|   Moc(2);     ||           ||          ||          ||
+
|   Moc(2);   ||     ||          ||          ||
 
|-
 
|-
 
|  End.     ||          ||          ||          ||
 
|  End.     ||          ||          ||          ||
 
|}
 
|}
  
==Výhody a nevýhody lokálnych a globálnych premenných==
+
 
 +
=Výhody a nevýhody lokálnych a globálnych premenných=
  
 
:{| class="wikitable"
 
:{| class="wikitable"
!  !! '''Výhody''' !! '''Nevýhody'''
+
!  !! Výhody !! Nevýhody
 
|-
 
|-
 
|'''Globálne '''
 
|'''Globálne '''
|Sú viditeľné v celom programe<br>
+
|Sú viditeľné v celom programe
 
|Zaberajú miesto v pamäti aj keď už nie sú potrebné
 
|Zaberajú miesto v pamäti aj keď už nie sú potrebné
 
|-
 
|-
 
|'''Lokálne'''
 
|'''Lokálne'''
|Sprehľadňujú program, takže stále vieme o akú premennú sa jedná a načo ju používame<br>
+
|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á
| || Zaberajú miesto v pamäti len počas behu procedúry ||
 
|-
 
 
|}
 
|}
  

Aktuální verze z 19. 10. 2012, 16:16

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:

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