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 KLONDAIK 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 vícerozmě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. Rozsah indexů pole začíná vždy od nuly.

S proměnnou typu Array (pole) se pracuje jinak, než s běžnou proměnnou. Proměnnou musíte nejprve pomocí příkazu Dim deklarovat. Rozsah pole je možné uvést ihned při jeho deklaraci. Rozsah pole se uvádí číslem v závorce za jménem pole. To je vhodné, pokud znáte již při zápisu programu požadovaný rozsah pole. Pokud požadovaný rozsah pole neznáte, je možné uvést v deklaraci pole pouze prázdné závorky. Tím je definováno dynamické pole, jehož velikost je možné změnit příkazem ReDim.


Dim Jmeno(10)    'pole pro 10 jmen
Dim Osoby()      'dynamické pole 
Pole má po své deklaraci naplněny své položky prázdnou hodnotou typu Variant. V programu můžete potom vložit do jednotlivých buněk hodnoty libovolného typu. K jednotlivým položkám pole můžete přistupovat běžným způsobem, musíte však uvést vždy index položky pole, se kterou budete chtít pracovat:

Dim Pole(9)
For X = 0 to 9
    Pole(X) = 0  'uložení hodnoty
Next
Uvedený příklad nuloval pole s indexy od 0 do 9. Toto pole obsahuje tedy deset prvků - s indexy od nuly do 9. Do každé položky pole byla vložena nulová číselná hodnota. Stejně jednoduchým způsobem je také možné číst jednotlivé položky pole:

For X = 0 to 9
    Writeln(Pole(X)) 'čtení hodnoty
Next
Obdobným způsobem se pracuje i s vícerozměrným polem. Při přístupu k vícerozměrnému poli je však nutné uvádět příslušné vícenásobné přístupové indexy:

Dim Pole(3, 10)
For X = 0 to 3
    For Y = 0 to 9
       Pole(X, Y) = 0      'uložení hodnoty
       Writeln(Pole(X, Y)) 'čtení hodnoty
    Next
Next
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.

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 Lbound a Ubound. Díky tomu je například možné nulovat položky pole následujícím způsobem:


'jednorozměrné pole 
Dim Pole1(9)
For X = LBound(Pole1) to UBound(Pole1)
    Pole1(X) = 0
Next

'dvourozměrné pole 
Dim Pole2(3, 10)
For X = LBound(Pole2,1) to UBound(Pole2,1)
    For Y = LBound(Pole2,2) to UBound(Pole2,2)
       Pole2(X, Y) = 0
    Next
Next
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 LBound a UBound.

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í Rnd. 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í.


Sub Main()
    ConsoleClear
    ConsoleShow
    Randomize

    'inicializace jednorozměrného pole
    Dim Cislo(9) '0 až 9 = 10 polí

    'cyklus pro celé pole
    For X = LBound(Cislo) to UBound(Cislo)
       Cislo(X) = Int(Rnd*100)  'náhodné číslo od 0 do 100
       Writeln(Cislo(X))        'výpis hodnoty cisla
    Next

    'výpočet součtu a průměru uložených hodnot
    Soucet = 0
    For X = LBound(Cislo) to UBound(Cislo)
        Soucet = Soucet + Cislo(X)
    Next
    Writeln("-------------")
    Writeln("Součet:"+CStr(Soucet))
    Writeln("Průměr:"+CStr(Soucet/(UBound(Cislo)+1)))
End Sub
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.

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


Dim Pole1(5)
Dim Pole2
Pole1(2) = "BONANZA"
Pole2 = Pole1
Writeln(Pole2(2)) 'vypíše BONANZA
Jak jste si jistě všimli, proměnná Pole2 byla deklarována jako běžná proměnná. Přiřazením nového obsahu proměnné položkou, která byla deklarována jako pole je následně možné k této položce přistupovat také jako k proměnné typu pole. Současně s tím se do proměnné Pole2 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ě vícerozměrná pole zabírají v paměti dost prostoru. Buďte proto opatrní a nepoužívejte rozsáhlá mnohapoložková pole.

Další jednoduchý příklad práce s polem je uveden v programu DIMENZE.BON Jednoduchý příklad použití polí můžete nalézt i v programu SPORTKA.BON.


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