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