PODPROGRAMY Podprogram je relatívne samostatný čiastočný algoritmus (čiže časť programu, ktorý má vlastnosti malého programu a hlavný program ho môže volať) Spravidla ide o postup, ktorý bude v programe opakovaný viackrát, a to na rôznych miestach príkazovej časti programu Podprogram sa využíva v prípade, ak sa v programe vyskytuje nejaká úplne rovnaká postupnosť príkazov viackrát na rôznych miestach, alebo sa potrebuje zvýšiť prehľadnosť programu, alebo ak sa v programe vyskytuje podobná postupnosť príkazov odlišujúca sa iba niektorými parametrami Podprogram sa využíva aj v prípade, ak je riešenie formulované rekurzívne Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu Pascal deklaruje svoje podprogramy v časti deklarácií v dvoch podobách : hlavička podprogramu podalgoritmus hlavička podprogramu deklaračná časť podalgoritmus Hlavička podprogramu 1 určuje typ podprogramu, to znamená, že hovorí, či je podprogram funkciou alebo procedúrou, 2 dáva programu meno, 3 špecifikuje formálne parametre (určuje ich počet, meno a typ) Existujú dve formy podprogramov, ktoré sa líšia spôsobom použitia: Procedúra, realizuje čiastkový algoritmus, ktorého výsledkom môže byť viac alebo aj žiadna hodnota a môže komunikovať so svojím okolím (volajúcou jednotkou) prostredníctvom vstupných a výstupných parametrov Funkcia, používa sa vtedy, keď potrebujeme zostaviť čiastkový algoritmus, ktorého volaním sa získava funkčná hodnota Po svojom ukončení vracia do volajúceho programu práve jednu výslednú hodnotu, ktorá bola funkciou vypočítaná používa k tomu svoje meno Podprogramy môžu pracovať s objektmi troch druhov : s globálnymi premennými Sú to premenné, ktoré sú deklarované v hlavnom programe a sú viditeľné v celom programe aj vo všetkých procedúrach a funkciách s lokálnymi premennými Lokálne premenné sú také, ktoré sú deklarované vo vnútri podprogramu v deklaračnej časti a ich platnosť je obmedzená iba na príkazovú časť podprogramu, čiže je viditeľná len v tomto module Lokálna premenná v príkazovej časti podprogramu ruší všetky premenné a formálne parametre rovnakého mena deklarované v hlavnom programe s formálnymi parametrami Formálne parametre zastupujú v podprograme triedu objektov, pre ktorý je postup zostavený V príkazovej časti podprogramu predstavujú objekty, s ktorými príkazy operujú
Mechanizmus volania : Súčasťou volania podprogramu sú skutočné parametre Pri volaní sa zadané skutočné parametre dosadia za zodpovedajúce formálne parametre Postup popísaný na formálnych parametroch sa tak aplikuje na objektoch určených pri volaní ako skutočné parametre Pre jednotlivé volania podprogramu môžeme dosadzovať skutočné parametre a tým je postup aplikovaný na rôzne objekty programu Deklarácia funkcie: function MENO( zoznam formálnych parametrov) : typ_výstupu; var const procedure deklarácia lokálnych objektov function type príkaz; telo funkcie MENO:= výsledok; Telo funkcie musí obsahovať aspoň jeden priraďovací príkaz s menom funkcie na ľavej strane Hodnota, ktorá bola pridelená identifikátoru funkcie ako posledná, je výslednou hodnotou funkcie Volanie funkcie môže nastať len na takom mieste programu, kde sa očakáva nejaká hodnota Volanie podprogramu v programe má tvar: MENO ( p1,p2,,pn) ; p 1,p 2,,p n sú skutočné parametre Príklad: program fun1; var x,y,vysledok:real; function SUCET(A,B:real):real; premenné x,y sa použijú ako skutočné parametre pre vyvolanie funkcie SUCET formálne parametre typ hodnoty, ktorú funkcia vracia SUCET:=A+B; writeln('zadaj dve cisla:'); readln(x,y); vysledok:=sucet(x,y); writeln('x+y=',vysledok:5:2); readln výsledok vypočítaný funkciou musí byť priradený menu funkcie SUCET vyvolanie funkcie so skutočnými parametrami
Príklad: Vytvorte podprogram na výpočet mocniny x n, kde x je reálne číslo a n prirodzené číslo Keďže výsledkom výpočtu je jedna jednoduchá hodnota, môžeme použiť funkciu, na výpočet mocniny použijeme cyklus so známym počtom opakovaní: x n = xxx x function MOCNINA (X : real; N : integer ) : real; var MOC : real; I : integer; MOC := 1; for I:=1 to N do MOC :=MOC * X; MOCNINA := MOC; Príklad: 1 Vytvorte program, ktorý vypočíta faktoriál celého čísla 2 Napíšte program výpočtu kombinačného čísla Úlohu riešte pomocou podprogramu (pozor na preplnenie!) Kombinačné číslo je definované: C(n,k) = n! / ((n-k)! * k!)=123(n-k)n/123(n-k)123k=(n-k+1)(n-k+2)n/123k 3 Napíšte program, ktorým nájdete najväčšieho spoločného deliteľa N zadaných čísel Úlohu riešte pomocou podprogramu Euklidovho algoritmu
Procedúra Štruktúra: PROCEDURE_meno procedúry(definícia vstupných parametrov); CONST_definovanie konštánt procedúry; BEGIN príkaz; { telo procedúry } END; TYPE_definovanie nových typov premenných; VAR_definovanie lokálnych premenných pre procedúru; Podľa použitých objektov možno definovať procedúry: bez parametrov a lokálnych objektov program na výmenu hodnôt, kde použijeme procedúru VYMENA var A, B, POM: integer; procedure VYMENA; POM: = A; A: = B; B: = POM; VYMENA; v programe sa procedúra deklaruje ešte pred samotným telom programu, globálne premenné
bez parametrov s lokálnymi parametrami var A, B: integer; procedure VYMENA; var POM: integer; POM: = A; A: = B; B: = POM; VYMENA; v programe sú premenná A,B globálne premenné a POM je lokálna premenná, ktorej platnosť a životnosť je iba v procedure: VYMENA
procedúry s parametrami v programe sa odovzdávajú parametre procedúre hodnotou, tzn iba hodnota, akú premenná obsahuje nie celá premenná var A, B: integer; procedure VYMENA( X,Y: integer); var POM: integer; POM: = X; X: = Y; Y: = POM; A: = X; B: = Y; VYMENA(A,B); toto sa používa, keď chceme používať vzorce, úpravy a nechcem meniť pôvodné premenné
odovzdávanie parametrov referenciou, odovzdám celú premennú, jej hodnotu aj adresu var A, B: integer; procedure VYMENA(var: X,Y: integer); var POM: integer; POM: = X; X: = Y; Y: = POM; VYMENA(A,B);