Umíte pascalsky - 12.lekce ...

Umíte pascalsky?
12.lekce
Vytisknout  

Funkce s parametry

Pokud potřebujeme několikrát provádět týž algoritmus, který počítá hodnotu určitého typu, ale pokaždé pro jiné proměnné, použijeme funkci s parametry. Stejně jako u procedur, skutečné parametry požíváme při volání funkce a formální prametry při deklaraci funkce.Specifikace parametrů a způsob náhrady formálních parametrů skutečnými se se řídí stejnými pravidly jako u procedur s parametry s jediným rozdílem - náhrada se provádí (až na vyjímky) hodnotou.
Připomínáme ještě, že tělo funkce musí obsahovat přiřazovací příkaz, kterým se vypočtená hodnota přiřazuje identifikátoru funkce.

Deklarace funkce s parametry má tedy tvar:

function Jméno_funkce (specifikace_form_param1; specifikace_form_param2; specifikace_form_param3):typ funkce;
   deklarace lokálních objektů;
begin
  příkazy;                                                                       {výpočet hodnoty}
  Jméno_funkce := vypočtená hodnota;                 {povinné přiřazení}
end;

Specifikaci formálního parametru (až na vyjímky neobsahuje var) vypadá:

jmeno_parametru : typ parametru;

Příklad:

function Soucet (cislo1,cislo2:integer): integer            {dva vstupní parametry cislo1 a cislo2}
begin
  Soucet := cislo1 + cislo2;                                                {vypočte součet zadaných číse}
end;

Volání funkce - zápis funkce - se skládá ze jména funkce a seznamu skutečných parametrů.
Připomínáme. že volání funkce představuje hodnotu, která je výsledkem provedení těla funkce a proto může být použito vždy v nějaké konstrukci, která předepisuje, co se s výslednou funkční hodnotou provede - v příkazu přiřazení, příkazu tisku, ve výrazu apod. (ne samostatně na řádku jako volání procedury!!!)
Tedy například:

cislo := Jméno_funkce(( skutečný_parametr1, skutečný_parametr2, skutečný_parametr3 );
write{Jméno_funkce (skutečný_parametr1, skutečný_parametr2, skutečný_parametr3));

Příklad: Sestavte program Dalsi_obdelnik, který po zadání stran dvou obdélníků vypočítá jejich obsahy a zjistí, zda tyto obsahy patří do zadaného otevřeného intervalu.

Myšlenka (hrubý algoritmus):
Načteme meze intervalu
Načteme délky stran dvou obdélníků
Vypočteme jejich obsah (Obsah)
Otestuje (patří do intervalu? - Test) a vytiskneme zprávu

program Dalsi_obdelnik;

  var dolni, horni :integer;
         delka1,sirka1,delka2,sirka2,plocha : real;


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

 function Obsah (a , b: real) : real;
  begin
    Obsah := a * b;
  end;
{Deklarace funkce s parametry}
{Tělo procedury}


 
 function Test (dol, hor:integer; obs:real) : boolean;
  begin
    Test := (obs > dol) and (obs < hor);
  end;
{Je-li obsah>dol a zároveň obsah<hor}
{-obsah patří do daného intervalu-}
{pak má výraz vpravo hodnotu true}
{ a bude ji mít také funkce Test}

Begin

{Hlavní program}
  writeln('Zadejte meze intrevalu (cela cisla):');
  readln(dolni,horni);   
  writeln('Zadejte deku a sirku dvou obdelníku:');
  readln(delka1,sirka1,delka2,sirka2);   
{Načte meze intervalu}

{Načte rozměry obdélníků}
  Plocha := Obsah(delka1,sirka1);
  write('První obdelník');
{Vypočte obsah}

  if (Test(dolni,horni,Plocha)) then
{Otestuje obsah}
         writeln(' splnuje')
    else
         writeln(' nesplnuje');
  write('Druhý obdélník');
{a vytiskne zprávu}
  if (Test(dolni,horni,Obsah(delka2,sirka2))) then
         writeln(' splnuje')
    else
         writeln(' nesplnuje');
{U druhého obdélníku jinak -}
{ušetříme proměnnou a přiřazení}

End.


Příklady:

Příklad1:
Sestavte program Kalkulačka, který opakovaně podle volby uživatele umožňuje zadat přirozené číslo a potom vypočítat jeho faktoriál, zadanou celou mocninu a ciferný součet. Řešte užitím procedur a funkcí s parametry.

Myšlenka (hrubý algoritmus):

Úlohu můžeme rozložit na čtyři podúlohy:
Nacteni
Faktorial
Mocnina
Cifr_soucet
které nadeklarujeme formou procedur a funkcí s parametry a pak se budou opakovaně vyvolávat podle volby uživatele v hlavním programu:

opakuj
    nabídka činností
    výběr činnosti
    provedení zvolené činností (Nacteni , Faktrorial , Mocnina, Cifr_soucet)

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

program Kalkulacka;

  var cislo, stupen, volba : integer;


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

 procedure Nacteni (var cis:integer);
  begin
     writeln('Zadejte prirozene cislo:');
     readln(cis);
  end;
{Načtení čísla}




 function Faktorial (cisilko:integer):longint;
  var soucin,nasob: longint;
  begin
     soucin:=1;
     nasob:=cisilko;
     while nasob > 1 do
       begin
        soucin := soucin * nasob;
        nasob := nasob - 1;
       end;
    Faktorial := soucin;
  end;
{výpočet faktoriálu}

{jedničku násobíme opakovaně}
{o jedničku se zmenšujícím činitelem nasob}
{od cisla do 1, tou už násobit nemusíme}



 function Mocnina (zaklad,exponent:integer):longint;
  var kolikrat,soucin: longint;
  begin
     soucin:= 1;
     kolikrat:= 0;
     while kolikrat < exponent do
       begin
        soucin := soucin * zaklad;
        kolikrat := kolikrat + 1;
       end;
    Mocnina := soucin;
  end;
{výpočet mocniny}

{jedničku násobíme opakovaně základem}
{dokud počet násobení - kolikrát - je menší}
{než zadaný exponent}


 function Cifr_soucet (numer:integer):integer;
  var soucet, cifra: integer;
  begin
     soucet := 0;
     repeat
        cifra := numer mod 10;
        numer := numer div 10;
        soucet := soucet + cifra;
     until numer = 0;
     Cifr_soucet := soucet;
  end;
{ciferný součet}


{zadané číslo postupně celočíselně dělíme deseti}
{dokud je podíl kladný}
{a zbytky po dělení tvoří cifry výsledného čísla,}
{které sčítáme}




Begin

{Hlavní program}
 Repeat
   writeln('Program Kalkulacka umoznuje:');
   writeln('1 ... zadat cislo');
   writeln('2 ... vypocet faktorialu');
   writeln('3 ... vypocet mocniny');
   writeln('4 ... vypocet cifer.souctu');
   writeln('0 ... ukoncit');
   writeln('Zadejte svoji volbu:');
   readln(volba);
   case volba of
     1: Nacteni(cislo);
     2: writeln('Faktorial je ',Faktorial(cislo));
     3: begin
            writeln('Zadejte exponent:');readln(stupen);
            writeln('Mocnina je ', Mocnina(cislo,stupen))
        end;
     4: writeln('Ciferny soucet je ',Cifr_soucet(cislo));
     0: writeln('Nashledanou');
   end;
 until volba = 0;
{opakuj}
    {nabídka činností}





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


       








End.



Domácí úkol:

    Sestavte program Uhel, který opakovaně podle volby uživatele umožňuje zadat úhel v radiánech (procedura s parametrem Nacti_rad), zjistit jeho základní velikost (funkce s parametrem Zakl_rad), převést na stupňovou míru (funkce s parametrem Na_stupne), zadat úhel ve stupňové míře (procedura s par.Nacti_stupne) , zjistit jeho základní velikost (procedura Zakl_stupne) a převést na radiány (funkce s par. Na_rad).

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.