Abstraktní datové typy ---------------------- Datový typ = hodnoty, operace Algoritmy + Datové struktury = Programy prioritní jsou datové struktury, jsou modelem reality Popis abstraktního typu ----------------------- Hodnoty -> popis pomocí formalismu (např. matematický) Operace -> syntax, sémantika Implementace abstraktního typu ------------------------------ Prvky v jazyce Pascal - procedury a funkce, programové moduly, dynamické datové struktury s obecnými ukazateli, datový typ podprogram Moduly: struktura, využití. Implementace abstraktního typu pomocí modulu unit seznam; interface type Prvek = pointer; PClen = ^Clen; Clen = record data: Prvek; dalsi: PClen end; TSeznam = record UkPrvni: PClen; Pocet: word end; TVetsi = function (A,B: Prvek):boolean; procedure Init(var L: TSeznam); function Empty(L: Tseznam): boolean; procedure Add(var L: TSeznam; D: Prvek); procedure Remove(var L: TSeznam; var D: Prvek); procedure Compare(L: TSeznam; var D: Prvek); var Vetsi: TVetsi; implementation procedure Error; begin { řešení podle implementace } end; procedure Init(var L: TSeznam); begin UkPrvni:=nil; Pocet:=0; end; function Empty(L: Tseznam): boolean; begin Empty:=Pocet=0; end; procedure Add(var L: TSeznam; D: Prvek); var Pom: PClen; begin new(Pom); Pom^.data:=D; Pom^.dalsi:=L.UkPrvni; L.UkPrvni:=Pom; Inc(Pocet); end; procedure Remove(var L: TSeznam; var D: Prvek); var Pom:PClen; begin if not Empty(L) then begin Pom:=L.UkPrvni; D:=L.UkPrvni^.data; L.UkPrvni:=L.UkPrvni^.dalsi; dispose(Pom); Dec(Pocet) end else Error; end; procedure Compare(L: TSeznam; var D: Prvek); begin case L.Pocet of 0: Error; 1: D:=L.UkPrvni^.data; 2: if Vetsi(L.UkPrvni^.data, L.UkPrvni^.dalsi^.data) then D:=L.UkPrvni^.data else D:=L.UkPrvni^.dalsi^.data; end end; end. ------------------------------- Použití: program UzijModul; uses Seznam; var R: string; S: Tseznam; P: Pointer; function Porovnej(A,B:Prvek):Boolean; begin Porovnej:=string(A^)>string(B^); end; function Porovnej2(A,B:Prvek):Boolean; begin Porovnej:=longint(A^)>longint(B^); end; begin Init(S); while not eof do begin readln(R); GetMem(P,Length(R)+1); string(P^):=R; Add(S,P) end; Vetsi:=Porovnej; Compare(S,P); writeln('Větší z posledních dvou je ', string(P^)); while not Empty(S) do begin Remove(S,P); writeln(string(P^)); end; end.