Umíte pascalsky - 11.lekce ...

Umíte pascalsky?
11.lekce
Vytisknout  

Procedury s parametry

Používáme tehdy, když potřebujeme několikrát provádět týž algoritmus, ale pokaždé pro jiné proměnné, jiné objekty. Údajům, které se mají při různých provedeních procedury měnit, říkáme parametry procedury. Parametry, s kterými se má procedure skutečně provádět, se používají až při volání procedury a nazývají se skutečné parametry. V okamžiku deklarace procedury skutečné parametry neznáme a tělo procedury tedy píšeme s použitím tzv. formálních parametrů. Je třeba znát jejich počet a některé jejich vlastnosti, které uvedeme do specifikace parametrů a způsob náhrady formálních parametrů skutečnými. Tato náhrada může být hodnotou nebo odkazem ( existují další možnosti jako schéma konformního pole, procedurální a funkční parametry - snad někdy příště).

Náhrada hodnotou - formání parametr představuje v těle procedury lokální proměnnou, které se na začátku provádění procedury přiřadí hodnota skutečného parametru. Hodnoty takto do procedury vnášíme, ale nelze vyvážet, hodnota skutečného parametru se vně procedury nezmění. Používáme tedy pro vstupní hodnoty procedur.
Náhrada odkazem (referencí) - formální parametr je nahražen v těle procedury globální proměnnou, která je udána skutečným parametrem. Tuto proměnnou můžeme aktivně využívat a její změny jsou platné nejen v proceduře, ale i mimo ni. Takto hodnoty z procedury vyvážíme - používáme pro výstupní hodnoty procedur. Lze použít i pro vstupní hodnoty, ale změna hodnoty v těle procedury se přenaší i mimo tuto proceduru.

Deklarace procedury s parametry se liší od deklarace procedury bez parametrů pouze hlavičkou:

procedure Jméno_procedury ( specifikace_form_parametru1 ; specifikace_form_parametru2 ; specifikace_form_parametru3 );

Specifikaci formálního parametru se liší podle způsobu náhrady.

Specifikace formálního parametru nahrazovaného hodnotou má tvar:        jmeno_parametru : typ parametru;

Specifikace formálního parametru nahrazovaného odkazem (referencí) má tvar:        var jmeno_parametru : typ parametru;

Příklad:
Pocitej ( cislo:integer ; koeficient:real );        procedura Pocitej má dva vstupní parametry cislo a koeficient
Ukaz ( co:char ; var kde:integer ):        procedura Ukaz má vstupní parametr co a výstupní kde

Volání procedury - příkaz procedury - se skládá ze jména procedury a seznamu skutečných parametrů:

Jméno_procedury ( skutečný_parametr1 ; skutečný_parametr2 ; skutečný_parametr3 );

Příklad: Ukážeme si deklaraci procedury (formální parametr nahrazovaný hodnotou - vstupní parametr) pro nakreslení čáry (z písmen x) zadané délky a její použití pro nakreslení šipky složené ze tří čar dvou zadaných délek.

xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx


program Sipka;

  var delka1, delka2 : integer;


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

 procedure Cara (delka_cary:integer);
   var pocitej: integer;
  begin
     for pocitej:=1 to delka_cary do
         write('x');
     writeln;
  end;
{Formální parametr delka_cary}
{Deklarace lokálních proměnných}

{Tělo procedury}




Begin

{Hlavní program}
   writeln('Zadejte dve cela cisla - delky car:'); {Napíše výzvu k zadání délek čar}
   readln(delka1,delka2);    {Načte dvě délky čar}
   Cara(delka1); {Vyvolá proc. Cara pro délku delka1}
   Cara(delka2); {Vyvolá proc. Cara pro délku delka2}
   Cara(delka1); {Vyvolá proc. Cara pro délku delka1}
End.


V 8.lekci jsme si ukazovali proceduru Vymena bez parametrů. Ta měla velkou nevýhodu v tom, že dokázala vyměnit pouze proměnné prvni a druha. Ukážeme si deklaraci a vyvolání procedury Lepsi_vymena, která umí opakovaně vyměnit různé proměnné - s využitím parametru nahrazovaného odkazem.

Příklad: Sestavte program Nejvetsi_na_konec, který po zadání tří celých čísel největší z nich pomocí dvou porovnání a eventuálních výměn přemístí na konec.

Myšlenka (hrubý algoritmus):
Načteme tři čísla
Je-li první větší než druhé, vyměníme je
Je-li druhé větší než třetí, vyměníme je
Vytiskneme

program Nejvetsi_na_konec;

  var prvni,druhe, treti : integer;


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

 procedure Lepsi_vymena (var leve,prave: integer);
   var pomoc: integer;
  begin
    pomoc := leve;
    leve := prave;
    prave := pomoc;
  end;
{Deklarace procedury}
{Deklarace lokálních proměnných}


{Tělo procedury}



Begin

{Hlavní program}
   writeln('Zadejte tři čísla'); {Napíše výzvu k zadání}
   readln(prvni,druhe,treti);    {Načte první,druhé a třetí číslo}
   if prvni > druhe then
{Porovná první dvě čísla}
         Lepsi_vymena(prvni,druhe); {Nejsou-li vzestupně, vymění je}
   if druhe > treti then
{Porovná druhé a třetí číslo}
         Lepsi_vymena(druhe,treti); {Nejsou-li vzestupně, vymění je}
   writeln(prvni,',',druhe,',',treti); {Vytiskne výsledná čísla}
End.


Příklady:

Příklad1:
Máme k disposici pětikoruny, dvoukoruny a koruny. Sestavte program, který opakovaně podle volby uživatele umožňuje zadat částku (v celých korunách), zjistit počet pětikorun, dvoukorun a korun na její vyplacení a celkový počet mincí. Řešte užitím procedur s parametry nahrazovanými odkazem.

Myšlenka (hrubý algoritmus):

Úlohu můžeme rozložit na tři podúlohy:
Nacteni;      (načtení částky)
Na_drobne;        (zjištění počtu mincí)
Celkem_minci;       (zjištění celkového počtu mincí)
které nadeklarujeme formou procedur a pak se budou opakovaně vyvolávat podle volby uživatele v hlavním programu:

opakuj
    nabídka činnpostí
    výběr činnosti
    provedení zvolené činností (Nacteni , Na_drobne , Celkem_minci)

Výsledný program může vypadat takto:

program Skrblik;

  var castka, petky, dvojky, koruny, celkem, volba : integer;


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

 procedure Nacteni (var cast:integer);
  begin
     writeln('Zadejte castku:');
     readln(cast);
  end;
{vstupne vystupni - cast}


{Tělo procedury}



 procedure Na_drobne (castka:integer; var pet, dvoj, kor:integer);
  var zbytek: integer;
  begin
     pet:= castka div 5;
     zbytek:= castka mod 5;
     dvoj:= zbytek div 2;
     kor:= zbytek mod 2;
     write('Petikorun:' , pet , ', dvojkorun:', dvoj);
     writeln(' a korun :' , kor);
  end;
{vstupni - castka}
{vystupni - pet, dvoj, kor}




{Tělo procedury}





 procedure Celkem_minci (pe, dvo, ko:integer; var celk:integer);
  begin
     celk:= pe + dvo + ko;
     writeln('Celkový pocet minci :' , celk);
  end;
{vstupni - pe, dvo, ko}
{vystupni - celk}

{Tělo procedury}


Begin

{Hlavní program}
 Repeat
   writeln('Program Skrblik umoznuje:');
   writeln('1 ... zadat castku');
   writeln('2 ... pocty minci');
   writeln('3 ... celkem minci');
   writeln('0 ... ukoncit');
   writeln('Zadejte svoji volbu:');
   readln(volba);
   case volba of
     1: Nacteni(castka);
     2: if castka > 0 then
                   Na_drobne(castka,petky,dvojky,koruny)
               else
                   writeln('Zadej nejdrív castku!');
     3: if petky + dvojky + koruny > 0 then
                   Celkem_minci(petky,dvojky,koruny,celkem)
               else
                   writeln('Zjisti nejdrív pocty minci!');
     0: writeln('Nashledanou');
   end;
 until volba = 0;
{opakuj}
    {nabídka činností}





    {vvýběr činnosti}
    {provedení zvolené činnost}


       








End.



Domácí úkol:

    Sestavte program Delitele, který opakovaně podle volby uživatele umožňuje zadat přirozené číslo (procedura s parametrem Nacti), určit dolní a horní mez (od - do) pro hledání dělitelů zadaného čísla (procedura Zadej_meze s parametry) a napsat všechny dělitele zadaného čísla v určených mezích (procedura Delitele_cisla s parametry).

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.