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.