MFF UK / Ústav teoretické fyziky / Tomáš Ledvinka
Přednášky
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
  Úvod
  Programy a algoritmy
  Píšeme program
  Píšeme program II
  Procedury a funkce
    Procedury a funkce
    Příklad funkce
    Makro nebo podprogram?
    Procedury a struktura prog.
    Lokální proměnné
    Hodnotou či odkazem?
    Pravidla a dokumentace
  Malujeme funkce
  Chyby. Typy I.
  Typy II. Pole a Záznamy
  Pole II.Řetězce.Soubory.
  Gnuplot.Interpolace...
  Matice. Velké O...
  Fronta,Zásobník. Postscript
  Bin. soubory, ...
  Ukazatele,Objekty, ...
Počítačová algebra
Klasická elektrodynamika (2.r)
Vybrané partie OTR

Cvičení
. . . . . . . . . . . . . . . . . . . . . . . . . .
Programování pro fyziky (1.r)
Teoretická mechanika (2.r)
Klasická elektrodynamika (2.r)


Věda
. . . . . . . . . . . . . . . . . . . . . . . . . .
Diskové zdroje v OTR
Hyperbolické systémy v OTR


Kontakt
. . . . . . . . . . . . . . . . . . . . . . . . . .
Email
Konzultační hodiny


Ostatní
. . . . . . . . . . . . . . . . . . . . . . . . .
Mallorca
Ze společnosti
Euklidův algoritmus jako funkce

Jako příklad budiž zmíněn opět Euklidův algoritmus. Co kdybychom chtěli spočíst nějvětší společný dělitel tří čísel? Jak? Co takhle spočíst NSD třetího čísla a NSD prvních dvou čísel? ..... Pak by zřejmě nebylo od věci moci zapsat celý postup třeba takto:

vysledek := GCD( c, GCD(a,b) );
Aby nám překladač rozumněl, musíme mu oznámit, že
 1.   GCD je identifikátor funkce
 2.   funkce GCD má dva celočíselné parametry
 3.   funkce GCD vrací jako výsledek celé číslo
 4.   Aby to fungovalo, musíme také říci jak se má ze vstupních
      hodnot vyrobit výsledek (jakýsi malý program).

V jazyce Pascal se to provede tak, že v deklaracích bloku, ve kterém chceme tuhle funkci použít, spolu s proměnnými a konstantami, deklarujeme ještě fukci.
 

   function GCD(a,b : integer) : integer;
   var c:integer;
   begin
     repeat
        c := a mod b;
        a := b;
        b := c; { (a,b) := (b,a mod b); }
     until b=0;
     GCD := a;
   end;  {function GCD}
Časem si nakreslíme syntaktický diagram, ale i bez něj rozpoznáváme jasnou strukturu Hlavička-Deklarace-Složený Příkaz, jakou má pascalský program. Z kódu je jasně vidět, že použití identifikátorů a,b se neodlišuje od použití identifikátoru proměnné c. Na rozdíl od proměnných mají ale a a b na začátku přiřazené hodnoty. Pokud bychom funkci GCD použili například takto:
   n := GCD(44,55) ;
bude na začátku provádění příkazů těla funkce mít a hodnotu 44 a b hodnotu 55. Proměnná c bude mít hodnotu nedefinovanou. Proto její hodnota nesmí být užita dříve, než jí bude nějaká přiřazena.

Takto pak vypadá celý kód programu:

program GCD3;

const a = 26112;
      b = 75548;
      c = 45288;

var   n : integer;

function GCD(a,b : integer):integer;
   {Vrací NSD dvou kladných čísel}
   var c:integer;
   begin
     if (a<=0) or (b<=0) then {oznam chybu a skonci}
     begin
        Writeln('Funkce GCD(', a, ',', b, ') : Neplatne parametry!');
        Halt;
     end;

     repeat
        c := a mod b;
        a := b;
        b := c;
     until b=0;
     GCD := a;
   end;  {konec deklarce funkce GCD}

begin
   n := GCD( a, GCD(b,c) ) ;

   Writeln('Nejvetsi spolecny delitel cisel ', a,' ',b,' ',c,' je ',n,' nebot:');

   Writeln(a,' = ',a div n,'*',n);
   Writeln(b,' = ',b div n,'*',n);
   Writeln(c,' = ',c div n,'*',n);

   Readln;
end.


.