27.Prednaska/Cvicenie0: Rozdiel medzi revíziami

Z Pascal
Prejsť na: navigácia, hľadanie
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 09: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;