pondělí 18. ledna 2010

Volání procedury hodnotou

Proceduru nemusíme volat pouze jejím jménem, k jménu můžeme přidat i vstupní hodnoty, s kterými bude procedura pracovat. Hezky to ukazuje elegantní program z Pedagogické fakulty Jihočeské univerzity:



PŘÍKLAD: Klasický problém hanojských věží je použitím rekurze řešitelný velmi elegantně a názorně:
Jsou dány tři jehly, označené čísly 1, 2 a 3. Na jehle 1 je navléknuto n plochých disků, opatřených uprostřed otvorem. Průměry disků se směrem k vrcholu jehly postupně zmenšují. Úkolem je přenést všechny disky (věž) z jehly 1 na jehlu 3, přičemž
  • současně smí být přenášen vždy pouze jediný disk
  • disk lze odložit pouze na některou z jehel
  • disk však nesmí být odložen na disk menšího průměru
Rekurzivní algoritmus řešení spočívá v těchto krocích:
je-li n = 1:
přenes tento jediný disk ze zdrojové na cílovou jehlu
jinak (n > 1):
použitím tohoto algoritmu postupně přenes n – 1 horních disků ze zdrojové na pomocnou jehlu, cílová jehla přitom slouží jako pomocná pak přenes jediný zbylý disk ze zdrojové na cílovou jehlu a nakonec použitím tohoto algoritmu postupně přenes n – 1 odložených disků z pomocné na cílovou jehlu, jako pomocná přitom slouží jehla zdrojová

{======================================================================}
program HanojskeVeze;
{======================================================================}

 var N: Byte;                            { počet disků - výška věže    }

 procedure Vez (Zdroj, Cil, Pocet: Byte);{ číslo zdrojové a cílové     }
 {--------------------------------------}{ jehly, počet přenášených    }
                                         { disků                       }
  var Pomocna: Byte;                     { číslo pomocné jehly         }

 begin { Vez }
  if Pocet = 1 then                      { přenos jediného disku       }
   Writeln(Zdroj, '-', Cil)
  else                                   { přenos více disků           }
   begin
    Pomocna := 6 - Zdroj - Cil;          { výpočet čísla pomocné jehly }
    Dec(Pocet);                          { počet disků odkládaných na  }
                                         { pomocnou jehlu              }
    Vez(Zdroj, Pomocna, Pocet);          { odložení na pomocnou jehlu  }
    Writeln(Zdroj, '-', Cil);            { přenos zbývajícího disku    }
    Vez(Pomocna, Cil, Pocet)             { přenos odložených disků     }
   end
 end; { Vez }

begin { program }
 Writeln;                                { výpis titulku               }
 Writeln('HANOJSKÉ VĚŽE');
 Writeln;
 repeat                                  { načtení výšky věže          }
  Write('Počet disků (> 0): ');
  Readln(N)
 until N > 0;
 Writeln;
 Vez(1, 3, N);                           { přenos celé věže z jehly 1  }
                                         { na jehlu 3                  }
 Writeln
end. {program}
 
zdroj: http://home.pf.jcu.cz/~edpo/program/kap05.html 
 
 

souhrn:
název procedury:
procedure Nazev (promenna1, promenna2, promenna3...: typ);
 
volání procedury:
 nazev(promenna1, promenna2, promenna3...);
 
 

Žádné komentáře:

Okomentovat