Články

Tisk článku Tisk článku

Kolekce a pole

[Zpět na kategorii]

Datum: 27. 7. 2007 11:38       Autor: Tomáš Herceg       Zobrazeno: 18702x

Kategorie: Začínáme

Témata: VB.NET

Seriál: VB.NET od začátku - Díl 11.

V tomto díle seriálu se budeme podrobněji věnovat polím a kolekcím. Zaprogramujete si také trochu sami, protože pro vás je připraveno pět jednoduchých úkolů na práci s polem. Zvládnete je? Doufám, že ano.


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
  'pro každý prvek pole
  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.

'výpis hodnot pole
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.

2) Napište program, který do jednotlivých prvků pole vypíše postupně násobky 3.

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

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

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

 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.


> Na začátek

 

Hodnocení:

Hlasů: 21
Zvolte své hodnocení

Tomáš Herceg

Jsem hlavním softwarovým architektem ve společnosti Riganti. Mám dlouholeté zkušenosti s technologiemi ASP.NET, Silverlight, WPF a XNA. Působím též jako lektor ve společnosti Gopas a již třetím rokem jsem držitelem ocenění Microsoft Most Valuable Professional.

Podpořte vznik dalších článků

Související články

DílNázev článku 
Díl 1. Úvod, vývojové prostředí a základní pojmy 25. 4. 2007
Díl 2. Začínáme programovat 25. 4. 2007
Díl 3. Proměnné a datové typy 25. 4. 2007
Díl 4. Podmínky a operátory 26. 4. 2007
Díl 5. Složitější podmínky a rozhodovací struktury 26. 4. 2007
Díl 6. Cyklus For 5. 5. 2007
Díl 7. Pole 9. 5. 2007
Díl 8. Pole, cykly a práce se soubory 14. 5. 2007
Díl 9. Přidáváme druhý formulář 18. 5. 2007
Díl 10. Funkce a procedury 6. 7. 2007
Díl 11. Kolekce a pole 27. 7. 2007
Díl 12. Práce s textem a řetězci 17. 8. 2007
Díl 13. Úvod do grafiky 27. 8. 2007
Díl 14. Vykreslujeme graf 31. 8. 2007
Díl 15. Práce se soubory, úvod do objektově orientovaného programování 19. 11. 2007
Díl 16. Třídy a funkce .NET frameworku, o kterých je dobré vědět 31. 12. 2007
Díl 17. Objektově orientované programování - základy 30. 6. 2008
Díl 18. Dědičnost 6. 10. 2008

RSS Feed RSS Feed

Diskuse

Diky

Datum: 30.7.2007 1:48
Autor: neregistrovaný (85.207.186.189)
Hodnocení autora: není
Příspěvků: 0
Diky za dalsi pokracovani.

Kejli
 
           [Odpovědět]
 
Hodnocení: 2 Čekejte, prosím...

:o)

Datum: 14.8.2007 11:56
Autor: neregistrovaný (62.77.95.233)
Hodnocení autora: není
Příspěvků: 0
... těším se na pokračování.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Poradíte, jak převést tento CMD příkaz do VB 2oo5 skriptu?

Datum: 15.8.2007 12:24
Autor: neregistrovaný (62.77.95.233)
Hodnocení autora: není
Příspěvků: 0
%SystemRoot%\System32\Reg.exe ADD "HKCU\Control Panel\Mouse" /v MouseSensitivity /t REG_SZ /d 6 /f


Syntaxe neřve, ale příkaz se neprovede:

Dim WriteToReg
WriteToReg = Shell("C:\Windows\System32\Reg.exe ADD HKCU\Control Panel\Mouse /v MouseSensitivity /t REG_SZ /d 6 /f")
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Poradíte, jak převést tento CMD příkaz do VB 2oo5 skriptu?

Datum: 15.8.2007 12:30
Autor: neregistrovaný (62.77.95.233)
Hodnocení autora: není
Příspěvků: 0
Odpovím si sám: Příkaz musí vypadat takto:

WriteToReg = Shell("C:\Windows\System32\Reg.exe ADD ""HKCU\Control Panel""\Mouse /v MouseSensitivity /t REG_SZ /d 6 /f")

:o)
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Malá chybička

Datum: 22.10.2007 11:09
Autor: neregistrovaný (84.16.113.50)
Hodnocení autora: není
Příspěvků: 0
Na somtném začátku tohoto dílu se vloudila do přepisu malá chybyčka:

Třetí řádek vytvoří dvourozměrné pole o velikosti 4x3 prvky (myslím, že tam má být něco jiného)
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: Malá chybička

Datum: 23.10.2007 9:10
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
Ne, je to správně. Protože pole se indexují od nuly, deklarace

Dim a(5) As Integer
 
udělá pole o velikosti 6 prvků. Prvním prvkem je pochopitelně a(0), posledním je a(5). Tady je totiž drobná odlišnost od ostatních jazyků, kdy při deklaraci pole udáváte počet položek. Ve VB se udává vždy index posledního prvku.
Díky tomu deklarace

Dim a(3, 2) As Integer
 
opravdu vytvoří pole o velikosti 4x3.
Tady jsem to již nezdůrazňoval, je to jen opakování ze 7. dílu, který se polím věnuje.
 
           [Odpovědět]
 
Hodnocení: 2 Čekejte, prosím...

technická

Datum: 11.2.2008 13:28
Autor: Michal Tichý
Hodnocení autora: 3
Příspěvků: 2
Dobrý den,
malá technická, u druhého příkladu by i mělo jít od 1 do 20. Při Vašem zápisu se zapíše do pole(0) nula, což není násobek trojky.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: technická

Datum: 11.2.2008 21:11
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
No, já osobně nulu za násobek trojky považuji, protože 0 x 3 = 0. Nevím, jestli to je správně, ale myslím, že to je nepodstatný detail.
 
           [Odpovědět]
 
Hodnocení: 4 Čekejte, prosím...

Indexování objektů

Datum: 15.3.2009 8:50
Autor: neregistrovaný (90.178.88.184)
Hodnocení autora: není
Příspěvků: 0
Ve VB6 se velmi snadno indexují objekty - Label1(1), Label(2)...
Existuje něco podobného ve Visual Basicu 2008?
V. Sova
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Indexování objektů

Datum: 15.3.2009 8:59
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
Existuje, ale nejde to naklikat, musíte si komponenty vytvořit kódem.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Indexování objektů

Datum: 16.3.2009 17:56
Autor: neregistrovaný (90.178.88.184)
Hodnocení autora: není
Příspěvků: 0
A ten kód byste nenapověděl - možná bude stačit ťuknout. Díky.
V. Sova
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Indexování objektů

Datum: 16.3.2009 18:18
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Indexování objektů

Datum: 16.3.2009 18:58
Autor: neregistrovaný (90.178.88.184)
Hodnocení autora: není
Příspěvků: 0
Díky - funguje to.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

dotaz

Datum: 29.1.2011 12:20
Autor: neregistrovaný (212.80.64.214)
Hodnocení autora: není
Příspěvků: 0

proč pišeš na konci "Next i"
nic to neudělá

tak bych chtel vedet vyznam - myslim ze jsi to tu nikde nepsal

alevypada to ze to tu docela vyhaslo a 2 roky tu nikdo nebyl..
snad mi nekdo odepise :S
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: dotaz

Datum: 4.2.2011 20:59
Autor: neregistrovaný (89.176.88.227)
Hodnocení autora: není
Příspěvků: 0
Asi neni od veci precist si v pripade podobnych nejasnosti Microsofti help (oznacit mysi + f1).

Je to dobrovolny udaj counteru. Kdyz je vic vnorenych cyklu, je tak prehlednejsi ktery Next patri ke kteremu For a zaroven compiler cloveka upozorni, kdyz to pomota/nechtene smaze.

Viz priklad v dokumentaci:

For indexA = 1 To 3
    ' Create a new StringBuilder, which is used
    ' to efficiently build strings.
    Dim sb As New System.Text.StringBuilder()

    ' Append to the StringBuilder every third number
    ' from 20 to 1 descending.
    For indexB = 20 To 1 Step -3
        sb.Append(indexB.ToString)
        sb.Append(" ")
    Next indexB

    ' Display the line.
    Debug.WriteLine(sb.ToString)
Next indexA
' Output:
'  20 17 14 11 8 5 2
'  20 17 14 11 8 5 2
'  20 17 14 11 8 5 2

 
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.