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
  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, ...
    Neúplné vyh. log. výrazů
    Parametr typu funkce
    Otypované soubory
    Binární soubory
    Dyn. datové struktury
  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

Parametr typu procedura a funkce

Předpokládejme, že píšeme modul pro tříděni. Řekněme, že již víme, jaký algoritmus použít i jak psát modul. Když ale začneme psát, zjistíme, že nám něco chybí - možnost napsat modul tak, aby nemusel vědět jaká data vlastně třídí, případně aby mohla tatáž procedura třídit seznamy různých typů. To proto, že když chce procedura pracovat s nějakými daty, musí v Pascalu znát jejich typ.

Jedním z řešení je předpokládat, že ten, kdo bude chtít třídit, místo dat pošle proceduře pro třídění jako parametry něco jiného než samotná data. Třeba jen odkaz na procedury, jednu která porovná j-tý a k-tý prvek a druhou, co je na požádání přehodí.

Zde je příslušný modul:

unit Tridicka;

interface

type tPorovnaciFunkce = function( j,k : integer ) : integer;
     tPrehazovaciProcedura = procedure( j,k : integer );

procedure Setrid(Porovnej:tPorovnaciFunkce; Prehod:tPrehazovaciProcedura;l,r:integer);

implementation

procedure Setrid(Porovnej:tPorovnaciFunkce; Prehod:tPrehazovaciProcedura;l,r:integer);
var  i, j, k_rozhod : Integer;
begin
  k_rozhod := (l + r) div 2;

  i := l; j := r;
  while i<j do begin
    while Porovnej(i,k_rozhod)<0 do i:=i+1;
    while Porovnej(k_rozhod,j)<0 do j:=j-1;
    if i <= j then begin
      Prehod(i,j);
      if i=k_rozhod then k_rozhod:=j
      else if j=k_rozhod then k_rozhod:=i;

      i:=i+1; j:=j-1;
    end;
  end;
  if l < j then Setrid(Porovnej, Prehod, l, j);
  if i < r then Setrid(Porovnej, Prehod, i, r);
end;

end.

A zde je program, který modul používá k setřídění pole reálných čísel.

program tridtest;
uses Tridicka;


var Data : array [0..220000] of real;

function PorovnejData( i,j : integer ) : integer;
{musi se shodovat s type tPorovnaciFunkce = function( j,k : integer ) : integer;}
begin
  if Data[i]<Data[j]      then PorovnejData := -1
  else if Data[i]=Data[j] then PorovnejData := 0
                          else PorovnejData := +1;
end;

procedure PrehodData( i,j : integer );
{musi se shodovat s type tPrehazovaciProcedura = procedure( j,k : integer );}
var s : real;
begin
  s       := Data[i];
  Data[i] := Data[j];
  Data[j] := s;
end;

var i : integer;

begin
  for i :=Low(data) to High(data) do data[i]:=random;
  Setrid(PorovnejData, PrehodData, Low(Data) , High(data) );
  for i :=Low(data)+1 to High(data) do if data[i-1]>data[i] then writeln('NESETRIDENO !');
  Writeln('OK');
  readln;
end.

Těžiště příkladu je na řádcích obsahujících slovo Setrid

deklarace: 
   procedure Setrid(Porovnej:tPorovnaciFunkce; Prehod:tPrehazovaciProcedura;l,r:integer);

volání: 
   Setrid(PorovnejData, PrehodData, Low(Data) , High(data) );

a v deklaraci typů

type tPorovnaciFunkce = function( j,k : integer ) : integer;
     tPrehazovaciProcedura = procedure( j,k : integer );

kde překladači sdělujeme, že se má naučit tyto dva typy, neboť je použijeme jako typy formálního argumnetu. Všimnětě si, že typy se liší od deklarace procedury či funkce jen vynecháním jejícho identifikátoru. Protože je formální parametr Porovnej deklarován s typem tProvnavaciFunkce, ví překladač, co má udělat, když narazí na výraz

Porovnej(i,k_rozhod)

Ilustrace (na přednášce) : krokování programem, ladění

Cvičení: Změňte výše uvedený program tak aby generoval pole 20 náhodných komplexních čísel a pak jej vytiskněnte seřazené podle
a) hodnoty reálné části
b) hodnoty imaginární části
c) velikosti
d) argumentu
Modul Tridicka samozrejme nemente!

.