všetko

PrílohaVeľkosť
pascal.doc587 KB

1. Vyhradené slová a direktívy

Pascal používa:

Vyhradené slová slúžia na definovanie premenných, operácií, atď., preto sa nesmú používať na nič iné: and, array, asm, begin, case, const, constructor, destructor, div, do, downto, else, end, exports, file, for, function, goto, if, implementation, in, inherited, inline, interface, label, library, mod, nil, not, object, of, or, packed, procedure, program, record, repeat, set, shl, shr, string, then, to, type, unit, until, uses, var, while, with, xor.

Direktívy sa môžu použiť aj na iné účely: absolute, assembler, export, external, far, forward, index, interrupt, near, private, public, resident, virtual.

PrílohaVeľkosť
skripta.doc587 KB

2. Skladba programu

  1. HLAVIČKA - obsahuje názov programu a poznámky na čo je program a čo sa v ňom môže meniť. Začína slovom program.
  2. DEFINÍCIE, DEKLARÁCIE - definicía dátových typov (TYPE), premenných (VAR), použité programové jednotky (USES)
  3. TELO - obsahuje príkazy programu. Je ohraničené slovami begin a end.

Ukážka programu ma súčet dvoch čísel:

Program SucetCisel;
var a, b, c : integer;
begin
Writeln(' Zadaj dve prirodzene cisla a, b ');
Readln(a,b);
c :=a+b;
Write('Sucet cisel je: ', c);
readln;
end.

3. Programové jednotky

Programové jednotky slúžia na zjednodušenie a zrýchlenie programovania. Každá knižnica obsahuje nejaký zoznam funkcií a ich výstupov a procedúr. Po vložení knižnice do programu, vieme volať všetky jej funkcie, ktoré vykonajú nejakú operáciu alebo vrátia nejaku hodnotu. Napríklad ak chceme kresliť kružnicu voláme funkciu Circle, zadáme parametre a bez toho aby sme vedeli postup vykresľovania kružnice, vráti funkcia výstup a teda vykreslenú kružnicu.

1. Prehľad jednotiek

Pascal obsahuje málo príkazov. Ak chceme pridať ďalšie, musíme si ich napísať (čo je pracné), alebo využiť programové jednotky:

  • System - obsahuje najbežnejšie používané príkazy (Readln, Writeln); Jej meno sa v uses neuvádza
  • Crt - práca s textom (zmena farby) + efekty (hudba)
  • Graph - práca s akožegrafikou (kreslenie plných štvorcov a prázdnych kružníc)
  • Printer - Uľahčuje tlač ( = Umožňuje tlačiť)
  • Dos - Spolupráca s operačným systémom (Vymaž adresár, súbor...)
  • Strings - Práca s reťazcom
  • Overlay - vhodné pre počítač s menej ako 2 MB RAM, dnes už na nič
  • Turbo3 - Ak chcete používať zastaralé príkazy verzie 3.0 (jedine z nostalgie)
  • Graph3 - Ešte zastaralejšie grafické príkazy 3.0 (grafika okolo roku 1985)

Ak chceme niektorú z nich používať, musíme to prekladaču oznámiť pomocou uses NázovJednotiek; do časti deklarácií. Napríklad: uses Graph. Jednotky netreba používať zbytočne.

Ukážka programu:

program farebnytext;
uses Crt;
begin
TextColor(Blue);
Write('modry text');
TextColor(LightGreen);
Writeln('zeleny text');
Readln;
end.

2. Jednotka System

Matematické procedúry a funkcie

Umožňujú spracovať matematické výrazy.

Round(x):longint - zaokrúhli x
Trunc(x):longint - celá časť x
Frac(x):Real - desatinná časť x
Int(x):Real - Zaokrúhli x. Výsledným typom je ale Real !!!
Abs(x : ČíselnýTyp) : ČíselnýTyp - absolútna hodnota z x, výsledny typ je rovnaký, ako má pôvodné číslo
Pi : Real - známe číslo (3,1415...)
ArcTan(x):Real - ArcusTangens z x (Tan-1 x)- výsledok je v radiánoch
Cos(x):Real - Cosinus (x je v radiánoch)
Sin(x):Real - Sinus (x v radiánoch)
Sqr(x):Real - druhá mocnina
Sqrt(x):Real - druhá odmocnina
Exp(x):Real - ex
Ln(x):Real - prirodzený logaritmus z x
Randomize; Nastaví generátor náhodných čísel
Random : Real; Generuje náhodné číslo z intervalu 0,1)
Random(n) : Longint; Generuje náhodné prirodzené číslo menšie než n (môže vygenerovat i nulu)

Procedúry konverzné

Prevádzajú medzi sebou jednotlivé typy premenných.

Chr(x) : char – vráti x-tý znak v ASCII tabulke
Ord(x) : longint – vráti o koľký znak daného typu se jedná (počíta sa od nuly)
UpCase(x):char – prevedie písmeno na veľké
Round(x):Longint – zaokrúhli reálné číslo
Trunc(x):Longint – celá čásť reálneho čísla
Str(x,s) - procedura prevedie reálne číslo x na reťazec znakov s. (je možné použiť poznámku k x : PočetMiest, x:PočetMiest:PočetMiestZaDesetinnou)
Val(s,var v,c) – Procedura prevedie reťazec s na reálne číslo v (=premenná), v prípade chyby vráti v c u koľkatého znaku došlo k chybe

Procedúry ordinálne

Umožňujú lepšie spracovanie ordinálnych premenných. Je potrebné si uvedomiť, že Word sa skladá z dvoch bytov.

Ord(x):longint – vracia ordinárne číslo znaku
Pred(x):ordinal – vracia predchodcu danej hodnoty
Succ(x):ordinal – vracia nasledovníka hodnoty
Odd(x):Boolean – Testuje, či je x párne, alebo nepárne (x je celé číslo)
Inc(x) – Procedura zvýši hodnotu celého čísla x o 1
Inc(x,n) – Procedura zvýši hodnotu celého čísla o n
Dec(x) – Procedura zníži o 1 hodnotu premennej x.
Dec(x,n) – Procedura zníži hodnotu x o n.
Pozn. Procedúry Inc a Dec sú o niečo rýchlejšie (a teda i lepšie) než tradičné priradzovanie.

Procedúry a funkcie pre prácu s reťazcami

Zjednodušujú prácu s reťazcovými premennými

Concat(a,b,c,...):string – spojí reťazce do jediného (lepšie ako x:=a+b+c+...); Pochopiteľne je možné zadať aj samotný reťazec (Write(Concat('a'));)
Copy(s,od,pocet):string – vracia podreťazec reťazca s, začína pritom od „od“ a vyhodí počet znakov
Delete(s,od,pocet) – Procedúra vymaže z reťazca „s“ počet znakov (začne od „od“)
Insert(v,r,kam) – Procedúra vloží na miesto „kam“ do reťazca „r“ reťazec „v“.
Pos(subs,s):byte – Nájde, kde sa v reťazci „s“ nachádza podreťazec „subs“; ak nenájde daný podreťazec, vracia nulu.
Length(s):integer – vracia skutočnú dĺžku reťazca
Str(x,s) – Prevedie číslo „x“ na reťazec „s“
Val(s,var v,c) – Prevedie reťazec „s“ na číslo „v“, pokiaľ sa vyskytne chyba, je číslo prvého chybného znaku uložené v premennej c;

Procedúry riadenia behu výpočtu

Break – Procedúra okamžite ukončí práve prebiehajúci cyklus
Continue – Prejde na koniec cyklu (a buď ho vykoná od začiatku, nebo skončí)
Exit – Ukončí podprogram (=prebiehajúcu procedúru)
Halt – Okamžite ukončí program
Halt(n) – Ukončí program a ako výstupnú hodnotu (ERRORLEVEL) udá n
RunError – Ukončí program tým, že vyvolá chybu 0 (delenia nulou?)
RunError(n) – Ukončí program vyvolaním chyby s číslom n

Procedúry pre prácu s ukazovateľmi a dynamickými premennými

Bez nich by programovanie nebolo možné. Využívajú sa všade, hlavne pri vytváraní a práci s dynamickými zoznamami dát.

Assigned(P) : Boolean – Ukazuje P na niečo? (rovnako je i P <> nil)
Addr(x):pointer Vracia ukazovateľ (adresu) na premennú x.
New(p); vytvorí novú dynamickú premennú a nastaví na ňu ukazovateľ p
Dispose(p); zruší dynamickú premennú, na ktorú ukazuje p.

Procedúry a funkcie pre prácu zo súbormi

Občas je vhodné, aby sme data uložili, kým ich nepotrebujeme zmazať. Pozn. „s“ teraz bude znamenať reťazec typu 'C:\...')

ChDir(s) – nastaví aktuálny adresár (zložku) na „s“ („s“ je názov zložky v systéme MS-DOS)
GetDir(d:Byte,var s:string) – Procedúra uloží do reťazca „s“ aktuálny adresár. Parameter d udáva, o ktorý disk sa zaujímame (0 - súčasný, 1 - A:, 2 - B: ...)
MkDir(s) – vytvorí novú zložku s názvom „s“
RmDir(s) – zmaže prázdny adresár „s“
Assign(f,s) – priradí premennej f externý súbor s názvom s
Erase(f) – zmaže súbor priradený k premennej f. f nesmie byť otvorený ani pre čítanie ani pre zápis
Rename(f,s) – premenuje externý súbor priradený k premennej f na s. f nesmie byť otvorený
Reset(f) – Otvorí súbor na čítanie
Rewrite(f) – otvorí (vytvorí, ak neexistoval) súbor pre zápis
Close(f) – Zavrie ľubovoľný otvorený súbor
Append(f) – otvorí textový! súbor pre zápis, ale nezmaže pritom predchádzajúce znaky
Write(f,x) – zapíše do súboru f hodnotu premennej x
Writeln(f,x) – To isté, ale zapíše znak konca riadku (pri textových súboroch)
Read(f,x) – Prečíta hodnotu zo súboru a uloží ju do premennej x.
Readln(f,x) – To isté, ale po načítaní premennej prejde na nový riadok.
Eof(f):Boolean – Funkcia testuje, či nenastal koniec souboru
Eoln(f):Boolean – Funkcia u textového súboru testuje, či sme sa nedostali na koniec riadku.

Ostatné procedúry a funkcie

Niektoré procedúry a funkcie jednotky SYS nie je možné zaradiť ani do jednej z kategórií:

ParamCount : Word – funkcia vracia počet parametrov, ktoré mal program v príkazovom riadku
ParamStr(I) : string – vracia hodnotu I-teho parametra ParamStr(1) = 'megahit'
SizeOf(X):longint – vracia, koľko miesta v pamäti zaberá X (môže to byť premenná či i typ)
Include(S,P) – zaradí do množiny S prvok P (P musí patriť vhodnému (=bázovému) typu)
Exclude(S,P) – vyradí z množiny S prvok P (P musí byť bázového typu)
Pozn. Include a Exclude sú oproti S:=S±[P] o málilinko výhodnejšie.

Jednotka CRT

Jednotka Crt nám umožňuje vyrobiť rôzne textové a zvukové efekty. Pre tých, ktorý používajú FreePascal – obsah tejto jednotky je zahrnutý už v jednotke System. Jednotka Crt mala tú nevýhodu, že nefungovala na počítačoch s procesormi rychlejšími ako 200MHz. na Internete je niekoľko opravných opatrení. Ak pracujete s TP7, najskôr sa s týmto problémom už nestretnete. Inak musíte nájsť opravnú jednotku (napr. Crtp2), či patch, ktorý umožní fungovat už preloženým súborom.

Uvedomte si, že súradnice sa na obrazovke počítajú zľava doprava a zhora dole.

Procedúry a funkcie

ClrScr – Procedúra zmaže obrazovku
GotoXY(X,Y:Byte) – Presunie textový kurzor na zadané súradnice(obrazovka má 80 x 25 znakov)
WhereX:Byte – x-ová súradnice kurzora
WhereY:Byte – y-ová súradnica kurzora
Delay(ms:word) – Počká ms milisiekund
Sound(Hz) – začne vydávať zvuk o frekvencii v Hz (je možné použiť aj jednoduché skladby: komorné A má 440Hz a tón o oktávu vyšší potom má frekvenciu dvojnásobnú)
NoSound – Ukončí vydávanie zvuku (jediný spôsob, ako sa zbaviť pišťania, najčastejšie sa používa v spojení: Sound(FrekvenceDanéNoty), Delay(DobaTrváníNoty); Nosound
ReadKey:char – Prečíta jeden znak z klávesnice. Používa sa najčastejšie v cykloch, kde sa dookola testuje, či bola stlačená nejaká klávesa (nemusí totiž čakat na stačenie Entra ako Readln)
KeyPressed : Boolean – Funkcia zisťuje, či stlačil užívateľ niečo

3. Jednotka CRT

Jednotka Crt nám umožňuje pracovať i s farbami. K tomu sa musia farby ale nejako definovať a na to máme zopár konštánt:

Black 0
Blue 1
Green 2
Cyan 3
Red 4
Magenta 5
Brown 6
LightGray 7
DarkGray 8
LightBlue 9
LightGreen 10
LightCyan 11
LightRed 12
LightMagenta 13
Yellow 14
White 15
Blink 128

Ako číslo 4, tak i Red znamenajú červenú farbu. Takže uveďme si teraz niekoľko farebných funkcií:

TextColor(Barva) – Zmení farbu textu na zadanú hodnotu
TextBackground(Barva) – Zmení farbu pozadia (nie vašeho). Pri tejto procedúre používame tmavé farby.

Uvedené procedúry sa nevzťahujú na už napísané znaky (ClrScr je výjimka)

4. Jednotka PRINTER

Táto jednotka definuje výstupný súbor Lst a vykoná jeho inicializáciu. Akýkoľvek zápis do tohoto súboru znamená tlač. Vyskúšajte si tento program (ak neviete čo robí)

program Tlac;
var I:Integer;
begin
for I:=1 to MaxInt do
Writeln(Lst,'To je ale papiera');
end.

4. Základné typy premenných

  • Jednoduché
    • Ordinálne
      • celočíselné: byte ( 1 byte, 0 - 255), shortint (1 byte, -128..127), word (2B, 0..65535), integer (2 B, -32 768..32 767), longint (4 B, -2 147 483 648 .. 2 147 483 647)
      • boolean - logická hodnota True (pravda) alebo False (nepravda), použitie pri podmienkach. (If Podmienka then, until Podmienka;...). Ak sa má výraz vyhodnotiť ako Booleovská premenná, je nutné, aby bol v zátvorkách., Napríklad: if (x>5) and (x<12) then
      • char - znaky, zapísané (Znak := 'A'), alebo ASCII (Znak := #64;), alebo číslo znaku( Znak :=Chr(64); ), alebo ^Písmeno (Znak := ^A;). Pozor: 'B' a 'b' sú iné znaky, '1' je znak (číslica), ale 1 je číslo, #12 = Ord(12), pomocou ^ zadávame Ctrl-znaky, akoby sme držali kláves Ctrl (^C = Ctrl-C , čo odpovedá #3 – podľa abecedy)., znak apostrofu musíme vyjadriť ako dvojicu apostrofov, napríklad: Znak := ''''; Pozrite si ASCII tabuľku.
      • vymenovaný, napr.: type Farby = (Modra, Zelena, Cervena);
      • interval - Dolna hranica .. dve bodky .. Horna hranica (var a : 1..7; alebo type TStlpec = 'a'..'h'; var Stlpec : TStlpec;)
    • Neordinálne: single (1,5E-45 až 3,4E+38 , 7 platných číslic , 4 byty) , real (2.9E-39 až 1.7E+38, 11 platných číslic, 6 byteov), double (5,0E-324 až 1,7E308 , 15 číslic, 8 bytov), extended (3,4E-4932 až 1,1E4932 , 19 číslic, 10 bytov), comp (-2^63 + 1 až 2^63 - 1 , 19 číslic, 8 bytov)
  • Štrukturované
    • Pole - viacrozmerná skupina dát rovnakého typu
    • Záznam - pevne daná skupina dát rôzneho typu
    • Množina - pevne daná skupina dát rovnakého typu (bez usporiadania)
    • Súbor - premenná štruktúra prvkov rovnakého typu, z ktorých je prístupný vždy len jeden
  • Ukazovateľ - adresa premennej v pamäti, ukazuje na ňu

5. Riadenie programu

Vstavané riadiace procedúry

  • Exit – Okamžite ukončí podprogram (= procedúru alebo funkciu).
  • Halt – Okamžite ukončí náš program.
  • Halt(Code:Word); Okamžite ukončí náš program a ako výsledok (=v Dose ERRORLEVEL) dá Code.
  • RunError; Vytvorí chybu s kódom 0.
  • RunError(Code:Word); Vytvorí chybu s kódem Code; (Lze takto napríklad trápiť užívateľa hláškami typu Error XYZ: C: is not formatted)
    Ak nastane nejaká udalosť, ktorá vyžaduje okamžité ukončení nášho programu, zavoláme Halt.
    Ak potrebujeme rozlíšiť viac takých stavov, použijeme RunError a niektoré nevyužité kódy chýb.

Rozhodovanie

Využívame:

  • if Podmienka then Príkaz;
  • if Podmienka then Príkaz else InýPríkaz;

Ináč povedané: ak je podmienka splnená, vykonaj príkaz. Podmienka je ľubovoľný výraz typu Boolean (musí byť vyhodnotiteľná: pravda/nepravda) a príkaz môže byť aj zložený (skupina začne BEGINom a končí ENDom). Ak podmienka splnená nie je (jej hodnota je False), nerob nič, alebo vykonaj iný príkaz za ELSE (zase môže byť aj zložený).

Príklad 1: Absolútna hodnota čísla.

Program AbsoltnaHodnota;
var a: real;
begin
Writeln('Zadaj číslo');
Readln(a);
If a<0 then a:=a*(-1);
Write('Absolútna hodnota čísla je:', a);
readln;
end.

Príklad 2: Teplo alebo zima von podľa teploty.

Program TeploZima;
var a: real;
begin
Writeln('Zadaj teplotu');
Readln(a);
If a<7 then
Writeln('Je zima');
else
Writeln('Je teplo');
readln;
end.

Občas je ale možností viac. K tomu nám už nestačí premenná typu Boolean (dve hodnoty), ale musíme využiť iný ordinárny typ (napr. interval, char, integer); Toto rozhodovanie potom vyzerá takto :

case Premenná of
Hodnota1: Príkaz1;
Hodnota2: Príkaz2;
Hodnota3: Príkaz3;
...
else InýPríkaz; end;

Ak má premenná Hodnotu1, vykoná sa Príkaz1 (zase i zložený)... Ak sa obsah premennej nezhoduje ani s jednou uvedenou hodnotou, vykoná sa InýPríkaz;
Časť s else môže byť aj vynechaná.

Príkaz case sa najčastejšie využíva pri tvorbe menu.

Príklad 3: Jedna hodnota pre možnosť.

Program VyberMoznosti;
var cislo: integer;
begin
writeln(‘Zvol moznost 1, 2 alebo 3!’);
readln(cislo);
case cislo of
1: writeln(‘Zvolil si moznost 1’);
2: writeln(‘Zvolil si moznost 2’);
3: writeln(‘Zvolil si moznost 3’);
elsewriteln(‘Zvolil si nespravnu hodnotu!’);
readln;
end.

Príklad 4: Viac hodnôt pre jednu možnosť.

writeln(‘Zvolte moznost A, B alebo C’);
readln(volba);
case volba of
‘a’, ‘A’:writeln(‘Zvolili ste moznost A’);
‘b’, ‘B’:writeln(‘Zvolili ste moznost B’);
‘c’, ‘C’:writeln(‘Zvolili ste moznost C’);
else
writeln(‘Zvolili ste nespravnu hodnotu’);

Príklad 5: Intervaly hodnôt.

case volba of
   1..3:begin
         readln(c1,c2);
         writeln(c1+c2);
      end;
   4..8:writeln(‘Zvolili ste hodnotu z intervalu <4,8>’);
else
   writeln(‘Nezvolili ste hodnotu od 1 do 8’);

Cyklus

Cyklus opakovane vykonáva jednoduchý alebo zložený príkaz.

S počtom krokov

For Prem := Min to Max do Príkaz;

Vykonáva príkaz, pričom hodnotu ordinárnej premennej Prem zvyšuje od Min do Max (Max > Min)

For Prom := Max downto Min do Príkaz;

To isté ako for s to, ale hodnota premennej sa znižuje

Príklad 6: Výpis čísel od Min do Max.

For i := Min to Max do write(i);

Príklad 7: Výpis čísel od Max do Min.

for i:='Max' downto 'Min' do write(i);

Príklad 8: Aritmetický priemer čísel.

Program prikladfor;
var i,pocet:integer;zlozka,sucet,priemer:real;
begin
write('Zadaj pocet cisel: ');readln(pocet);
sucet:=0;
for i:=1 to pocet do begin
write('Zadaj ',i,' zlozku: ');
readln(zlozka);
sucet:=sucet+zlozka;
end;
writeln('Sucet je ',sucet, 'Priemer zo zadanych cisel je: ',sucet/pocet:10:2);
readln;

end.

Príklad 9: Faktoriál.

Program Faktorial;
var a, b: integer;
begin
Writeln(' Zadaj číslo pre výpočet faktoriálu');
Readln(a);
b := 1
For I := 1 to A do b := b * I;
Write('Faktoriál je', b);
readln;
end.

S podmienkou na konci

repeat
Príkaz1;
Príkaz2;
...
until Podmienka;

Tento cyklus sa opakuje tak dlho, dokiaľ nie je splnená podmienka (Ale vždy sa vykoná aspoň raz. Všimnite si tiež, že môže obsahovať aj viac ako jeden príkaz. Nesmieme ale zabudnúť, že podmienka sa musí meniť, aby cyklus niekedy aj skončil.

Príklad 10: Najväčší spoločný deliteľ dvoch čísel pomocou Euklidovského algoritmu.

Program prikladwhile;
uses crt;
var a,b:integer;
begin
clrscr;
write('Zadaj dve cisla: '); readln(a,b);
while a=b do begin
if a>b then a:=a-b;
if b>a then b:=b-a;
end;
writeln('NSD tychto cisel je ',a:3);
readln;
End.

Príklad 11: výpis čísel 1 až 20 pomocou WHILE

S podmienkou na začiatku

while Podmienka do Príkaz;

Ak je splnená podmienka, vykonávaj príkaz (i zložený). I tu musíme zaistiť, aby sa hodnota podmienky niekedy menila. Narozdiel od cyklu repeat sa telo cyklu nemusí vykonať ani raz. Na riadenie programu sa ďalej viažu tieto procedúry:

Break – Okamžite ukončí práve prebiehajúci cyklus (ostatné príkazy sú ignorované)

Continue; Prejde hneď na koniec cyklu a vyhodnotí podmienku (pri for pokračuje od ďalšej hodnoty premennej). Príkazy medzi Continue a koncom cyklu sú ignorované.

Príklad 12: Program po žiadosti vypíše stlačenú klávesu, v prípade q alebo Q sa program ukončí.

program klaves;
uses crt;
var kl:string;

begin
clrscr;
repeat
writeln ('Stlac klaves (Q,q: koniec) ');
kl:=readkey;
writeln(kl);
until (kl='q') or (kl='Q');
end.

Príklad 13: Výpis čísel 1 až 20 pomocou REPEAT

Príklad 14: Najväčší spoločný deliteľ 2 prirodzených čísel (Euklidov algoritmus).

Príkazy cyklu REPEAT sa vždy vykonávajú aspoň raz. V cykle WHILE sa príkaz nemusí vykonať ani raz - pri nesplnení podmienky hneď na začiatku.

6. Dátové štruktúry

1. Ukazovateľ

2. Množina

3. Pole

4. Záznam

5. Súbor

7. Vlastné procedúry, funkcie a jednotky

Procedúry

procedure NázovProcedú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 a funkcie (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.

Príklad na takúto deklaráciu:

Program Ukazka;
var z1,z2 :char; {Globálna deklarácia}
Procedure PrehodZnaky;
var pom : char; {Lokálna deklarácia}
begin
pom := z1;
z1:= z2;
z2 := pom;
end;
begin
Write('Zadaj dva znaky');
readln(z1,z2);
Writeln(z1,' ',z2);
Prehodznaky;
readln;
Writeln(z1,' ',z2);
readln;
end.

Funkcie

function Názov(Parametry):VýslednyTyp;
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ázovFunkcie:=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

Program, ktorý využíva procedúry alebo funkcie, môže byť napísaný dvojako. Ukážeme si to na príklade: program Objem1; var polomer,vyska : real; function ObjemValca: real; begin ObjemValca:= pi*sqr(polomer)*vyska; end; begin Writeln('Zadaj polomer valca a vysku valca'); readln(polomer,vyska); Writeln(ObjemValca); end. alebo program Objem2; var polomer, vyska : real; function ObjemValca(Polomer,vyska : real) : real; begin objemValca := pi*sqr(polomer)*vyska; end; begin Writeln('Zadaj polomer a vysku valca'); readln(polomer, vyska); Writeln(objemValca(polomer,vyska)); Writeln(ObjemValca(polomer*2,vyska)); end. Druhý spôsob zápisu sa ukazuje ako jednoduchší, keď je potrebné použiť rovnakú procedúru pre rôzne poomery 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ť 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: Program Ukazka3; var z1,z2 :char; Procedure PrehodZnaky (x1,x2 : char); var pom : char; begin pom := x1; x1:= x2; x2 := pom; end; begin Write('Zadaj dva znaky'); readln(z1,z2); Writeln(z1,' ',z2); Prehodznaky; Writeln(z1,' ',z2); end. 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 z1, z2 sa neukáže prehodenie poradia. Problém odstránime jednoducho, pri deklarácii procedúry napíšeme vyhradené slovo var: Program Ukazka4; var z1,z2 :char; Procedure PrehodZnaky (var x1,x2 : char); var pom : char; begin pom := z1; z1:= z2; z2 := pom; end; begin Write('Zadaj dva znaky'); readln(z1,z2); Writeln(z1,' ',z2); Prehodznaky; readln; Writeln(z1,' ',z2); readln; end. 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 navrate 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 naročnejšie na pamäť.

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 cyklycký odkaz viacerých podrogramov) odkazuje sama na seba. Najprv ukážka funkcie, typickým príkladom 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! 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ázovA(parametre); forward; Potom dodefinujeme procedúru procedure NázovB (v ktorej používame NázovA). A nakoniec uvedieme samotné telo NázvuB (procedure NázovA; (tu už nemusíme vypisovať parametre...) Radšej si to ukážme na jednoduchom príklade: procedure NicNerobi(A:integer);forward; procedure NiecoRobi(A:integer); begin If A > 0 then NicNerobi(A-1); writeln(A); end; procedure NicNerobi; begin If A < 0 then NiecoRobi(A); writeln(A); end;

Procedúry bez lokálnych objektov a bez parametrov

- používajú len globálne objekty (zavedené v nadradenej časti), hovoríme aj, že komunikuje s okolım len pomocou globálnych premenných. Na mieste, kde chceme, aby došlo k vykonaniu príkazov uvedených v procedúre, stačí uviesť meno procedúry - hovoríme o tzv. volaní procedúry. Napríklad v príkazovej časti hlavného programu:

BEGIN
VSTUP;
VYMENA;
VYSTUP;
END.

Vidíme, že volanie procedúry je na úrovni príkazu (mena procedúr sme použili ako nami definované príkazy). Všetky použité premenné musia byť deklarované v úseku definícií a deklarácií hlavného programu. Ako v celom Pascale (až na malo výnimiek), aj pri podprogramoch platí, že každy objekt musí byť najprv definovaný alebo deklarovaný a až potom ho môžeme použiť.

procedure nazovprocedury;
begin
príkaz1;
príkaz2;
...
end;

Príklad:

procedure VSTUP;
begin
A := StrToInt ( InputBox (’Vstupď,’Zadaj prve cıslo: ’,’1’));
B := StrToInt ( InputBox (’Vstupď,’Zadaj druhe cıslo: ’,’2’);
end;
procedure VYMENA;
begin
POM := A; A := B; B := POM
end;

procedure VYSTUP;
begin
Label1.Caption := IntToStr (A) + ´ ´ + IntToStr (B)
end;

Procedúry s lokálnymi objektami a bez parametrov

Keď sa pozrieme na procedúru VYMENA, ľahko zistíme, že premennú POM potrebujeme len počas vykonavania tejto procedúry. Takýchto objektov môže byť viacej a nie je dôvod zaťažiť pamäť počítača počas behu celého programu vyhradením pamäťových miest objektom, ktoré používame len lokálne. Preto takéto objekty stačí definovať a deklarovať len v danej procedúre, hovoríme, že sú lokálne, čo znamená, že sú použiteľné len v danej procedúre (alebo v podriadených procedúrach).

Deklarácia procedúry slokálnymi objektami má tvar:

procedure mp;
usek definícií a deklarácií
blok
príkazová časť

kde mp je meno procedury.

Pamäťovo efektívnejšíı zápis procedúry VYMENA (s lokalnou premennou POM):

procedure VYMENA;
var POM : integer;
begin
POM := A; A := B; B := POM
end;

Volanie procedúry s lokálnymi objektami je rovnaké ako procedúry bez lokálnych objektov. Procedúra naďalej komunikuje s okolím len cez globálne premenné . Ak použ ijeme rovnaké pomenovanie pre lokálnu aj globálnu premennú, dôjde k tzv. zatieneniu globálnej premennej lokálnou premennou v danej procedure, čo znamená, že daná globálna premenná je nepoužiteľna v danej procedúre.

8. Triediace a vyhľadávacie algoritmy

Opakovanie

Teória

  1. Na čo sú vyhradené slová a direktívy?
  2. Aké časti má program a čo môžu obsahovať?
  3. Na čo sú programové jednotky a v akej časti programu sa uvádzajú?
  4. Aký je rozdiel medzi jednoduchými a štruktúrovanými premennými? Uveďte 2 príklady typov.
  5. Uveďte príkazy pre ukončenie programu, cyklus a vetvenie.

Praktické úlohy

Vytvorte programy ktoré budú obsahovať:

  1. lineárny algoritmus, napríklad súčet 2 čísel načítaných z klávesnice,
  2. vetvenie, napríklad výpočet absolútnej hodnoty čísla,
  3. cyklus, napríklad výpočet faktoriálu čísla.