Přestože jsme o polích již mluvili dříve a o kolekcích jsem se také párkrát zmínil, přestože jsem se o tom moc nerozepisoval, je toho ještě mnoho, co nevíme. Nejprve si zopakujeme pole, abychom mohli pokračovat dál.
Dim pole(5) As Integer
Dim pole() As Integer = {5, 476, 2, 4, 14, 16}
Dim pole(3, 2) As Integer
První řádek vytvoří prázdné pole o velikosti 6 prvků (prvek 0 až prvek 5). Druhý řádek vytvoří pole (také o velikosti 6, ale tu nezadáváme, prvky se spočítají automaticky) a předvyplní do něj hodnoty ve složené závorce. Třetí řádek vytvoří dvourozměrné pole o velikosti 4x3 prvky.
Dim pole() As Integer = {5, 476, 2, 4, 14, 16}
For i As Integer = 0 To pole.Length - 1
MsgBox(pole(i))
Next
Tato ukázka vypíše v MessageBoxu postupně všechny prvky pole. Řádek MsgBox(pole(i)) se postupně spustí pro i=0 až i=pole.Length - 1. Výraz pole.Length vrátí počet prvků v poli (tedy 6), jedničku odečítáme, protože se prvky číslují od nuly. Pro první MessageBox se tedy za i dosadí 0, tím pádem bude pole(i) rovno 5, takže MessageBox ukáže pětku. Pak se za i dosadí 1 a MessageBox ukáže 476. A tak to pokračuje až do i=5.
Hry s čísly
Abychom si pole trochu procvičili, spusťte si Visual Basic a zkuste si vyřešit tyto úkoly. Až budete hotovi, klikněte na odkaz Ukázat řešení. Můžete se podívat, jestli jste postupovali správně, případně kde máte chybu.
Zadání úkolů
Zadání je prosté. Máme zadáno toto pole o velikosti 20 prvků. V každé úloze musíte použít alespoň jeden cyklus For.
Dim pole(19) As Integer
Pokud si chcete ověřit, jestli vaše programy vyplnily pole správně, přidejte na konec procedury tento kód, který zapíše všechny prvky do proměnné t typu String a pak ji vypíše v MessageBoxu.
Dim t As String = pole(0)
For i As Integer = 1 To 19
t &= ", " & pole(i)
Next
MsgBox(t)
Úkoly
1) Napište program, který do jednotlivých prvků tohoto pole vypíše čísla od 10 do 29.
Jak jistě správně tušíte, je nutné projít všechny prvky tohoto pole. Vyjdeme-li z toho, že v proměnné i se vystřídají všechna čísla od 0 do 19 (což je nutné, abychom přistupovali do správných prvků pole), musíme každému prvku pole přiřadit hodnotu i + 10. Právě tak bude mít první hotnotu 10 a poslední 29.
For i As Integer = 0 To 19
pole(i) = i + 10
Next i
2) Napište program, který do jednotlivých prvků pole vypíše postupně násobky 3.
Zde je situace velmi podobná jako u první úlohy. Pokud projdeme pole stejným způsobem, musíme každému prvku přiřadit hodnotu i * 3. Hodnoty prvků budou skákat po třech, což přesně potřebujeme.
For i As Integer = 0 To 19
pole(i) = i * 3
Next i
3) Napište program, který prvnímu prvku přiřadí číslo 1 a do každého dalšího uloží dvojnásobek toho předchozího (tzn. 1, 2, 4, 8, 16 atd.)
Zde již budeme muset trochu změnit cyklus - první číslo vypíšeme "natvrdo" a cyklus poběží od jedničky. Přiřazovat budeme hodnotu pole(i-1) * 2. Hodnota pole(i) je aktuální prvek pole, hodnota pole(i-1) tedy zákonitě musí být prvek předchozí. Prvku pole(i) tedy přiřadíme hodnotu pole(i-1) * 2. Tady jen drobné upozornění - cyklus se nesmí spustit pro i = 0, protože bychom požadovali prvek pole(-1), což není možné, program by spadnul s chybovou hláškou. Do prvku pole(0) tedy přiřadíme ještě před samotným cyklem, který musí běžet od jedničky.
pole(0) = 1
For i As Integer = 1 To 19
pole(i) = pole(i - 1) * 2
Next i
Pokud máte rádi matematiku, jistě vás napadlo, že by stačilo projít pole normálně a přiřazovat hodnotu 2i. 20 se totiž rovná 1, 21 je 2, 22 je 4, 23 je 8 atd. Jsou to zkrátka mocniny dvojky. Visual Basic má operátor pro umocňování, a to znak ^ (napíše se třeba levý Alt + 94 na num. klávesnici). Jednodušší varianta je tedy takto:
For i As Integer = 0 To 19
pole(i) = 2 ^ i
Next i
Pokud však umocňovat ze školy neumíte, nedělejte si s tím hlavu. Obejdete se i bez toho, občas se to však hodí.
4) Napište program, který do jednotlivých prvků pole vypíše postupně čísla od 20 do 1. Pole tedy bude vypadat takto: (20, 19, 18, 17 ... 2, 1).
Procházíme opět úplně stejně, akorát přiřadíme hodnotu 20 - i. V i je totiž na začátku 0, takže první pole vyjde 20. V posledním poli je v i hodnota 19, takže výraz vyjde 1. Nebo můžete první prvek přiřadit opět natvrdo a do každého dalšího ukládat hodnotu o 1 nižší.
5) Napište program, který pole vyplní tímto způsobem: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1).
Tady bude jistě vhodné rozdělit si úlohu na dvě části - nejprve vyplníme první polovinu a poté druhou.
For i As Integer = 0 To 9
pole(i) = i + 1
Next i
For i As Integer = 10 To 19
pole(i) = 20 - i
Next i
Uvedená řešení nejsou samozřejmě jediná možná. Pro každou úlohu existuje daleko víc možností, uvedl jsem ty, které mě napadly nejdříve. Pokud jste tyto úlohy zvládli, tak je to dobře. Pokud ne, zkuste si připomenout sedmý díl tohoto seriálu.
Kolekce
V minulých dílech jsme s kolekcemi pracovali. Jen zběžně jsem napsal, že kolekce je jakési "chytřejší pole". Podíváme se na ně tedy blíže.
Každé pole má několik vlastností a tzv. metod. Pokud do Visual Basicu napíšeme název nějakého již nadeklarovaného pole a zmáčkneme tečku, prostředí si automaticky domyslí, že chceme použít právě jeho vlastnost nebo metodu a nabídne nám jejich seznam. Stejně tak to funguje u komponent a u jakýchkoliv objektů.
Pokud tedy napíšete název nějakého nadeklarovaného pole a za něj tečku, Visual Studio vám nabídne možnosti. My jsme již používali vlastnost Length pole, která vrátí počet prvků. Máme k dispozici i další metody a vlastnosti, ale těmi se zatím zabývat nebudeme.
Nyní napište Me.Controls a tečku. Me odkazuje na třídu nebo formulář, na kterém právě jsme. Každý formulář má kolekci Controls, ve které má uložený seznam všech komponent, které na něm jsou. Pokud tedy napíšeme Me.Controls a tečku, ukáže se nám seznam metod a vlastností kolekce. Je rozhodně o něco bohatší.
Kolekce je vlastně takové "nafukovací pole". Nikde není předem řečeno, jaký má počet prvků. Slouží k podobným účelům jako pole - k uchování více hodnot. My si teď řekneme o základních metodách kolekcí. Každá kolekce takové metody má (pokud není ReadOnly, tedy jen pro čtení).
Přidávání prvků do kolekce
Do kolekcí jsme již prvky přidávali (např. při plnění seznamu ListView v předminulém díle). Vytvořili jsme nový objekt ListViewItem, nastavili jsme mu nějaké hodnoty a předali jej metodě Add kolekce Listview1.Items, což je kolekce položek v tomto seznamu. Obecné schéma vypadá takto:
<kolekce>.Add(<hodnota>)
Vymazání kolekce
Občas potřebujeme vymazat všechny položky v kolekci, k tomu slouží metoda Clear.
<kolekce>.Clear()
Odstranění prvku z kolekce
Prvky můžeme z kolekce mazat. Buď máme v nějaké proměnné přímo objekt, který chceme vymazat, v takovém případě použijeme metodu Remove a objekt jí předáme, nebo známe jen jeho index v kolekci (číslovaný od nuly), proto máme metodu RemoveAt. Jakmile ale objekt smažeme, změní se pořadí objektů následujících (posune se o 1 dolů).
<kolekce>.Remove(<objekt>)
<kolekce>.RemoveAt(<pořadí v kolekci>)
Počet prvků v kolekci
Kolekce má na rozdíl od pole pro zjištění počtu prvků vlastnost Count.
Nalezení objektu v kolekci
Pokud potřebujeme získat pořadí (index) objektu, použijeme metodu IndexOf, která toto pořadí vrátí. Pokud objekt nenajde, vrátí -1, s tím je dobré počítat.
Dim index As Integer = <kolekce>.IndexOf(<objekt>)
Přímý přístup k prvku kolekce
Pokud chceme vytáhnout třetí prvek z kolekce, je to stejné jako u pole. Za název kolekce přidáme do závorky index prvku (číslovaný od nuly, takže 2).
Závěrem
To je pro dnešek vše. Kolekce si prakticky již ukazovat nebudeme, až v některém z příštích dílů. Důležité je, že víme, jak fungují. Umíme také vytvořit objekt, takže si můžete hrát se seznamem ListView. Doufám, že vás tato dávka teorie neotrávila, příště se vrhneme na práci s textem. Pokud máte jakékoliv návrhy nebo máte pocit, že něčemu nerozumíte, pište do diskuse, pokusím se to vysvětlit lépe.