Pole

7. díl - Pole

Tomáš Herceg       09.05.2007       VB.NET       24758 zobrazení

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.

 

hodnocení článku

3 bodů / 3 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Mohlo by vás také zajímat

.NET Framework od začátku - díl 7.: Rozhraní

V tomto díle si ukážeme, jak deklarovat a implementovat rozhraní a k čemu to vlastně je. Krátce si též představíme základní vestavěná rozhraní v .NET Frameworku.

Práce s časovými pásmy a letním časem v aplikaci a databázi - díl 1.: Úvod do časových pásem a letního času

Ve článku se snažím popsat úskalí, která přináší konverze času přes více časových pásem a pravidel pro počítání letního času.

Co je to .NET Framework 4.5?

V tomto článku se snažím nastínit rozdíl mezi .NET 4 a .NET 4.5 z pohledu zpětné kompatibility.

 

 

Nový příspěvek

 

Generování pole 6x6 pro PEXESO

inspirace pro pokročilejší programátory

Public Class Form1
    Dim pole(5, 5) As Byte
    Dim x As Byte, y As Byte

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        For k As Byte = 0 To 5
            For n As Byte = 0 To 5
                pole(k, n) = 0
            Next
        Next

        Randomize()
        For i As Byte = 1 To 18
            For c As Byte = 1 To 2
                Do
                    x = Math.Round(5 * Rnd())
                    y = Math.Round(5 * Rnd())
                Loop Until pole(y, x) = 0
                pole(y, x) = i
            Next
        Next

        DataGridView1.Rows.Clear()

        For k As Byte = 0 To 5
            DataGridView1.Rows.Add()
            For n As Byte = 0 To 5
                DataGridView1.Item(n, k).Value = pole(k, n).ToString()
            Next
        Next
    End Sub

End Class

Enjoy :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole

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)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

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.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

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äť?

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

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

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

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ť?

nahlásit spamnahlásit spam -3 / 3 odpovědětodpovědět

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.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Autor seriálu věcem rozumí

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole

Dobrý den, prosím o radu. Co je potřeba aby program který vytvořím ve visual basicu mohli spustit lidé na jiných PC? Musí mít nainstalovaný .NET framework 4?

Nejde z visual basicu vytvořit nějaký univerzálně spustitelný soubor .exe který jde spustit ve starém i v novém windowsu, bez starostí okolo toho co tam lidé mají či nemají nainstalované? Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Toto jsem zkopíroval z druhé lekce, myslím, že to odpovídá na vaši otázku.

Pokud byste své programátorské pokusy chtěli ukázat svým přátelům, nemusí si instalovat Visual Basic. Stačí, když ve složce, kde je projekt uložen, otevřete podsložku bin/Debug a v ní najdete příslušný EXE soubor. Ten by pro spuštění měl stačit (zatím děláme jednoduché projekty). Pokud aplikace nepůjde na jiném počítači spustit, ujistěte se, že je na něm nainstalován .NET Framework 4.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole

jak vytvořím program na počítaní aritmetického průměru?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole

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?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Pole

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?

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Diskuse: Pole

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.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Pole

'chci se zeptat, jakej je rozdíl mezi b += 67 a b + 67?'

nahlásit spamnahlásit spam 0 odpovědětodpovědět

b += 67 odpovídá zápisu b = b + 67

nahlásit spamnahlásit spam 4 / 4 odpovědětodpovědět

Diskuse: Pole

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

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to tam máte něco blbě, Double má přesnost zhruba 15 platných číslic.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole

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

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole

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ěď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole

Je nějaký rozdíl mezi pole.Length a Ubound(pole)??

nahlásit spamnahlásit spam 0 odpovědětodpovědět

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

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

díky za objasnění

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole

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)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Chybí vám tam Val před TextBox1.Text. U ostatních to tam máte.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Pole

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)

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Diskuse: Pole

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

nahlásit spamnahlásit spam -4 / 4 odpovědětodpovědět

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

nahlásit spamnahlásit spam 5 / 5 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback