27.Prednaska/Cvicenie0: Rozdiel medzi revíziami
Riadok 43: | Riadok 43: | ||
1. Z textového súboru slovnik.txt (dvojice slov: slovenské anglické - bez diakritiky). vytvoriť usporiadaný zoznam podľa anglického slova. Do triedy TSlovnik (spájaný zoznam) dodefinujte metódy na načítanie zo súboru a tiež na zápis do súboru, slová do zoznamu pridávajte metódou Zarad, ktorá zaradí dvojicu slov na správne miesto do slovníka, aby bol stále usporiadaný podľa anglického slova. | 1. Z textového súboru slovnik.txt (dvojice slov: slovenské anglické - bez diakritiky). vytvoriť usporiadaný zoznam podľa anglického slova. Do triedy TSlovnik (spájaný zoznam) dodefinujte metódy na načítanie zo súboru a tiež na zápis do súboru, slová do zoznamu pridávajte metódou Zarad, ktorá zaradí dvojicu slov na správne miesto do slovníka, aby bol stále usporiadaný podľa anglického slova. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | {{Nadpis| 27. Cvičenie}} | ||
+ | [[27.Prednaska|< 27.Prednáška]] | [[27.Prednaska/Ulohy|riešené úlohy]] | ||
+ | |||
+ | |||
+ | |||
+ | === Rozcvička === | ||
+ | |||
+ | PVrchol = ^TVrchol; | ||
+ | TVrchol = record | ||
+ | Info:Integer; | ||
+ | Next:PVrchol; | ||
+ | end; | ||
+ | |||
+ | * dany je spajany zoznam | ||
+ | * funkcia Urob(Z); | ||
+ | * za parnu hodnotu vrcholu prida dalsi s hodnotou 0 | ||
+ | 1 -> 2 -> 3 -> 4 -> nil | ||
+ | 1 -> '''2''' -> 0 -> 3 -> '''4''' -> 0 -> nil | ||
+ | |||
+ | |||
+ | === Cvičenie === | ||
+ | |||
+ | |||
+ | 1. pracujeme s triedou TVrchol v Unit1 | ||
+ | TVrchol = class | ||
+ | Info:Integer; | ||
+ | Next:TVrchol; | ||
+ | constructor Create(I:Integer; N:TVrchol); | ||
+ | function Text:String; | ||
+ | end; | ||
+ | |||
+ | function TVrchol.Text: String | ||
+ | begin | ||
+ | Writeln(Info); | ||
+ | end; | ||
+ | |||
+ | 2. v novom module pouzijeme Unit1 | ||
+ | * vytvorit premennu typu TVrchol | ||
+ | * vlozit trojprvkovy zoznam a vypisat | ||
+ | Z:=TVrchol.Create(3,TVrchol.Create(2,TVrchol.Create(1,nil))); | ||
+ | Writeln(Z.Text, Z.Next.Text, Z.Next.Next.Text); | ||
+ | |||
+ | 3. trieda TZoznam obsahujuca spajany zoznam. | ||
+ | * Obsahuje zaciatok a koniec a proceduru PridajZ, ktora prida vrchol na zaciatok | ||
+ | TZoznam = class | ||
+ | Z, K:TVrchol; | ||
+ | end; | ||
+ | procedure TZoznam:PridajZ(I:Integer); | ||
+ | begin | ||
+ | Z:=Vrchol.Create(I, Z); | ||
+ | if Z.Next = nil then | ||
+ | K:=Z; | ||
+ | end; | ||
+ | |||
+ | 4. metoda TZoznam.Vypis | ||
+ | * vypise zoznam od zaciatku po koniec | ||
+ | * pozor na to, aby sme namiesto pomocnej premennej P nepracovali priamo so Z, aby potom nedoslo k strate informacie o zaciatku zoznamu | ||
+ | procedure TZoznam:Vypis; | ||
+ | var P:TVrchol; | ||
+ | begin | ||
+ | P:=Z; | ||
+ | while P <> nil do | ||
+ | begin | ||
+ | Write(P.Text, ' -> '); | ||
+ | P:=P.Next; | ||
+ | end; | ||
+ | Writeln; | ||
+ | end; | ||
+ | * test procedury v druhom module | ||
+ | Z:=TZoznam.Create; | ||
+ | for i:=1 to 8 do | ||
+ | Z.PridajZ(i); | ||
+ | Z.Vypis; | ||
+ | Z.PridajZ(9); | ||
+ | Z.Vypis; | ||
+ | |||
+ | 5. metoda TZoznam.PridajK | ||
+ | * prida vrchol na koniec | ||
+ | * aby sme predisli chybam je dobre situaciu si nakreslit | ||
+ | procedure TZoznam:PridajK; | ||
+ | var R:Tvrchol; | ||
+ | begin | ||
+ | R:=Vrchol.Create(I, nil); | ||
+ | if K = nil then | ||
+ | begin | ||
+ | Z:=R; K:=R; | ||
+ | end | ||
+ | else | ||
+ | K.next:=R; | ||
+ | end; | ||
+ | |||
+ | 6. metoda TZoznam.VyhodZ | ||
+ | * vyhodi prvy vrchol | ||
+ | procedure TZoznam:VyhodZ; | ||
+ | var P:Tvrchol; | ||
+ | begin | ||
+ | P:=Z; | ||
+ | if P <> nil then | ||
+ | begin | ||
+ | P:=Z.Next; | ||
+ | Z.Free; | ||
+ | Z:=P; | ||
+ | |||
+ | if Z = nil then | ||
+ | K:=P; | ||
+ | end | ||
+ | end; | ||
+ | |||
+ | 7. konstruktor | ||
+ | * bez parametra aj s parametrom | ||
+ | class TZoznam | ||
+ | constructor Create; | ||
+ | constructor Create(N:integer); | ||
+ | ... | ||
+ | |||
+ | constructor TVrchol.Create(N: integer); | ||
+ | begin | ||
+ | while N > 0 do | ||
+ | begin | ||
+ | PridajZ(N); | ||
+ | Dec(N); | ||
+ | end; | ||
+ | end; | ||
+ | * v testovacom module mozeme for cyklus nahradit konstruktorom | ||
+ | Z:=TZoznam.Create(8); | ||
+ | |||
+ | 8. Limitovat vypis na 100 prvkov | ||
+ | procedure TZoznam:Vypis; | ||
+ | var | ||
+ | P:TVrchol; | ||
+ | i:integer; | ||
+ | begin | ||
+ | P:=Z; | ||
+ | i:=0; | ||
+ | while (P <> nil) and (i < 100) do | ||
+ | begin | ||
+ | Write(P.Text, ' -> '); | ||
+ | P:=P.Next; | ||
+ | Inc(i); | ||
+ | end; | ||
+ | if (P <> nil) | ||
+ | Write('...'); | ||
+ | Writeln; | ||
+ | end; | ||
+ | |||
+ | 9. metoda TZoznam.pocet | ||
+ | function TZoznam:Pocet :integer; | ||
+ | var | ||
+ | P:TVrchol; | ||
+ | i:integer; | ||
+ | begin | ||
+ | P:=Z; | ||
+ | i:=0; | ||
+ | while (P <> nil) do | ||
+ | begin | ||
+ | P:=P.Next; | ||
+ | Inc(i); | ||
+ | end; | ||
+ | result := i; | ||
+ | end; | ||
+ | * test | ||
+ | Z:=TZoznam.Create(1000000); | ||
+ | Z.Vypis; | ||
+ | Z.Pridaj(9); | ||
+ | Z.Vypis; | ||
+ | Writeln('Pocet = ', Z.Pocet); | ||
+ | |||
+ | 10. konstruktor s otvorenym polom ako parametrom | ||
+ | constructor TZoznam.Create(A:array of integer); | ||
+ | var i:integer; | ||
+ | begin | ||
+ | for i := 0 to high(A) do | ||
+ | PridajK(A[i]); | ||
+ | end; | ||
+ | * ina moznost napisat for cyklus | ||
+ | constructor TZoznam.Create(A:array of integer); | ||
+ | var i:integer; | ||
+ | begin | ||
+ | for i in A do | ||
+ | PridajK(i); | ||
+ | end; | ||
+ | |||
+ | 11. konstruktor, ktory dostava iny zoznam ako parameter a vytvori kopiu zoznamu | ||
+ | constructor TZoznam.Create(A:TZoznam); | ||
+ | var | ||
+ | P:TVrchol; | ||
+ | begin | ||
+ | P:=A.Z; | ||
+ | while P <> nil do | ||
+ | begin | ||
+ | PridajK(P.Info); | ||
+ | P := P.Next; | ||
+ | end; | ||
+ | end; | ||
+ | * test | ||
+ | Z:=TZoznam.Create([2,3,5,7,11,13]); | ||
+ | R:=TZoznam.Create(Z); | ||
+ | R.PridajK(17); | ||
+ | Z.Vypis; | ||
+ | R.Vypis; | ||
+ | |||
+ | 12. procedura append | ||
+ | procedure TZoznam.Append(A:TZoznam); | ||
+ | var | ||
+ | P:TVrchol; | ||
+ | begin | ||
+ | P:=A.Z; | ||
+ | while P <> nil do | ||
+ | begin | ||
+ | PridajK(P.Info); | ||
+ | P := P.Next; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | 13. procedura append rychlejsie | ||
+ | procedure TZoznam.Append(A:TZoznam); | ||
+ | var | ||
+ | P:TVrchol; | ||
+ | begin | ||
+ | if (z<>nil) and (Q.Z <> nil) then | ||
+ | begin | ||
+ | K.next:=A.Z; | ||
+ | K:=Q.K; | ||
+ | Q.Z:=nil; | ||
+ | Q.K:=nil; | ||
+ | end; | ||
+ | ... zvysne kombinacie testov na nil | ||
+ | end; | ||
+ | |||
+ | |||
+ | |||
+ | === Domáca úloha === | ||
+ | |||
+ | |||
+ | 1. Vytvorte triedu TSlovnik, ktora do spajaneho zoznamu nacita zo suboru zoznam dvojic slov | ||
+ | pes dog | ||
+ | macka cat | ||
+ | ... | ||
+ | * zoznam v triede TSlovnik udrzujte utriedeny podla anglickych slovicok | ||
+ | TVrchol = class | ||
+ | Slov, Angl:string; | ||
+ | Next:TVrchol; | ||
+ | ... | ||
+ | end; | ||
+ | |||
+ | TSlovnik = class | ||
+ | Z:Tvrchol; | ||
+ | constructor Create(subor:string); | ||
+ | procedure Vloz(s, a:string); | ||
+ | end; |
Verzia zo dňa a času 10:50, 1. marec 2013
27. Cvičenie
< 27.Prednáška | riešené úlohy
Rozcvička
1. pre spájaný zoznam
type PVrchol = ^TVrchol; TVrchol = record Info: Integer; Next: PVrchol; end;
- napísať procedúru Pridaj(Z: PVrchol), ktorá za každý vrchol s párnou hodnotou vloží nový vrchol s nulovou hodnotou, napr. zo zoznamu
4 -> 5 -> 6 -> 7 -> 8 -> |
- vyrobí zoznam
4 -> 0 -> 5 -> 6 -> 0 -> 7 -> 8 -> 0 -> |
Cvičenie
- vrchol ako objekt
- metódy triedy TZoznam
- rôzne konštruktory: otvorené pole, textový/binárny súbor, reťazec, iný zoznam
- konštruktor generuje postupnosť
- deštruktor uloží do súboru
- funkcia vráti dynamické pole z hodnôt zoznamu
- udržiavať zoznam utriedený - pridávať na správne miesto (za menší pred väčší)
- minimálny prvok presťahuje na začiatok
- procedurálny typ
- metódy dvojsmerného spájaného zoznamu
- metódy cyklického spájaného zoznamu
Domáca úloha
1. Z textového súboru slovnik.txt (dvojice slov: slovenské anglické - bez diakritiky). vytvoriť usporiadaný zoznam podľa anglického slova. Do triedy TSlovnik (spájaný zoznam) dodefinujte metódy na načítanie zo súboru a tiež na zápis do súboru, slová do zoznamu pridávajte metódou Zarad, ktorá zaradí dvojicu slov na správne miesto do slovníka, aby bol stále usporiadaný podľa anglického slova.
27. Cvičenie
< 27.Prednáška | riešené úlohy
Rozcvička
PVrchol = ^TVrchol; TVrchol = record Info:Integer; Next:PVrchol; end;
- dany je spajany zoznam
- funkcia Urob(Z);
- za parnu hodnotu vrcholu prida dalsi s hodnotou 0
1 -> 2 -> 3 -> 4 -> nil 1 -> 2 -> 0 -> 3 -> 4 -> 0 -> nil
Cvičenie
1. pracujeme s triedou TVrchol v Unit1
TVrchol = class Info:Integer; Next:TVrchol; constructor Create(I:Integer; N:TVrchol); function Text:String; end; function TVrchol.Text: String begin Writeln(Info); end;
2. v novom module pouzijeme Unit1
- vytvorit premennu typu TVrchol
- vlozit trojprvkovy zoznam a vypisat
Z:=TVrchol.Create(3,TVrchol.Create(2,TVrchol.Create(1,nil))); Writeln(Z.Text, Z.Next.Text, Z.Next.Next.Text);
3. trieda TZoznam obsahujuca spajany zoznam.
- Obsahuje zaciatok a koniec a proceduru PridajZ, ktora prida vrchol na zaciatok
TZoznam = class Z, K:TVrchol; end; procedure TZoznam:PridajZ(I:Integer); begin Z:=Vrchol.Create(I, Z); if Z.Next = nil then K:=Z; end;
4. metoda TZoznam.Vypis
- vypise zoznam od zaciatku po koniec
- pozor na to, aby sme namiesto pomocnej premennej P nepracovali priamo so Z, aby potom nedoslo k strate informacie o zaciatku zoznamu
procedure TZoznam:Vypis; var P:TVrchol; begin P:=Z; while P <> nil do begin Write(P.Text, ' -> '); P:=P.Next; end; Writeln; end;
- test procedury v druhom module
Z:=TZoznam.Create; for i:=1 to 8 do Z.PridajZ(i); Z.Vypis; Z.PridajZ(9); Z.Vypis;
5. metoda TZoznam.PridajK
- prida vrchol na koniec
- aby sme predisli chybam je dobre situaciu si nakreslit
procedure TZoznam:PridajK; var R:Tvrchol; begin R:=Vrchol.Create(I, nil); if K = nil then begin Z:=R; K:=R; end else K.next:=R; end;
6. metoda TZoznam.VyhodZ
- vyhodi prvy vrchol
procedure TZoznam:VyhodZ; var P:Tvrchol; begin P:=Z; if P <> nil then begin P:=Z.Next; Z.Free; Z:=P; if Z = nil then K:=P; end end;
7. konstruktor
- bez parametra aj s parametrom
class TZoznam constructor Create; constructor Create(N:integer); ...
constructor TVrchol.Create(N: integer); begin while N > 0 do begin PridajZ(N); Dec(N); end; end;
- v testovacom module mozeme for cyklus nahradit konstruktorom
Z:=TZoznam.Create(8);
8. Limitovat vypis na 100 prvkov
procedure TZoznam:Vypis; var P:TVrchol; i:integer; begin P:=Z; i:=0; while (P <> nil) and (i < 100) do begin Write(P.Text, ' -> '); P:=P.Next; Inc(i); end; if (P <> nil) Write('...'); Writeln; end;
9. metoda TZoznam.pocet
function TZoznam:Pocet :integer; var P:TVrchol; i:integer; begin P:=Z; i:=0; while (P <> nil) do begin P:=P.Next; Inc(i); end; result := i; end;
- test
Z:=TZoznam.Create(1000000); Z.Vypis; Z.Pridaj(9); Z.Vypis; Writeln('Pocet = ', Z.Pocet);
10. konstruktor s otvorenym polom ako parametrom
constructor TZoznam.Create(A:array of integer); var i:integer; begin for i := 0 to high(A) do PridajK(A[i]); end;
- ina moznost napisat for cyklus
constructor TZoznam.Create(A:array of integer); var i:integer; begin for i in A do PridajK(i); end;
11. konstruktor, ktory dostava iny zoznam ako parameter a vytvori kopiu zoznamu
constructor TZoznam.Create(A:TZoznam); var P:TVrchol; begin P:=A.Z; while P <> nil do begin PridajK(P.Info); P := P.Next; end; end;
- test
Z:=TZoznam.Create([2,3,5,7,11,13]); R:=TZoznam.Create(Z); R.PridajK(17); Z.Vypis; R.Vypis;
12. procedura append
procedure TZoznam.Append(A:TZoznam); var P:TVrchol; begin P:=A.Z; while P <> nil do begin PridajK(P.Info); P := P.Next; end; end;
13. procedura append rychlejsie
procedure TZoznam.Append(A:TZoznam); var P:TVrchol; begin if (z<>nil) and (Q.Z <> nil) then begin K.next:=A.Z; K:=Q.K; Q.Z:=nil; Q.K:=nil; end; ... zvysne kombinacie testov na nil end;
Domáca úloha
1. Vytvorte triedu TSlovnik, ktora do spajaneho zoznamu nacita zo suboru zoznam dvojic slov
pes dog macka cat ...
- zoznam v triede TSlovnik udrzujte utriedeny podla anglickych slovicok
TVrchol = class Slov, Angl:string; Next:TVrchol; ... end; TSlovnik = class Z:Tvrchol; constructor Create(subor:string); procedure Vloz(s, a:string); end;