26.Prednaska/Cvicenie1

Z Pascal
Revízia z 13:54, 3. apríl 2013; Jano (Diskusia | príspevky)

(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Prejsť na: navigácia, hľadanie

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 Urob(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 -> nil
vyrobí zoznam
4 -> 0 -> 5 -> 6 -> 0 -> 7 -> 8 -> 0 -> nil


Cvičenie

  • vrchol ako objekt - pracujeme s triedou TVrchol - definujeme v Unit1.pas
TVrchol = class
  Info: Integer;
  Next: TVrchol;
  constructor Create(I: Integer; N: TVrchol);
  function Text: string;
end;
 
function TVrchol.Text: string
begin
  Result := ' ' + IntToStr(Info);
end;
  • otestujeme - vytvoriť premennú typu TVrchol, vložiť trojprvkový zoznam a vypísať
var
  Z: TVrchol;
begin
  Z := TVrchol.Create(5, TVrchol.Create(7, TVrchol.Create(11, nil)));
  Writeln(Z.Text, Z.Next.Text, Z.Next.Next.Text);
  • definovať triedu TZoznam (v Unit1.pas) okrem Z a K aj metódu PridajZ - pridá vrchol na začiatok
TZoznam = class
  Z, K: TVrchol;
  procedure PridajZ(I: Integer);
end;
 
procedure TZoznam.PridajZ(I: Integer);
begin
  Z := Vrchol.Create(I, Z);
  if Z.Next = nil then
    K := Z;
end;
  • definovať metódu Vypis (u nás sa podarilo takéto chybné riešenie, tak sme ho ďalej takéto testovali)
procedure TZoznam.Vypis;
begin
  while Z <> nil do
  begin
    Write(Z.Text, ' -> ');
    Z := P.Next;
  end;
  Writeln;
end;
  • test metód
var
  Zoznam: TZoznam;
  I: Integer;
begin
  Zoznam := TZoznam.Create;
  for I := 1 to 8 do
    Zoznam.PridajZ(I);
  Zoznam.Vypis;
  Zoznam.PridajZ(9);
  Zoznam.Vypis;
  • po prvom výpise zoznamu je tento už prázdny (metóda Vypis okrem výpisu ho vyprázdni), treba si to zapamätať a teda opraviť
procedure TZoznam.Vypis;
var
  P: TVrchol;
begin
  P := Z;
  while P <> nil do
  begin
    Write(P.Text, ' -> ');
    P := P.Next;
  end;
  Writeln;
end;
  • metóda TZoznam.PridajK - pridá vrchol na koniec (aby sme predišli chybám, je dobre si situáciu nakresliť)
procedure TZoznam.PridajK(I: Integer);
var
  R: TVrchol;
begin
  R := Vrchol.Create(I, nil);
  if K = nil then
  begin
    Z := R;
    K := R;
  end
  else
  begin
    K.Next := R;
    K := R;
  end;
end;
  • metóda TZoznam.VyhodZ - vyhodí prvý vrchol
procedure TZoznam.VyhodZ;
var
  P: TVrchol;
begin
  if Z <> nil then
  begin
    P := Z.Next;
    Z.Free;
    Z := P;
    if Z.Next = nil then
      K := P;
  end
end;
  • deštruktor Dispose (aj pomocou VyhodZ)
destructor TZoznam.Destroyô
begin
  ...
end;

    • 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

Ďalšie námety na metódy pre triedu TZoznam:

  • procedure VyhodZ; // vyhodí prvý prvok
  • procedure VyhodK; // vyhodí posledný prvok
  • procedure VyhodIty(Index: Integer); // vyhodí prvok s indexom Index
  • procedure Vyhod(I: Integer); // vyhodí prvok s Info I
  • procedure Prevrat; // prevráti poradie prvkov v zozname
  • function Najdi(I: Integer): Integer; // zistí index
  • procedure Utried;
    • nájde minimum, dá ho na začiatok, znovu nájde minimum zo zvyšku, dá ho za minimum, ...
  • procedure zarad(I: Integer);
    • zaradí prvok do zoznamu, aby ostal zoznam utriedený
  • procedure VyhodDuplikaty;
    • vyhodí vrcholy s rovnakým Info - nechá len prvý z nich
  • function Ity(I: Integer): TVrchol; // vráti í-ty prvok
  • constructor Citaj(Stream: TStream); // načíta zoznam z prúdu

Domáca úloha

1. Vytvorte triedu TSlovnik, ktorá do spájaného zoznamu načíta zo súboru (napr. slovnik.txt) zoznam dvojíc slov (slovenské anglické), napr.

pes dog
macka cat
...
  • trieda TSlovnik je spájaným zoznamom, ktorý bude mať vrcholy utriedené podľa anglických slovíčok, napr.
TVrchol = class
  Slov, Angl: string;
  Next: TVrchol;
  ...
end;
 
TSlovnik = class
  Z: Tvrchol;
  constructor Create(Subor: string);
  procedure Vloz(S, A: string);     // vloží do zoznamu na správne miesto ďalšiu dvojicu slov
  ...
end;





  • konstruktor - bez parametra aj s parametrom
class TZoznam
  constructor Create;
  constructor Create(N:integer);
  ...
 
constructor TZoznam.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. Limitovať výpis na prvých 100 prvkov (ak pridlhý zoznam, tak len prvých 100 a ...)

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;