V tomto díle s mírně zemědělským tématem se budeme věnovat polím, což jsou jedny z nejpoužívanějších programátorských datových struktur. Jednoduché pole si můžete představit jako nějakou tabulku, která má několik sloupců a jeden řádek. S touto tabulkou pracujeme úplně stejně jako s proměnnou - musíme jí přiřadit datový typ, aby Visual Basic věděl, co do ní budeme ukládat. Do každé buňky tohoto pole můžeme uložit nějakou hodnotu, abychom si ji mohli později vytáhnout. Každé pole má také svůj název.
Existují dva druhy polí - statická a dynamická. U statických víme ještě před spuštěním programu, kolik položek budou obsahovat. U dynamických se to dozvíme až těsně před nahráním těchto položek do pole, ale rozhodně ve chvíli, kdy program již běží. Ze začátku se budeme věnovat pouze polím statickým.
Každé pole se, stejně jako každá proměnná, musí deklarovat. Deklarace je velice podobná deklaraci proměnné:
Dim pole(5) As Integer
Jediné, co je pro nás nové, je číslo 5 v závorce. Toto číslo udává číslo poslední buňky v poli. Buňky se číslují od nuly, takže v tomto poli je jich 6 - první buňka má číslo nula, druhá číslo jedna atd., šestá tedy číslo pět. Každá buňka pole se chová jako samostatná proměnná, na ukázce je vidět přiřazování do proměnné.
pole(2) = 156
pole(4) = -32
Do třetí buňky pole jsme uložili číslo 156 a do páté buňky číslo -32. Tyto dvě hodnoty jsou ale nezávislé, pátou buňku můžeme měnit a hodnota ve třetí pořád zůstane beze změny. Číslo v závorce je číslo buňky, se kterou pracujeme. Jako všude jinde i místo čísla v závorce můžeme zapsat nějakou proměnnou nebo nějaký výraz a v tom je právě síla polí. V kombinaci s cykly tedy můžeme pracovat s buňkami hromadně.
V programech často potřebujeme pracovat s mnoha údaji stejného typu a stejné funkce - a k tomu se právě pole hodí. Představte si, že bychom měli třeba program, kterému bychom každý den zadali průměrnou denní teplotu. Kdybychom neměli pole, udělali bychom si pro každý den vlastní proměnnou a data bychom měli v sedmi proměnných. Teď si ale představte, že budeme muset najít v těchto hodnotách tu nejvyšší. Museli bychom napsat několik podmínek, které by složitě porovnávaly proměnné mezi sebou. A kdyby si pak někdo vzpomněl, že chce jeden den přidat, tak bychom ho asi zabili. Vhodnou kombinací cyklů a polí dosáhneme toho, že nebudeme závislí na počtu položek.
Velmi jednoduchý je i výpis položek pole pomocí cyklu. Tento program zobrazí pro každou položku pole zprávu s hodnotou daného prvku:
Dim pole(5) As Integer
pole(0) = 5 : pole(1) = 476 : pole(2) = 2 : pole(3) = 4 : pole(4) = 14 : pole(5) = 16
For i As Integer = 0 To pole.Length - 1
MsgBox("Hodnota buňky " & i & " je " & pole(i) & ".")
Next
Řádek uvnitř cyklu se spustí šestkrát, protože pole.Length vrací počet buňek v poli, tedy 6, ale protože číslujeme od nuly, musíme jedničku odečíst. Hodnota pole.Length - 1 je tedy 5, cyklus poběží od nuly do pěti. Při prvním průchodu cyklu bude v proměnné i nula, pole(0) je 5, takže se vypíše text Hodnota buňky 0 je 5. Pak se řádek spustí znovu, v i bude jednička, takže se vypíše Hodnota buňky 1 je 476. atd. Takto proběhne celý cyklus a vypíše se celé pole. Pokud pole zvětšíme a "nalijeme" do něj více položek, projde se opět celé, protože pole.Length vrátí počet položek v poli. Nezáleží tedy na počtu položek pole, tímto cyklem projdeme pole celé.
V tomto zápisu je ještě jedna zvláštnost. Pokud chceme "nacpat" více příkazů na jeden řádek, oddělíme je dvojtečkou. Samozřejmě bychom druhý řádek mohli rozdělit na šest řádků. Dvojtečka se chová stejně jako konec řádku.
Přičítání do proměnné
Pokud máme proměnnou b a potřebujeme do ní uložit hodnotu např. 67, napíšeme b = 67. Pokud ale v proměnné máme nějakou hodnotu a potřebujeme k ní 67 přičíst, musíme napsat b += 67. Obdobně to platí pro odečítání, násobení a dělení. Operátor += tedy přičítá.
Suma pole
S polem se dá dělat tisíc věcí, třeba sečíst všechny jeho prvky. Jak? Velice jednoduše - pomocí cyklu. Musíme si akorát založit proměnnou suma, do které budeme přičítat postupně každou další buňku pole. Součet prvků pak vypadá takto:
Dim pole(5) As Integer
pole(0) = 5 : pole(1) = 476 : pole(2) = 2 : pole(3) = 4 : pole(4) = 14 : pole(5) = 16
Dim suma As Integer = 0
For i As Integer = 0 To pole.Length - 1
suma += pole(i)
Next
MsgBox("Součet prvků pole je " & suma & ".")
Rychlé naplnění pole
Pokud potřebujeme nadeklarovat nové pole a rychle jej naplnit (postupné přiřazování jsem použil proto, abyste nebyli zahlceni teorií), můžeme použít také tento zápis.
Dim pole() As Integer = {5, 476, 2, 4, 14, 16}
Všimněte si, že nezadáváme velikost pole, závorky však napsat musíme.
Dvojrozměrná a vícerozměrná pole
Zatím jsme pracovali pouze s poli jednorozměrnými. Takové pole má pouze 1 řádek a několik sloupců. To by nám však nestačilo, velmi často potřebujeme plnohodnotnou tabulku s několika řádky a několika sloupci. K tomu slouží dvojrozměrné pole. Deklarace a použití je obdobné:
Dim dv(15, 15) As Integer
dv(0, 3) = 15
Pro součet všech hodnot by ovšem byly potřeba dva cykly v sobě (rozměry pole jsem vypsal napevno, při jejich zjišťování se nedá použít Length, ale getUpperBound(d), kde d je číslo rozměru pole číslované od nuly, první rozměr je tedy nula, druhý jedna atd.):
Dim suma As Integer = 0
For i As Integer = 0 To 15
For j As Integer = 0 To 15
suma += dv(i, j)
Next
Next
MsgBox(suma)
Můžeme udělat pole o i o více rozměrech, v praxi se s nimi příliš často nesetkáváme. Další rozměry se přidávají obdobně.
Tento díl byl velmi teoretický, příště se nebudeme učit nic nového, zato však budeme hodně programovat. Protože tento seriál vzniká na základě odezvy jeho čtenářů, rád bych vás všechny poprosil o případné připomínky a dotazy do diskuse. Pokud nějakou část z cyklů nebo polí nechápete, určitě se ozvěte.