14. príklady


Posledná zmena: 1.11.2002

Banner Text 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