| Posledná zmena: 1.11.2002

dynamické polia

## Dynamické pole celých čísel

- predpokladáme deklaráciu:
  type TPole = array of integer;

náhodný obsah poľa:
funkcia vygeneruje n-prvkové pole s náhodnými číslami od 0 do 99 |
    function nahodne(n:integer):TPole;
    var
      i:integer;
    begin
      SetLength(Result,n);
      for i:=0 to high(Result) do
        Result[i]:=random(100);
    end;
konštanta pole:
pomocná funkcia vyrobPole dostane parameter otvorené pole a z neho vyrobí dynamické pole bude sa dať použiť, napr. var a:TPole; a:=vyrobPole([2,3,5,7,11]); |
    function vyrobPole(p:array of integer):TPole;
    var
      i:integer;
    begin
      SetLength(Result,Length(p));
      for i:=0 to high(p) do
        Result[i]:=p[i];
    end;
výpis poľa:
funkcia vytvorí reťazec parametrom môže byť ľubovoľné:

- konštantné pole
- statické pole
- dynamické pole

    function toStr(p:array of integer):string;
    var
      i:integer;
    begin
      Result:='';
      for i:=0 to high(p) do
        Result:=Result+' '+IntToStr(p[i]);
    end;

súčet prvkov poľa:
    function sucet(p:array of integer):integer;
    var
      i:integer;
    begin
      Result:=0;
      for i:=0 to high(p) do inc(Result,p[i]);
    end;
pridať prvok na koniec poľa:
druhým parametrom musí byť dynamické pole typu TPole |
    procedure pridaj(x:integer; var p:TPole);
    begin
      SetLength(p,Length(p)+1);
      p[high(p)]:=x;
    end;
zaradiť do utriedeného poľa:
predpokladáme, že pole je vzostupne utriedené - treba zaradiť nový prvok tak, aby ostalo utriedené |
    procedure zarad(x:integer; var p:TPole);
    var
      i:integer;
    begin
      i:=high(p); SetLength(p,Length(p)+1);
      while (i>=0) and (x<p[i]) do begin
        p[i+1]:=p[i]; dec(i);
      end;
      p[i+1]:=x;
    end;
vzostupne utriediť pole:
pomocou procedúry zarad utriediť pole čísel - výsledkom je dynamické pole (vstupným parametrom môže byť konštantné, statické aj dynamické pole) |
    function tried(p:array of integer):TPole;
    var
      i:integer;
    begin
      Result:=nil;
      for i:=0 to high(p) do
        zarad(p[i],Result);
    end;
vyhoď duplikáty:
z dynamického utriedeného poľa vyhodí všetky duplikáty - pole sa možno skráti |
    procedure vyhodDupl(var p:TPole);
    var
      i,n:integer;
    begin
      n:=0;
      for i:=0 to high(p) do
        if (i=0) or (p[i]<>p[i-1]) then begin
          p[n]:=p[i]; inc(n);
        end;
      SetLength(p,n);
    end;
spojenie dvoch polí:
dve polia sa zreťazia do jedného |
    function spoj(a,b:array of integer):TPole;
    var
      i,na,nb:integer;
    begin
      na:=Length(a); nb:=Length(b);
      SetLength(Result,na+nb);
      for i:=0 to na-1 do Result[i]:=a[i];
      for i:=0 to nb-1 do Result[i+na]:=b[i];
    end;
zoznam deliteľov nejakého čísla:
funkcia vráti dynamické pole, ktoré obsahuje všetkých deliteľov daného čísla okrem samého seba môžete použiť procedúru pridaj |
    function delitele(n:integer):TPole;
    var
      i:integer;
    begin
      Result:=nil;
      for i:=1 to n div 2 do
        if n mod i=0 then
          pridaj(i,Result);
    end;
fibonacciho postupnosť:
funkcia vráti prvých n-členov fibonacciho postupnosti použite procedúru pridaj |
    function fib(n:integer):TPole;
    begin
      Result:=nil;
      if n>0 then pridaj(1,Result);
      if n>1 then pridaj(1,Result);
      while n>2 do begin
       pridaj(Result[high(Result)]+Result[high(Result)-1],
              Result);
       dec(n);
      end;
    end;

    // alebo

    function fib(n:integer):TPole;
    var
      i:integer;
    begin
      Result:=nil;
      if n>0 then pridaj(1,Result);
      if n>1 then pridaj(1,Result);
      for i:=2 to n do begin
        pridaj(Result[i-1]+Result[i-2],Result);
        dec(n);
      end;
    end;

### Ďalšie úlohy

- zadefinujte podobné procedúry pre dynamické pole znakových reťazcov, a tiež funkcie v a poz, ktoré zistia, či sa nejaký reťazec náchadza v poli reťazcov, resp. na ktorej pozícii, napr.
  if v(slovo,['dopredu','vlavo','vpravo','zmaz','ph']) then ...
  case poz(slovo,['dopredu','vlavo','vpravo','zmaz','ph']) of ...
- navrhnite triedy na prácu s postupnosťou čísel, resp. reťazcov

## slovník - dynamické pole dvojíc reťazcov

- predpokladáme deklarácie:
  type
  TZaznam = record a,b:string end;
  TPole = array of TZaznam;

pomocné funkcie:
funkcie zaznam a vyrob majú slúžiť na vytvorenie dynamického poľa |
    function zaznam(a,b:string):TZaznam;
    begin
      Result.a:=a; Result.b:=b;
    end;

    function vyrob(p:array of TZaznam):TPole;
    var
      i:integer;
    begin
      SetLength(Result,Length(p));
      for i:=0 to high(p) do
        Result[i]:=p[i];
    end;

    // napríklad

    var
      a:TPole;
    begin
      a:=vyrob([zaznam('dog','pes'),
                zaznam('cat','macka'),
                zaznam('cow','krava')]);
výpis tabuľky:
funkcia vytvorí z poľa reťazec - riadky sú oddelené #13#10 |
    function toStr(p:array of TZaznam):string;
    var
      i:integer;
    begin
      Result:='';
      for i:=0 to high(p) do
        Result:=Result+p[i].a+' - '+p[i].b+#13#10;
    end;
hľadať v tabuľke:
ak nenájde, vráti -1 |
    function poz(x:string; p:array of TZaznam):integer;
    begin
      x:=UpperCase(x);
      for Result:=0 to high(p) do
        if x=UpperCase(p[Result].a) then exit;
      Result:=-1;
    end;
pridaj a vyhoď:
pridávať na koniec vyhadzovať tak, že sa na jeho miesto dá posledný a pole sa skráti o 1 prvok |
    procedure pridaj(x:TZaznam; var p:TPole);
    begin
      SetLength(p,Length(p)+1);
      p[high(p)]:=x;
    end;

    procedure vyhod(x:string; var p:TPole);
    var
      i:integer;
    begin
      i:=poz(x,p); if i<0 then exit;
      p[i]:=p[high(p)];
      SetLength(p,Length(p)-1);
    end;
zapíš do súboru:
    procedure zapis(subor:string; p:array of TZaznam);
    var
      t:TextFile;
      i:integer;
    begin
      AssignFile(t,subor); Rewrite(t);
      for i:=0 to high(p) do
        writeln(t,p[i].a,';',p[i].b);
      CloseFile(t);
    end;
prečítaj zo súboru:
    procedure citaj(subor:string; var p:TPole);
    var
      t:TextFile;
      s1,s2:string;
      i:integer;
    begin
      p:=nil;
      AssignFile(t,subor); Reset(t);
      while not seekeof(t) do begin
        readln(t,s1); i:=pos(';',s1);
        if i=0 then s2:=s1
        else begin
          s2:=copy(s1,i+1,maxint);
          delete(s1,i,maxint);
        end;
        pridaj(zaznam(s1,s2),p);
      end;
      CloseFile(t);
    end;

### Ďalšie úlohy

- navrhnite triedu na prácu so slovníkom

## dvojrozmerné dynamické pole

- predpokladáme deklaráciu:
  type TPole2 = array of array of integer;

pridaj nový riadok:
do dvojrozmernej tabuľky čísel sa na koniec pridá nový riadok, napr. var p:TPole2; begin p:=nil;
pridaj([1,2,3,4,5],p);
pridaj([],p);
pridaj([6,7,8],p);

    procedure pridaj(x:array of integer; var p:TPole2);
    var
      i:integer;
    begin
      SetLength(p,Length(p)+1);
      SetLength(p[high(p)],Length(x));
      for i:=0 to high(x) do
        p[high(p),i]:=x[i];
    end

výpis poľa:
riadky poľa sú oddelené #13#10 |
    function toStr(p:TPole2):string;
    var
      i,j:integer;
    begin
      Result:='';
      for i:=0 to high(p) do begin
        for j:=0 to high(p[i]) do
          Result:=Result+IntToStr(p[i,j])+' ';
        Result:=Result+#13#10;
      end;
    end;
zápis do súboru:
    procedure zapis(subor:string; p:TPole2);
    var
      t:TextFile;
      i,j:integer;
    begin
      AssignFile(t,subor); Rewrite(t);
      for i:=0 to high(p) do begin
        for j:=0 to high(p[i]) do
          write(t,p[i,j],' ');
        writeln(t);
      end;
      CloseFile(t);
    end;
čítanie zo súboru:
    procedure citaj(subor:string; var p:TPole2);
    var
      t:TextFile;
    begin
      AssignFile(t,subor); Reset(t);
      p:=nil;
      while not eof(t) do begin
        SetLength(p,Length(p)+1);
        p[high(p)]:=nil;
        while not SeekEoln(t) do begin
          SetLength(p[high(p)],Length(p[high(p)])+1);
          read(t,p[high(p),high(p[high(p)])]);
        end;
        readln(t);
      end;
      CloseFile(t);
    end;
čítanie zo súboru - 2. verzia:
táto verzia je trochu čitateľnejšia |
    procedure citaj(subor:string; var p:TPole2);
    var
      t:TextFile;
      i,j:integer;
    begin
      AssignFile(t,subor); Reset(t);
      p:=nil; i:=0;
      while not eof(t) do begin
        SetLength(p,i+1); p[i]:=nil; j:=0;
        while not SeekEoln(t) do begin
          SetLength(p[i],j+1);
          read(t,p[i,j]);
          inc(j);
        end;
        readln(t);
        inc(i);
      end;
      CloseFile(t);
    end;

### Ďalšie úlohy

- navrhnite triedu na prácu s dvojrozmernými poliami čísel - doplňte metódy, napr. súčet dvoch polí, otočenie podľa hlavnej uhlopriečky (chýbajúce prvky nahraďte 0)

© 2002 AB, KVI
blaho@fmph.uniba.sk