| 
 
                
                    |  | 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é polestatické poledynamické 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. varp: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, KVIblaho@fmph.uniba.sk
 |