Procedúry a funkcie

19.10.2009 23:39

Podprogramy

Podprogramom nazývame pomenovanie nejakého algoritmu alebo nejakej časti programu. Podprogram potom môžme vyvolať pomocou tohto mena viackrát. Pomocou podprogramov môžeme riešiť aj väčší problém jeho rozdelením na podúlohy - hovoríme tomu, že úlohu riešime zhora nadol. V pascale môžu byť podprogramy dvoch typov:

  • procedúry - postupnosť príkazov
  • funkcie - postupnosť príkazov pričom výsledkom je nejaká hodnota

Podprogramy sa najčastejšie používajú vtedy, keď

  • nejaká časť programu sa opakuje na viacerých miestach - my ju zapíšeme len raz a používame viackrát;
  • nejaká časť programu kvôli čitateľnosti alebo logike algoritmu je vytiahnutá do samostatnej časti - podprogramu - čím ju môžeme napr. lepšie odladiť;
  • nejakú časť programu naprogramoval nejaký iný programátor - zabalil to do procedúry - a my to len používame;
  • ak budeme potrebovať nejaký problém riešiť pomocou rekurzie, musíme na to použiť podprogram;
  • metódy pre objekty sú tiež podprogramy, t.j. všetky "základné príkazy" sa definujú pomocou podprogramov (najčastejšie pomocou procedúr)


Deklarácia procedúr

procedure meno;

... // lokálne deklarácie pre procedúru, napr. deklarácie premenných

begin

... // telo procedúry

end;

Je veľmi dôležité správne pochopiť, ako pracuje počítač pri volaní podprogramu (pri vykonávaní programu sa príde na riadok s menom podprogramu):

  1. zapamätá sa návratová adresa (kam sa bude treba vrátiť)
  2. vytvoria sa "lokálne premenné" procedúry (so zatiaľ nedefinovanou hodnotou)
    - neskôr uvidíme, že tu sa vytvoria aj formálne parametre
  1. prenesie sa riadenie programu do tela podprogramu (za príslušný begin)
  2. vykonajú sa všetky príkazy podprogramu (až po koncový end)
  3. zrušia sa lokálne premenné
  4. riadenie sa vráti za miesto v programe, odkiaľ bol podprogram volaný (návratová adresa)

Pre pascal platia tieto pravidlá:

  • identifikátor (premennej, podprogramu, typu, objektu, ...) sa môže v programe používať, až od toho miesta nižšie, kde bol zadeklarovaný
  • štandardné deklarácie (štandardné typy, funkcie, podprogramy) – sú definované ako keby ešte pred samotným programom, hovoríme, že sú v 0. úrovni
  • prekrytie identifikátora s rovnakým menom je zakázané na tej istej úrovni, ale je povolené vo vnorených úrovniach
    • napr. var Real: Integer; - čo je programátorsky veľmi škaredé a robiť to radšej nebudeme
  • dentifikátor je viditeľný len na svojej úrovni a tiež vo všetkých pre neho vnorených úrovniach (kde ale nebol predefinovaný)
  • keď zadefinujeme procedúru ako súčasť napr. TForm1.Button1Click, tak táto je automaticky na vyššej úrovni (je vnorená) ako náš "program" – ona vidí deklarácie vo vnútri TForm1.Button1Click  ale samotný program nevidí dovnútra procedúry

Formálne parametre

Pri volaní podprogramu môžeme do neho poslať aj nejaké hodnoty, aby sme nemuseli rôzne špeciality nastavovať v globálnych premenných: v podprograme zadefinujeme špeciálne lokálne premenné, tzv. formálne parametre, do ktorých sa pred samotným volaním priradia (inicializujú) hodnoty skutočných parametrov.

Ukážeme si jednoduchý príklad (vloží do komponentu Edit určenú textovú hodnotu):

procedure napis(edit:TEdit; text:string);
begin
   edit.text := text;
end;

Na formulár vložíme komponenty Edit a Button. Obsluha buttonu:

procedure TForm1.Button1Click(Sender: TObject);
begin
  napis(Edit1,'blablabla');
end;

Deklarácia funkcií

function meno: dátový_typ_výsledku;

... // lokálne deklarácie pre funkciu, napr. deklarácie premenných

begin

... // telofunkcie

 end;

Funkcii zadáme určité hodnoty a funkcia nám nejakú vráti. Procedúra len niečo vykoná (nevracia nám žiadnu hodnotu).

Ukážeme si príklad funkcie na násobenie (aj keď nám bude asi na nič, lebo je veľmi jednoduchá, ale predsa):

function násobenie(x,y:integer):integer;
begin
  Result := x * y;
end;

Vyvoláme ju napr. stlačením tlačidla Button a výsledok umiestnime do komponentu Edit:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := IntToStr(nasobenie(2,8));
end;

Späť

Vyhľadávanie

(c) 2008 Všetky práva vyhradené.