Lekce 1.19
Typ ARRAY - prom∞nnΘ typu pole


p°edchozφ lekce (1.18) obsah kurzu nßsledujφcφ lekce (1.20)

Pokud budete pot°ebovat v programu vφce prom∞nn²ch, nap°φklad pro ulo₧enφ v²sledk∙ v²poΦt∙, m∙₧ete v²hodn∞ pou₧φt deklaraci prom∞nnΘ typu ARRAY (pole). Pole je seskupenφ prom∞nn²ch, kterΘ jsou dostupnΘ indexem pole udßvajφcφ pozici prvku v poli. V²hodou je, ₧e se jednß o jednu prom∞nnou, jejφ₧ deklarace je velmi jednoduchß. Nenφ takΘ nutnΘ znßt rozsah pole ji₧ p°i deklaraci prom∞nnΘ, ale je mo₧nΘ pou₧φt rozsah pole zadan² a₧ dßle v programu v zßvislosti na p°edchozφch v²poΦtech. Funkce pro prßci s polem obsahuje knihovna pro prßci s poli, se kterou se nynφ seznßmφme.

Prom∞nnΘ s mo₧nostφ indexovΘho p°φstupu jsou obsa₧eny i v jazycφch BONANZA a JUKON, pou₧φvajφ se vÜak k tomu jinΘ procedury a funkce!

Pole si m∙₧ete jednoduÜe p°edstavit jako °adu hodnot. Ka₧dß hodnota je uvßd∞na jako jeden prvek pole. Pro p°φstup k jednotliv²m hodnotßm musφte p°itom pou₧φt tzv. index, kter²m zadßvßte po°adφ prvku (hodnoty) v poli. Celkovß dimenze (rozsah) pole se zadßvß p°i inicializaci pole.

Pole m∙₧e b²t jednorozm∞rnΘ nebo dvourozm∞rnΘ. Jednorozm∞rnΘ pole je vlastn∞ °ada hodnot a index se zadßvß jako po°adφ hodnoty. Dvourozm∞rnΘ pole je mo₧nΘ si jednoduÜe p°edstavit jako Üachovnici. Index pro p°φstup do dvourozm∞rnΘho pole v tomto p°φpad∞ udßvß °ßdek a sloupec Üachovnice. P°i definici pole nemusφ zaΦφnat rozsah pole v₧dy od jedniΦky. Je mo₧nΘ si definovat hodnotu poΦßteΦnφho a koncovΘho indexu.

S prom∞nnou typu Array (pole) se pracuje jinak, ne₧ s b∞₧nou prom∞nnou. Prom∞nnou musφte nejprve b∞₧n²m zp∙sobem deklarovat. Abyste ale mohli k prom∞nnΘ p°istupovat jako k poli, musφte ji jeÜt∞ dßle v programu inicializovat. Inicializacφ se souΦasn∞ zadßvß rozsah indexov²ch polφ. Inicializace jednorozm∞rnΘho pole se provßdφ funkcφ Array1Create. Parametry udßvajφ poΦßteΦnφ a koncov² prvek pole. P°i inicializaci obsahuje pole prom∞nnΘ typu variant s nedefinovan²m stavem a je proto vhodnΘ jeÜt∞ nulovat polo₧ky pole na poΦßteΦnφ hodnoty:


Pole:=Array1Create(0, 9);
For x:= 0 to 9 do 
    Pole := Array1Set(Pole, x, 0);
Uveden² p°φklad inicializoval pole s indexy od 0 do 9. InicializovanΘ pole obsahuje tedy deset prvk∙ - s indexy od nuly do 9. Obdobn²m zp∙sobem se inicializuje i dvourozm∞rnΘ pole funkcφ Array2Create. Prvnφ dva parametry uvßd∞jφ rozsah prvk∙ v jednom rozm∞ru (dimenzi), dalÜφ dva parametry udßvajφ rozsah pole v druhΘm rozm∞ru (dimenzi). Nßsledujφcφ Φßst programu

Pole := Array2Create(1, 3, 0, 9);
For x:= 1 to 3 do
begin
   For y:= 0 to 9 do 
       Pole := Array2Set(Pole, x, y, 0);
end;
inicializuje dvourozm∞rnΘ pole, kterΘ je mo₧nΘ si p°edstavit jako m°φ₧ku obsahujφcφ t°i °ßdky (prvnφ dva parametry) krßt deset sloupc∙ (poslednφ dva parametry). Index °ßdk∙ je v tomto p°φpad∞ poΦφtßn od jedniΦky, index sloupc∙ je ale poΦφtßn od nuly.

Po inicializaci obsahuje ka₧d² prvek pole prßzdnou hodnotu nedefinovanΘho stavu. Je proto vhodnΘ po ihned po inicializaci pole p°ed jeho dalÜφm pou₧itφm naplnit pole poΦßteΦnφmi hodnotami po₧adovanΘho typu. Mo₧nost poΦßteΦnφho napln∞nφ pole je uvedena ve v²Üe uveden²ch inicializacφch pole.

Pro kontrolu poΦtu rozm∞r∙ a sprßvnosti inicializace pole m∙₧eme pou₧φt funkci ArrayDimCount, kterß nßm vracφ poΦet rozm∞r∙ (dimenzφ) pole, p°φpadn∞ nulovou hodnotu, pokud nenφ prom∞nnß typu pole (Array).

V mnoha p°φpadech, nap°φklad p°i programovßnφ cykl∙, bude vhodnΘ mφt z programu p°φstup k rozsahu indexovßnφ polφ. K tomu slou₧φ funkce Array1Low a Array1High pro jednorozm∞rnΘ pole a Array2Low a Array2High pro dvourozm∞rnΘ pole. Dφky tomu je nap°φklad mo₧nΘ nulovat polo₧ky pole nßsledujφcφm zp∙sobem:


{jednorozm∞rnΘ pole}
mesice := Array1Create(1, 12);
For x:= Array1Low(mesice) to Array1High(mesice) do
    Mesice := Array1Set(Mesice, x, Month(x));

{dvourozm∞rnΘ pole}
rok := Array2Create(1, 12, 1, 30);
For x:= Array2Low(rok,1) to Array2High(rok,1) do
    For y:= Array2Low(rok,2) to Array2High(rok,2) do
        Rok := Array2Set(Rok, x, y, 0);
Jak jste ji₧ mo₧nß poznali, je pro zadßnφ novΘho obsahu jednorozm∞rnΘho pole nutnΘ pou₧φt funkci Array1Set s uvedenφm parametru jmΘna prom∞nnΘ, indexu prvku a zadßnφ novΘho obsahu. Funkce vracφ nov² obsah pole vΦetn∞ nov∞ zadßvanΘho obsahu. Nap°φklad:

V := Array1Set(V, poradi, 'obsah');
Obdobn∞ se pro dvourozm∞rnΘ pole zadßvß obsah pole funkcφ Array2Set. Prvnφ parametr udßvß op∞t jmΘno pole, dalÜφ dva parametry udßvajφ index prvku a poslednφ parametr udßvß novou hodnotu:

V := Array2Set(V, radek, sloupec, 'obsah');
Pro naΦtenφ hodnoty jednorozm∞rnΘho pole se pou₧φvß funkce Array1Get, kde udßvß prvnφ parametr jmΘno pole a druh² parametr zadßvß index pole:

Writeln(Array1Get(v, poradi));
Obdobn∞ se p°istupuje k obsahu dvourozm∞rnΘho pole funkcφ Array2Get, kde udßvß prvnφ parametr jmΘno pole a dalÜφ dva parametry udßvajφ index pro p°φstup na konkrΘtnφ °ßdek a sloupec pole:

Writeln(Array2Get(v, radek, sloupec));
Vyu₧itφ prom∞nn²ch typu pole je velmi rozsßhlΘ. Jak ji₧ bylo uvedeno, je vhodnΘ je p°edevÜφm pou₧φvat pro seskupenφ v∞tÜφho poΦtu hodnot, ke kter²m je mo₧nΘ p°istupovat pomocφ indexu pole. Indexovan² p°φstup p°itom umo₧nφ zpracovßnφ obsahu pole v cyklech. K zadßnφ poΦßteΦnφho indexu pole m∙₧ete pou₧φt funkce Array1Low (jednorozm∞rnΘ pole) a Array2Low (dvourozm∞rnΘ pole). KoneΦn² index pole lze zjistit funkcφ Array1High (jednorozm∞rnΘ pole) a Array2High (dvourozm∞rnΘ pole).

ZφskanΘ znalosti o programovßnφ polφ m∙₧ete vyzkouÜet nap°φklad na v²poΦtu pr∙m∞rnΘ hodnoty nßhodnΘ veliΦiny funkcφ Random. Nejednß se o zcela efektivnφ p°φklad, proto₧e nenφ nutnΘ nßhodnΘ veliΦiny uklßdat do pole. Nynφ nßm jde spφÜe o vysv∞tlenφ principu pou₧φvßnφ polφ.


Unit Prumer;
interface
implementation

Var
   x      : Integer;
   soucet : Real;
   cislo  : Array;

begin
   ConsoleClear;
   ConsoleShow;

   {inicializace jednorozm∞rnΘho pole}
   cislo := Array1Create(1, 100);

   {cyklus pro celΘ pole}
   For x := Array1Low(cislo) to Array1High(cislo) do
   begin
       cislo := Array1Set(cislo,x,Random(100)); {nßhodnΘ Φφslo}
       Writeln(Array1Get(cislo,x));    {v²pis hodnoty}
   end;

   {v²poΦet souΦtu a pr∙m∞ru ulo₧en²ch hodnot}
   soucet := 0;
   For x := Array1Low(cislo) to Array1High(cislo) do
       soucet := soucet + Array1Get(cislo, x);
   Writeln('-------------');
   Writeln('SouΦet:'+IntToStr(soucet));
   Writeln('Pr∙m∞r:'+IntToStr(soucet/Array1High(cislo)));
end;
end.
V programu je deklarovßno pole se jmΘnem cislo, obsahujφcφ deset prvk∙. K jednotliv²m prvk∙m pole m∙₧ete p°istupovat pomocφ indexu pole. Pole nejprve naplnφme nßhodn²mi hodnotami. Nßsledn∞ je seΦteme a vypoΦφtßme a zobrazφme jejich pr∙m∞r.

V dalÜφm p°φklad∞ ji₧ budeme pracovat s dvourozm∞rn²m polem. VÜimn∞te si, ₧e prvky pole mohou b²t r∙znΘho typu.


Unit Pole;
interface
implementation

var v: Array;
    i: Integer;
    x: Integer;

begin
   ConsoleClear;
   ConsoleShow;

   {zalo₧φme dvourozm∞rnΘ pole}
   v:=Array2Create(1, 3, 0, 9);
   Writeln('Dimenze pole:'+IntToStr(ArrayDimCount(v)));

   {pro kontrolu zobrazφme rozsah polφ}
   Writeln('1.dimenze rozsah Low  ='
           +IntToStr(Array2Low (v, 1)));
   Writeln('1.dimenze rozsah High ='
           +IntToStr(Array2High(v, 1)));
   Writeln('2.dimenze rozsah Low  ='
           +IntToStr(Array2Low (v, 2)));
   Writeln('2.dimenze rozsah High ='
           +IntToStr(Array2High(v, 2)));

   {naplnφme pole poΦßteΦnφmi hodnotami}
   for i:= 0 to 9 do
       v := Array2set(v,1,i,i);
   for i:= 0 to 9 do
       v := Array2set(v,2,i,100/(i+1));
   for i:= 0 to 9 do
       v := Array2set(v,3,i,'Hodnota='+IntToStr(i));

   {vypφÜeme obsah polφ}
   Writeln(''); Writeln('Obsah pole1:');
   for i:= 0 to 9 do 
       Writeln(Array2get(v,1,i));
   Writeln(''); Writeln('Obsah pole2:');
   for i:= 0 to 9 do
       Writeln(Array2get(v,2,i));
   Writeln(''); Writeln('Obsah pole3:');
   for i:= 0 to 9 do
       Writeln(Array2get(v,3,i));
end;
end.
S prom∞nnou typu ARRAY (pole) je mo₧nΘ provßd∞t mimo v²Üe uveden²ch operacφ navφc i b∞₧nΘ p°i°azenφ obsahu jinΘ prom∞nnΘ.

Unit prg;
interface
implementation

Var pole, pok: array;

begin
   {inicializace pole}
   pole:=Array1Create(1, 3);

   {napln∞nφ hodnotou}
   pole := Array1Set(pole,1, 'KLONDAIK');

   {p°esun kompletnφho pole do jinΘ polo₧ky}
   pok := pole;

   {kontrolnφ v²pis obsahu polo₧ky pole}
   Writeln(Array1Get(pok,1));
end;
end.
Jak jste si jist∞ vÜimli, prom∞nnß pok byla sice deklarovßna jako pole, nebyla vÜak inicializovßna. Inicializace se provedla automaticky p°i°azenφm novΘho obsahu prom∞nnΘ polo₧kou, kterß byla jako pole inicializovßna. SouΦasn∞ s tφm se do prom∞nnΘ pok dosadily i hodnoty z p∙vodnφ prom∞nnΘ.

Jist∞ uznßte, ₧e mo₧nost tvorby a pou₧φvßnφ prom∞nn²ch typu pole je velmi zajφmavß. M∞jte vÜak na pam∞ti, ₧e zvlßÜt∞ dvourozm∞rnß pole zabφrajφ v pam∞ti dost prostoru. Bu∩te proto opatrnφ a nepou₧φvejte rozsßhlß mnohapolo₧kovß pole. Po inicializaci pole je vhodnΘ se volßnφm funkce ArrayDimCount p°esv∞dΦit, zda byla zadanß inicializace pole opravdu bezchybn∞ provedena.

DalÜφ jednoduch² p°φklad prßce s polem je uveden v programu DIMENZE.KLN. Jednoduch² p°φklad pou₧itφ polφ m∙₧ete nalΘzt v programu SPORTKA.KLN.


p°edchozφ lekce (1.18) obsah kurzu nßsledujφcφ lekce (1.20)

OZOGAN, 1 Mßje 97, 460 01 Liberec
tel.,fax: (048) 52 28 338, e-mail: info@ozogan.cz