Datový typ record

Kromně základních datových typů (integer,real,boolean,char,string) a polí umožňuje Pascal definici typu record, který umožňuje sdružit několik proměnných jednoduššího typu do jednoho komplexnějšího typu.

Příklad - souřadnice bodu v prostoru

Typ pro uložení bodu ve 3D můžeme v Pascalu definovat například takto:

	type TBod = record
			x,y,z: real;
		    end;
	

Proměnnou potom definujeme jako:

	var A: TBod;
	

Poté můžeme s jednotlivými složkami pracovat, jako s "obyčejnými" proměnnými - abychom specifikovali část proměnné A se kterou zrovna chceme pracovat, používáme operátor "." (tečka):

	...
	A.x := 8.54;   {nastav x-ovou souřadnici}
	A.y := 3.2;    {nastav y-ovou souřadnici}
	A.z := ...

Jako příklad jsme programovali funkci

function distance(A,B: TBod): real;

pro výpočet euklidovské vzdálenosti mezi dvěma body v prostoru.

Rekurze

Jde o přístup k řešení problémů založený na metodě rozděl a panuj. Ilustrativní příklad představuje například počítání ztrát po bitvě (volný pseudokód):

type TVojak = record
		pod: mnozina; { podrizeni }
                zivy: boolean;
	      end;

sectiZtraty(v: TVojak): integer;

{ pokud mam podrizene }
if |v.pod| > 0 then
    { pamatuju si prubezny soucet  }
    sum:=0;
    { kazdemu rozkazu at si spocita vlastni ztraty }
    for p in v.pod do
       { updatuju prubezny vysledek }
       inc(sum,sectiZtraty(p));
    
    { Celkovy vysledek je soucet podvysledku. }
    sectiStraty := sum;
    exit;
else
    { pokud jsem jen radovy pesak }
    if v.zivy then
       { nahlasim 0 kdyz ziju }
       sectiZtraty:=0
    else
       { nahlasim 1 kdyz neziju }
       sectiZtraty:=1;

Pokud do proměnné v dosadíme generála armády a provedeme vše podle návodu, generál by měl po skončení výpočtu vědět výsledný počet padlých. Příklad není pěkný ani realistický, ale může vám pomoct pochopit základní princip rekurze.

V principu by měly všechny rekurzivní funkce v nějaké formě obsahovat následující komponenty:

  1. test triviality - pokud je s danými parametry řešení triviální (např. pokud ztráty počítá obyčejný vojín bez podřízených), nedochází k rekurzivnímu volání a funkce by měla vrátit rovnou výsledek
  2. iterace možností - pokud řešení není triviální (ztráty počítá např. desátník), je třeba provést rekurzivní volání se všemi validními parametry (vydat rozkaz všem podřízeným)

Skákající žáby

Například logická hříčka s žábami, kterou jsme řešili na prvním cvičení se dá řešit rekurzivně.

Domácí úkol

Domácí úkol je tentokrát za 30 bodů. Úloha má název Všechny permutace řetězce. Pomocí rekurze je možné ji snadno vyřešit.