6 Algoritmy a programovanie v jazyku Pascal Procedry

  • Slides: 18
Download presentation
6. Algoritmy a programovanie v jazyku Pascal Procedúry a funkcie Inštitút manažmentu a cestovného

6. Algoritmy a programovanie v jazyku Pascal Procedúry a funkcie Inštitút manažmentu a cestovného ruchu Procedúry Rekurzia Jednotky

Procedúry a funkcie Je pravdou, že ak by sme niektoré programy nerozčlenili, tak by

Procedúry a funkcie Je pravdou, že ak by sme niektoré programy nerozčlenili, tak by sme sa v nich nijako nevyznali. Pozrieme sa na to, ako zvýšiť prehľadnosť a zrozumiteľnosť programu. Najprv niekoľko zásad, ako zvýšiť prehľadnosť programu: Ø Používajte prázdne riadky (oddeľujte nimi logicky nezávislé celky) Ø Používajte komentáre na začiatku programu (ako sa program ovláda a čo by mal robiť) Ø Používajte komentáre (Prečo je tu to a to funguje tamto…) Ø Aspoň zhruba si rozmyslite, ako má program vyzerať, skôr než sadnete k počítaču Ø Využívajte procedúry a funkcie

Procedúry Najprv sa pozrieme na procedúry. Definujú sa nasledovne: procedure Názov. Procedúry(Parametre); Definícia a

Procedúry Najprv sa pozrieme na procedúry. Definujú sa nasledovne: procedure Názov. Procedúry(Parametre); Definícia a deklarácia; begin Zložený príkaz; end; Definície a deklarácie sú rovnaké ako v bežnom programe, s výnimkou, že nesmieme používať uses. A nemali by sme definovať ani ďalšie procedúry (stráca sa prehľadnosť, kvôli ktorej práve procedúry zavádzame). V programe potom používame nasledovné premenné: – miestna deklarácia (v procedúre) – Ak potrebuje určitý dátový typ iba určitá procedúra, je lepšie ho definovať priamo v nej. Premenné sa potom vyskytujú iba v tele (medzi beginom a endom) procedúry a sú prístupné iba v nej samotnej. – globálna deklarácia (v programe) – Premenná je potom dostupná aj v procedúre aj v programe.

Procedúry – Vzor Najprv sa pozrieme na procedúry. Definujú sa nasledovne: Program Ukazka; var

Procedúry – Vzor Najprv sa pozrieme na procedúry. Definujú sa nasledovne: Program Ukazka; var z 1, z 2 : char; {Globálna deklarácia} Procedure Prehod. Znaky; var pom : char; {Lokálna deklarácia} begin pom : = z 1; z 1: = z 2; z 2 : = pom; end; begin Write('Zadaj dva znaky'); readln(z 1, z 2); Writeln(z 1, ' ', z 2); Prehodznaky; Writeln(z 1, ' ', z 2); end.

Funkcie sa definujú nasledovne: function Názov(Parametre): VýslednýTyp; Deklarácie a definície begin Zložený príkaz; end.

Funkcie sa definujú nasledovne: function Názov(Parametre): VýslednýTyp; Deklarácie a definície begin Zložený príkaz; end. O funkciách platí všetko, čo bolo povedané o procedúrach. V tele samotnej funkcie sa ale musí použiť priradzovací príkaz Názov. Funkcie: =NejakáHodnota; Pretože to je výsledok funkcie. Jeho hodnota sa už ďalej nesmie meniť. Pred i po priradení ale môžu prebiehať akékoľvek príkazy, ktoré s výsledkom funkcie nemajú nič spoločné.

Formálne a skutočné parametre – Vzory Program, ktorý využíva procedúry alebo funkcie, môže byť

Formálne a skutočné parametre – Vzory Program, ktorý využíva procedúry alebo funkcie, môže byť napísaný dvojako. Ukážeme si to na príklade: program Objem 1; var polomer, v : real; function Objem. V : real; begin Objem. V : = pi*sqr(polomer)*v; end; begin Writeln('Zadaj polomer a vysku'); readln(polomer, v); Writeln(Objem. V); end. program Objem 2; var polomer, vyska : real; function Objem. V (Polomer, v: real) : real; begin objem. V : = pi*sqr(polomer)*v; end; begin Writeln('Zadaj polomer a vysku valca'); readln(polomer, v); Writeln(objem. V(polomer, vyska)); Writeln(Objem. V(polomer*2, vyska)); end.

Formálne a skutočné parametre Druhý spôsob zápisu sa ukazuje ako jednoduchší, keď je potrebné

Formálne a skutočné parametre Druhý spôsob zápisu sa ukazuje ako jednoduchší, keď je potrebné použiť rovnakú procedúru pre rôzne polomery valca. V tomto prípade sa neprepisuje procedúra, prípadne sa nemusí prepočítavať premenná vopred, ale stačí uviesť správnu hodnotu premennej pri volaní procedúry. Parametre v mieste deklarácie funkcie označujeme ako predpísané (formálne) a v mieste volania funkcie ako skutočné parametre. Ich názvy a nemusia absolútne zhodovať.

Parametre nahradené hodnotou a odkazom Ak rozlišujeme predpísané a skutočné parametre, musíme tiež rozlišovať

Parametre nahradené hodnotou a odkazom Ak rozlišujeme predpísané a skutočné parametre, musíme tiež rozlišovať medzi parametrami nahradenými hodnotou a nahradenými odkazom. Rozdiel si ukážeme na dvoch programoch, vrátime sa k prvému ukážkovému programu. Pri prvom programe budú hodnoty prehodené vo vnútri procedúry, ale nebudú späť „exportované“ do nadradeného programu. Parameter, ktorý je nahradzovaný hodnotou sa chová ako miestny. Takže vo výpise hodnôt z 1, z 2 sa neukáže prehodenie poradia. Problém odstránime jednoducho, pri deklarácii procedúry napíšeme vyhradené slovo var:

Parametre nahradené hodnotou a odkazom Program Ukazka 3; Program Ukazka 4; var z 1,

Parametre nahradené hodnotou a odkazom Program Ukazka 3; Program Ukazka 4; var z 1, z 2 : char; Procedure Prehod. Znak(x 1, x 2 : char); Procedure Prehod. Znak(var x 1, x 2: char); var pom : char; begin pom : = x 1; pom : = z 1; x 1: = x 2; z 1: = z 2; x 2 : = pom; z 2 : = pom; end; begin Write('Zadaj dva znaky'); readln(z 1, z 2); Writeln(z 1, ' ', z 2); Prehodznaky; Writeln(z 1, ' ', z 2); end.

Parametre nahradené hodnotou a odkazom Takýto parameter nahradzovaný odkazom sa bude chovať inak. Parametre

Parametre nahradené hodnotou a odkazom Takýto parameter nahradzovaný odkazom sa bude chovať inak. Parametre procedúry už predstavujú konkrétnu hodnotu, tú, ktorú sme uviedli v zozname skutočných parametrov. Zmena hodnoty uvedená vo vnútri procedúry bude platiť aj po návrate do hlavného programu. Pre tento typ nahradenia sa rozhodujeme vždy v týchto prípadoch: 1. Parameter nahradzovaný odkazom použijeme vždy pre každú výstupnú hodnotu. Aby výsledok výpočtu v procedúre bol „importovaný“ aj do nadriadeného programu. 2. Premenné dátového typu súbor musia byť vždy deklarované ako parametre nahradzované odkazom. 3. Pri práci s veľkými datovými štruktúrami využívame parametre nahradzované odkazom, pretože sú menej náročnejšie na pamäť.

Procedúry a funkcie – príklady Príklad 51. Zostavte jednoduchý program na prehodenie dvoch znakov,

Procedúry a funkcie – príklady Príklad 51. Zostavte jednoduchý program na prehodenie dvoch znakov, ktorý bude obsahovať procedúru (z prednášky). Príklad 52 A, B. Zostavte program na výpočet objemu s použitím formálnych a skutočných parametrov, ktorý bude obsahovať procedúru (z prednášky). Príklad 53 A, B. Zostavte dva programy na výmenu znakov, v ktorých porovnáte nahradenie hodnotou a odkazom (z prednášky) Príklad 54. Zostavte program na sčítanie matíc, pomocou procedúr.

Rekurzia a rekurzívne programy Pri procedúrach a funkciách sa veľmi často sa používa rekurzia.

Rekurzia a rekurzívne programy Pri procedúrach a funkciách sa veľmi často sa používa rekurzia. Ide prípady, kedy funkcia alebo procedúra sa priamo alebo nepriamo (ak ide o cyklický odkaz viacerých podrogramov) odkazuje sama na seba. Najprv ukážka funkcie, typickým príkladom priamej rekurzie sú faktorály: function Factorial(N: byte): longint; begin if N >0 then Factorial: = N * Factorial(N-1) else Factorial: =1; end; Najdôležitejšie pri využívaní tohto algoritmu je nezabudnúť ukončiť cyklus!

Rekurzia a rekurzívne programy Problém ale nastáva, ak máme dve procedúry, z ktorých prvá

Rekurzia a rekurzívne programy Problém ale nastáva, ak máme dve procedúry, z ktorých prvá využíva druhú a naopak, teda keď ide o nepriamu rekurziu. V Pascale sa totiž môže používať iba to, čo sme si dopredu zadefinovali. Ako to vyriešiť? Oznámime existenciu danej procedúry pomocou procedure Názov. A(parametre); forward; Potom dodefinujeme procedúru procedure Názov. B (v ktorej používame Názov. A). A nakoniec uvedieme samotné telo Názvu. B (procedure Názov. A; (tu už nemusíme vypisovať parametre. . . )

Rekurzia a rekurzívne programy nepriama rekurzia

Rekurzia a rekurzívne programy nepriama rekurzia

Rekurzia a rekurzívne programy – príklady Príklad 55. Zostavte príklad na výpočet faktoriálu tak,

Rekurzia a rekurzívne programy – príklady Príklad 55. Zostavte príklad na výpočet faktoriálu tak, aby ste použili priamu rekurziu (z prednášky) Príklad 56. Zostavte príklad na nepriamu rekurziu.

Jednotky Niektoré funkcie a procedúry sú natoľko časté, že sa vyskytujú vo viacerých programoch.

Jednotky Niektoré funkcie a procedúry sú natoľko časté, že sa vyskytujú vo viacerých programoch. Aby nás neustále vypisovanie neobťažovalo, je lepšie ich umiestniť do zvláštneho súboru (Tento spôsob sa využíva vtedy, ak je funkcií veľa a výsledný program by bol neprehľadný). Takéto procedúry sa umiestňujú do tzv. jednotiek (units). Jednotky potom majú nasledovnú štruktúru: unit Názov; interface Definície a Deklarácie; implementation Definície a Deklarácie; begin Inicializačná Časť; end.

Jednotky 1. Unit musíme uložiť do rovnomenného súboru (Názov. pas), inak by sme ju

Jednotky 1. Unit musíme uložiť do rovnomenného súboru (Názov. pas), inak by sme ju nemohli využiť. Ak používame unit-u v inom program, je potrebne uložiť ich do jedného adresára a nastaviť cestu Change. Directory. 2. V časti interface definujeme to, čo by malo byť prístupné i mimo unitu (procedúry, funkcie, konštanty, typy. . . ). U procedúr a funkcií uvádzame iba hlavičku (úplné). 3. V časti implementation potom definujeme to, čo potrebujeme iba pre potreby danej unity (pomocné typy, konštanty, premenné, . . . ) Ďalej potom dodefinujeme telo funkcie alebo procedúry (tu stačí písať skrátenú hlavičku - bez parametrov a výsledného typu);

Jednotky 4. V Inicializačnej časti potom uložíme príkazy, ktoré sa vykonajú, keď jednotku načítame

Jednotky 4. V Inicializačnej časti potom uložíme príkazy, ktoré sa vykonajú, keď jednotku načítame do pamäte (ak pracujeme s jednotkou, ktorá využíva grafiku, bolo by dobré zmazať obrazovku a nastaviť grafický režim. . ). Ak program neobsahuje inicializačnú časť, môžeme begin vynechať (ale end. zostane) Príklad 47. Vytvorte jednotku v ktorej zadefinujete procedúry pre prácu s komplexnými číslami