Umíte pascalsky - 9.lekce ...

Umíte pascalsky?
9.lekce
Vytisknout  

Podprogramy

     Při systematické tvorbě algoritmu určité úlohy - rozkladem úlohy na jednodušší podúlohy - často zjistíme, že:
1) Některá podúloha se bude opakovaně řešit s různými hodnotami.
2) Celá úloha je složitá, nepřehledná, málo srozumitelná.
To jsou důvody pro vytvoření podprogramu. Algoritmus podúlohy rozepíšeme pouze jednou, přiřadíme mu jméno a při řešení ostatních podúloh se na toto jméno odvoláváme.

Podprogram je posloupnost příkazů, které jsou někde popsány (v deklaraci) a které lze jinde (v těle programu) i opakovaně jednoduše použít.

Zápis, kterým zavádíme (definujeme) podprogram se nazývá deklarace podprogramu. Použití podprogramu se provádí pomocí výzvy - volání podprogramu - na místě, kde se vyžaduje realizace odpovídajícího algoritmu.

V Pascalu existují dvě formy podprogramů - procedury a funkce.
Funkce je podprogram pro výpočet jedné hodnoty, hodnoty funkce.
Procedura je podprogram, který vrací hlavnímu programu více hodnot nebo nějakým způsobem transformuje data.

Procedura

Deklarace procedury se skládá (podobně jako program) z hlavičky a těla procedury:

procedure Jméno_procedury;
   deklarace lokálních objektů;
begin
  příkazy;                 {tělo procedury}
end;

V deklarační části jsou deklarovány objekty platné pouze v těle procedury - lokální objekty, které existují pouze po dobu provádění této procedury. V těle procedury však můžeme používat i objekty deklarované v hlavním programu - globální objekty. Pomocí nich procedura komunikuje s okolím (hlavním programem), pokud nemá parametry - procedura s parametry bude na programu příště.

Volání procedury - příkaz procedury - se skládá pouze ze jména procedury:

Jméno_procedury;

V místě volání procedury se budou realizovat příkazy obsažené v těle procedury.

Příklad: Ukážeme si deklaraci procedury pro výměnu dvou proměnných a její vyvolání v hlavním programu.

program Ukazka_vymeny;

  var prvni,druha : real;


{Deklarace globálních proměnných}

 procedure Vymena;
   var pomoc:real;
  begin
    pomoc:=prvni;
    prvni:=druha;
    druha:=pomoc;
  end;
{Deklarace procedury}
{Deklarace lokálních proměnných}


{Tělo procedury}



Begin

{Hlavní program}
   writeln('Zadejte dve cisla'); {Napíše výzvu k zadání}
   readln(prvni,druha);    {Načte první a druhé číslo}
   writeln(prvni,druha); {Vytiskne zadaná čísla}
   Vymena; {Vyvolá procederu pro výměnu čísel}
   writeln(prvni,druha); {Vytiskne vyměněná čísla}
End.

Poznámky:
1) Procedury bez parametrů se volají v hlavním programu většinou poze jednou - používají se pro zvýšení přehlednosti
2) Nepoužívejte lokálních proměnných stejného jména jako je jméno globální proměmmé. V okamžiku realizace procedury existující lokální proměnná zastiňuje (činí nepřístupnou) odpovídající globální proměnnou stejného jména.

Příklady:

Příklad1:
Sestavte program, který dvě zadaná celá čísla seřadí podle velikosti (vzestupně) a vytiskne. Řešte užitím procedur.

Myšlenka (hrubý algoritmus):
Úlohu rozložíme na tři podúlohy:
Nacteni;
Serazeni;
Tisk;
Stejně se budou jmenovat procedury, které budou řešit tyto podúlohy a jejichž postupným vyvoláním vyřešíme celou úlohu.

Program by mohl vypadat takto:

program Serad_dvojku;

  var cislo1, cislo2: integer;

{Deklarace globálních proměnných}

  procedure Nacteni;

{Deklarace procedury Nacteni}
   begin
    writeln('Zadejte dvě celá čísla:'); {Napíše výzvu k zadání}
    readln(cislo1,cislo2);    {Načte čísla}
   end;

  procedure Serazeni;

{Deklarace procedury Serazeni}
   var Pomoc : integer; {Deklarace lokálních proměnných}
   begin
    if cislo1 > cislo2 then
      begin
        Pomoc := cislo1;
        cislo1 := cislo2;
        cislo2 := Pomoc;
      end
{Je-li první číslo větší}
{vymění je}
   end;

  procedure Tisk;

{Deklarace procedury Tisk}
   begin
    writeln('Serazena cisla jsou:' , cislo1,',',cislo2); {Vytiskne seřazená čísla}
   end;

Begin

{Hlavní program}
  Nacteni;
  Serazeni;
  Tisk;

{vyvolání procedur}
End.



Domácí úkol:

    Sestavte program Cas, který umožňuje zadat dva časy (první v sekundách, druhý v hodinách, minutách a sekundách) a vytisknout je podle velikosti sestupně poprvé v sekundách a podruhé v hodinách minutách a sekundách. Použijte procedury Na_sekundy (převod času na sekundy) a Na_hodiny (převod času na hodiny,minuty a sekundy).

On-line účast na řešení úkolu

Řešit úkol Prohlídka hodnocení úkolu Dotazy,připomínky

Pomocí volby Řešit můžete (po přihlášení) odeslat vaše řešení domácího úkolu (každý úkol smíte řešit jen jednou). Volbou Hodnocení si přečtete hodnocení a komentář od vyučujícího. Dotaz nebo připomínku můžete opakovaně zasílat pomocí tlačítka Dotazy, Komunikace (na levém okraji) zobrazuje příklad možné komunikace s vyučujícím.