26.Prednaska/Cvicenie0

Z Pascal
Prejsť na: navigácia, hľadanie

26. Cvičenie


< 26.Prednáška | riešené úlohy


Rozcvička

1. kopírovať binárny súbor integer.dat do real.dat

  • kde vstupný súbor obsahuje postupnosť celých čísel a výstupný súbor bude obsahovať tie isté čísla ale prekonvertované na reálne
  • nepoužívajte polia ani reťazce


2. kopírovať binárny súbor real.dat do integer.dat

  • kde vstupný súbor obsahuje postupnosť reálných čísel a výstupný súbor bude obsahovať tie isté čísla ale prekonvertované (Round) na celé
  • nepoužívajte polia ani reťazce


Cvičenie

  • budeme pracovať s takto zadeklarovaným spájaným zoznamom:
type
  PVrchol = ^TVrchol;
  TVrchol = record
    Info: Integer;
    Next: PVrchol;
  end;
 
var
  Z, P: PVrchol;
  • do premennej P priradiť jeden vrchol s hodnotou 1
New(P);
P^.Info := 1;
P^.Next := nil;
  • teraz urob z neho jednoprvkový zoznam - v Z je na neho smerník a do P ďalší vrchol s hodnotou 2
Z := P;
 
New(P);
P^.Info := 2;
P^.Next := nil;
  • pripoj P na koniec zoznamu Z a znovu do P ďalší vrchol s hodnotou 3
Z^.Next := P;
 
New(P);
P^.Info := 3;
P^.Next := nil;
  • pripoj P na koniec zoznamu Z (ako 3. vrchol) a vypíš zoznam jedným WriteLn
Z^.Next^.Next := P;
 
WriteLn(Z^.Info, ' -> ', Z^.Next^.Info, ' -> ', Z^.Next^.Next^.Info, ' -> nil');
  • dostali sme výpis
1 -> 2 -> 3 -> nil
  • v programe nechajte výrobu vrcholov do P a zmeňte len ďalšie priradenia tak aby vzniklo takéto poradie
2 -> 3 -> 1 -> nil
  • riešenie
// P => 1
Z := P;
// P => 2
P^.Next := Z;
Z := P;
// P => 3
P^.Next := Z^.Next;
Z^.Next := P;
// výpis
  • podobne realizujete napr. zmenu poradia (prípadne aj iné)
3 -> 1 -> 2 -> 
  • procedúra Vypis - vypíše prvky zoznamu cyklom
procedure Vypis(Z: Pvrchol);
begin
  while Z <> nil do
  begin
    Write(Z^.Info, ' -> ');
    Z := Z^.Next;
  end;
  WriteLn('nil');
end;
  • upozorniť ich na to, čo by sa muselo zmeniť, keby Z' bol var-parameter
  • čítať textový súbor s celými číslami a vyrábať z nich zoznam - najprv v opačnom poradí (otestovať na súbore s aspoň 5 číslami)
var
   T: TextFile;
   Z, P: PVrchol;
begin
  AssignFile(T, 'cisla.txt');
  Reset(T);
  Z := nil;
  while not SeekEOF(T) do
  begin
    New(P);
    Read(T, P^.Info);
    P^.Next := Z;
    Z := P;
  end;
  CloseFile(T);
  Vypis(Z);
  • potom čísla v správnom poradí (pridáva na koniec existujúceho zoznamu, máme ďalší smerník K na koniec zoznamu)
var
   T: TextFile;
   Z, K, P: PVrchol;
begin
  AssignFile(T, 'cisla.txt');
  Reset(T);
  Z := nil;
  K := nil;
  while not SeekEOF(T) do
  begin
    New(P);
    Read(T, P^.Info);
    P^.Next := nil;
    if Z = nil then
      Z := P
    else
      K^.Next := P;
    K := P;
  end;
  CloseFile(T);
  Vypis(Z);
  • rôzne funkcie typu:
  • zistí, či má zoznam aspoň 1 prvok
  • zistí, či má zoznam aspoň 2 prvky
  • minimálna hodnota
  • smerník na minimálnu hodnotu
  • priemer
  • počet nulových prvkov
  • vráti smerník na I-ty vrchol (ak neexistuje, vráti nil)
  • vráti index vrcholu pre prvý výskyt (ak nenájde, tak 0)
  • smerník na stredný vrchol
  • zistiť, či sa v zozname nejaké číslo neopakuje
  • vkladanie a vyhadzovanie prvkov
  • vlož za, vlož pred
  • vyhoď vrchol s hodnotou
  • vyhoď i-ty vrchol
  • za každý vrchol vložiť nový vrchol s nulovou hodnotou
  • medzi každé dva vrcholy vložiť nový vrchol s ich súčtom (na začiatku napr. 1 -> 1 ->)
  • procedúra VyhodNulove vyhodí zo zoznamu všetky vrcholy s nulovou hodnotou
  • funkcia vymení poradie dvoch nasledovníkov parametra P: PVrchol, t.j. P^.Next a P^.Next^.Next
  • vlož zadanú hodnotu na náhodne miesto v zozname (aj pred prvý, aj za posledný)


Domáca úloha

1. napíšte podprogram Otoc, ktorý otočí poradie prvkov zadaného zoznamu

procedure Otoc(var Z: PVrchol);
  • pritom sa nemajú vytvárať nové ani rušiť pôvodné vrcholy, len sa presmerníkujú


2. napíšte podprogram Vymen, ktorý rozsekne zoznam v strede na dva zoznamy a tie potom zlepí, ale najprv druhý a potom prvý

procedure Vymen(var Z: PVrchol);
  • pritom sa nemajú vytvárať nové ani rušiť pôvodné vrcholy, len sa presmerníkujú
  • napr. pre zoznam
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 
po výmene dostávame zoznam
4 -> 5 -> 6 -> 1 -> 2 -> 3 -> 


3. procedúra VyhodDuplikaty vyhodí zo zoznamu všetky ďalšie výskyty tej iste hodnoty

procedure VyhodDuplikaty(Z: PVrchol);