Články

Tisk článku Tisk článku

Pole

[Zpět na kategorii]

Datum: 9. 5. 2007 20:48       Autor: Tomáš Herceg       Zobrazeno: 26237x

Kategorie: Začínáme

Témata: VB.NET

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

V tomto spíše teoretičtějším díle se podíváme na pole a ukážeme si na několika příkladech, k čemu se nám mohou hodit. Důležitá je jejich kombinace s cyklem For, na kterou se v tomto a v dalších dílech zaměříme.


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.


> Na začátek

 

Hodnocení:

Hlasů: 51
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

Nefunkční deklarace VBasic 6.3

Datum: 19.10.2007 15:19
Autor: neregistrovaný (195.113.1.32)
Hodnocení autora: není
Příspěvků: 0
Když si definuji funkci v Excelovském dokumentu a v ní použiju příkaz z Vašeho návodu:

Dim pole() As Integer = {5, 476, 2, 4, 14, 16}

objeví se chybová hláška (na rovnítku)

Compile error: Expected: end of statement

Nemohu deklarovat pole a nastavit mu počáteční hodnoty. V čem může být chyba? Děkuji za odpověď. Kunčar
 
           [Odpovědět]
 
Hodnocení: -3 Čekejte, prosím...

Re: Nefunkční deklarace VBasic 6.3

Datum: 19.10.2007 15:46
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
VBA, tedy Visual Basic For Applications, tedy to, co je v Microsoft Office aplikacích, není Visual Basic .NET, proto zde tento postup nefunguje. VB.NET je novější a jde téměř o úplně jiný jazyk, většina ukázek z tohoto serveru vám ve VBA nebude fungovat. To samé platí i pro Visual Basic 6 i pro VBScript.
Pokud potřebujete nadeklarovat pole s hodnotami, musíte nejprve vytvořit pole a pak ručně do jeho buněk nastavit hodnoty jednu po druhé. Musíte také předem zadat velikost pole.

Dim pole(0 To 5) As Integer
pole(0) = 5
pole(1) = 476
'atd. ...
 
 
           [Odpovědět]
 
Hodnocení: 4 Čekejte, prosím...

Věčný začátečník

Datum: 6.12.2007 12:38
Autor: neregistrovaný (193.179.220.253)
Hodnocení autora: není
Příspěvků: 0
Nemám zatím nic do diskuse, jen považuji za vhodné autora pochválit a povzbudit do další práce, jelikož dělá velice záslužnou činnost a doufám že vytrvá. Zatím hodně zdaru a určitě se později zapojím, jelikož mám zájem se něco smysluplného naučit. A ještě malou poznámku na konec. Určitě by bylo k dobru věci, kdyby jste více používal praktické příklady ze života, na nichž by byl více patrný praktický smysl programování.

S pozdravem

Věčný začátečník, který s tím chce něco udělat(mé indiánské jméno)
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

dotaz

Datum: 17.3.2008 19:39
Autor: neregistrovaný (88.100.109.83)
Hodnocení autora: není
Příspěvků: 0
'chci se zeptat, jakej je rozdíl mezi b += 67 a b + 67?'
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: dotaz

Datum: 19.3.2011 18:04
Autor: neregistrovaný (85.207.129.23)
Hodnocení autora: není
Příspěvků: 0
b += 67 odpovídá zápisu b = b + 67
 
           [Odpovědět]
 
Hodnocení: 3 Čekejte, prosím...

Redim a Redim preserve

Datum: 28.3.2008 16:39
Autor: neregistrovaný (195.12.129.10)
Hodnocení autora: není
Příspěvků: 0
Ja by som len doplnil :
Existuje príkaz Redim, pomocou ktorého môžme zmeniť počet prvkov poľa.
Napr. Redim arr(5) nastaví počet prvkov poľa arr na 6(0-5), pričom obsah všetkých prvkov sa premaže.
Keď chceme zmeniť počet prvkov tak aby ich obsah ostal zochovaný, použijeme Redim Preserve arr(5)
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: Redim a Redim preserve

Datum: 28.3.2008 16:42
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
Děkuji za doplnění, nutno však podotknout, že se pole nezvětší či nezmenší, ale vytvoří se nové a stávající obsah se do něj překopíruje. Takže to nedoporučuji používat pro velká pole, já osobně to nepoužívám vůbec.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: Redim a Redim preserve

Datum: 30.3.2008 12:09
Autor: Václav Antošík
Hodnocení autora: 41
Příspěvků: 102
Môžem sa spýtať z kade máš tú informáciu, že sa vytvára nové pole? Nie, že by som ti neveril, ale chcel by som si to pozrieť.
Je alternatívou použiť System.Collections.ArrayList, čím by som vlastne v danom momente šetril pamäť?
 
           [Odpovědět]
 
Hodnocení: -2 Čekejte, prosím...

Re: Redim a Redim preserve

Datum: 30.3.2008 13:04
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
No, stačí se podívat trochu do dokumentace, jak pole funguje uvnitř. .NET framework neumí pole už zvětšit, navíc pole může být jen v souvislém bloku paměti a když hned za skončením pole je něco jiného, nemá se pole kam zvětšit. Nejde o úsporu paměti, paměť po starém poli se dá využít, jde o to, že pokud máte třeba pole nějakých větších struktur a budete dělat Redim Preserve moc často, zbytečně tím budete vytěžovat procesor.
ArrayList dělá víceméně to samé, nejdřív si udělá pole tuším že o velikosti 4 prvky a když už se další prvek nevejde, vytvoří se pole s dvojnásobnou velikostí a hodnoty se opět překopírují. Prakticky není možné existující pole zvětšit. ArrayList akorát pole nezvětšuje tak často, takže se rozhodně vyplatí. A navíc je to jednoduché na použití.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: Redim a Redim preserve

Datum: 30.3.2008 13:21
Autor: Václav Antošík
Hodnocení autora: 41
Příspěvků: 102
Mám v pamäti pole A a chcem ho zväčsiť na pole B. Čiže .NET framework vytvorí zväčšené pole B'(v tomto momente sú v pamäti súčastne pole A aj pole B)' prekopíruje obsah A do B a A uvoľní z pamäte. Dobre som to pochopil? Dá sa tomuto javu nejak predísť?
 
           [Odpovědět]
 
Hodnocení: -4 Čekejte, prosím...

Re: Redim a Redim preserve

Datum: 30.3.2008 14:05
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
Umíte číst a chápat text? Přesně tohle jsem v předchozím příspěvku napsal. Předejít se tomu nedá, jediná možnost je snažit se zvětšovat pole co nejméně, tzn. nezvětšovat např. po přidání jedné položky. Nejjednodušší je použít List nebo ArrayList a nemusíte se o velikost starat. Ale existující pole se zvětšit nedá, vnitřně se vytvoří nové větší a obsah se překopíruje.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Dotaz:

Datum: 30.8.2008 10:41
Autor: neregistrovaný (212.24.150.226)
Hodnocení autora: není
Příspěvků: 0
Dobrý den, měl bych dotaz jak udělat průměr desetiných čísel jsem použil tento kód:

TextBox4.Text = ((TextBox1.Text) + Val(TextBox2.Text) + Val(TextBox3.Text)) / 3
 
Když jsem deklaroval textboxy jako double, nic se nedělo, prosím o radu. (Je mi 14 tak prosím ať to pochopím :D)
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: Dotaz:

Datum: 30.8.2008 11:27
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
Chybí vám tam Val před TextBox1.Text. U ostatních to tam máte.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

ubound?

Datum: 8.3.2009 19:49
Autor: Vítězslav Grygar
Hodnocení autora: 5
Příspěvků: 17
Je nějaký rozdíl mezi pole.Length a Ubound(pole)??
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: ubound?

Datum: 8.3.2009 22:46
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
UBound je přežitek ze starého VB, doporučuje se používat Length. Co se týče hodnot, UBound vrací tuším index poslední položky, Length počet položek, tedy o jednu více.
Používejte Length, je o dost rychlejší a pokud budete mít kód v C#, bude to stejné - tam žádné UBound nemají. Obecně je lepší se vyhnout přežitkům z VB, většina lidí, co píšou v .NETu, budou potkávat i C#, takže je lepší používat funkce, které jsou společné.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: ubound?

Datum: 9.3.2009 16:01
Autor: Vítězslav Grygar
Hodnocení autora: 5
Příspěvků: 17
díky za objasnění
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Uvolnění nepotřebného pole

Datum: 19.6.2009 15:19
Autor: Hellis
Hodnocení autora: 3
Příspěvků: 51
Dobrý den,

rád bych se zeptal, zda je v případě kdy již v programu nepotřebuji určité pole vhodné toto pole určitým způsobem uvolnit (např. Redim(0), Erase ...) ať jej program již nemusí držet v paměti, nebo se o něj nemusím starat a vše obstará GC. Děkuji za odpověď.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Uvolnění nepotřebného pole

Datum: 19.6.2009 15:44
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
Pokud ho máte v lokální proměnné někde v proceduře, zruší se samo, jakmile procedura skončí. Pokud jej máte ve formuláři (mimo proceduru), pak se samo zruší typicky až při ukončení aplikace. Pokud chcete umožnit, aby se mohlo uvolnit dřív (což se ale nemusí stát, o tomhle rozhoduje GC), přiřaďte do té proměnné s polem hodnotu Nothing.

pole = Nothing
 
Tím se zruší poslední reference na to pole a GC jej bude moci uvolnit dříve, než by to udělal běžně. To, jestli to udělá, to už je jiná pohádka.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Uvolnění nepotřebného pole

Datum: 19.6.2009 16:53
Autor: neregistrovaný (147.229.216.77)
Hodnocení autora: není
Příspěvků: 0
Díky za odpověď.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Nevím

Datum: 20.10.2009 19:13
Autor: neregistrovaný (86.61.239.132)
Hodnocení autora: není
Příspěvků: 0
Ahoj já jsem celkově nepochopil o co tady jde nemohl bys mi prosím napsat celkvoě o ce tady vlstně jde aale jinak se mi tento serial stašně líbí je fak best.
 
           [Odpovědět]
 
Hodnocení: -7 Čekejte, prosím...

Delenie poli

Datum: 20.10.2009 22:01
Autor: neregistrovaný (85.216.252.82)
Hodnocení autora: není
Příspěvků: 0
Ahoj, chcem sa opytat ci je mozne vo VB nieco ako delenie viacrozmernych poli, alebo delenie matic(t.j. opak mmult). a tiez keby si mi pls mohol napisat nejaky vzor kodu pre nasobenie matic mmult. dakujem.
maja
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

přesná desetiná čísla

Datum: 17.11.2009 8:18
Autor: neregistrovaný (86.49.77.207)
Hodnocení autora: není
Příspěvků: 0
Existuje ve VB2008 Express Edition nějaký datový typ přesnější než Double? Chtěl jsem totiž udělat kalkulačku do by sčítala, odčítala apod. i desetinná čísla a i 3,5 + 3,8 (v Double) my vyšlo 7.0

Děkuji předem za odpověď.
Orbb
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: přesná desetiná čísla

Datum: 17.11.2009 14:38
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
Tak to tam máte něco blbě, Double má přesnost zhruba 15 platných číslic.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: přesná desetiná čísla

Datum: 18.11.2009 13:49
Autor: neregistrovaný (86.49.61.131)
Hodnocení autora: není
Příspěvků: 0
Udělal jsem ji celou znova a už to funguje, nevím teda v čem byl problém a chtěl bych vás pochválit za tento cyklus článků pro začátečníky.

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

Dvojrozměrná pole

Datum: 3.4.2010 13:57
Autor: neregistrovaný (94.112.231.100)
Hodnocení autora: není
Příspěvků: 0
Chtěl bych se zeptat. Když mám dvojrozměrná pole, co to je vlastně jejich součet, jak si to mám představit.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Dvojrozměrná pole

Datum: 19.3.2011 18:11
Autor: neregistrovaný (85.207.129.23)
Hodnocení autora: není
Příspěvků: 0
Myslím, že je to součet čisel ve všech buňkách, např. pro

1  3  27 94 65
24 52 46 6  4
 
by to mělo být

1 + 3 + 27 + 94 + 65 + 24 + 52 + 46 + 6 + 4
 
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

syntax error

Datum: 19.5.2011 12:45
Autor: neregistrovaný (213.220.198.105)
Hodnocení autora: není
Příspěvků: 0
když chci provést jednoduchou početní operaci a pak kod debuguju objeví se mi v error list chyba:syntax error.Ukazuje na jedno předem zadané číslo(konkrétně 1).Co to prosím znamená?Jak se to dá vyřešit?
 
           [Odpovědět]
 
Hodnocení: -2 Čekejte, prosím...

syntax error

Datum: 19.5.2011 12:46
Autor: neregistrovaný (213.220.198.105)
Hodnocení autora: není
Příspěvků: 0
když chci provést jednoduchou početní operaci a pak kod debuguju objeví se mi v error list chyba:syntax error.Ukazuje na jedno předem zadané číslo(konkrétně 1).Co to prosím znamená?Jak se to dá vyřešit?
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Aritmetický průměr

Datum: 19.12.2011 20:39
Autor: neregistrovaný (90.182.248.86)
Hodnocení autora: není
Příspěvků: 0
jak vytvořím program na počítaní aritmetického průměru?
 
           [Odpovědět]
 
Hodnocení: 0 Č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.