Články

Tisk článku Tisk článku

Cyklus For

[Zpět na kategorii]

Datum: 5. 5. 2007 15:37       Autor: Tomáš Herceg       Zobrazeno: 27194x

Kategorie: Začínáme

Témata: VB.NET

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

V šestém díle tohoto seriálu si vysvětlíme první typ cyklu, a to cyklus For, který slouží k opakovanému spouštění určitých operací. Napíšeme si aplikaci, která vypíše násobky zadaného čísla, a aplikaci, která vypíše dělitele zadaného čísla.


Předně se chci omluvit za to, že jsem dlouho neměl čas a že jste na tento díl museli velice dlouho čekat. Teď snad času bude více a seriál může v klidu pokračovat dál. 

V programování se často setkáváme se situací, že potřebujeme nějaký příkaz volat opakovaně, i když třeba s malinko odlišnými parametry. Téměř každý programovací jazyk (Visual Basic nevyjímaje) obsahuje cykly. Těch existuje více druhů, v tomto dílu článku se naučíme používat a vytvářet cyklus For. Ten se používá k opakování jednoho a více příkazů, přičemž předem známe počet opakování.

Základní struktura tohoto cyklu vypadá takto:

For [čítač] = [Start] To [Stop]
    [Jeden nebo více příkazů]
Next 

Čítač cyklu je proměnná (číselného typu, tzn. Integer, Double apod.), podle které zjistíme, po kolikáté se příkazy v cyklu právě provádějí. Start je počáteční hodnota čítače a Stop je hodnota koncová. Na začátku se do proměnné čítače nastaví počáteční hodnota a spustí se příkazy v cyklu. Jakmile dorazíme k příkazu Next, hodnota proměnné čítače se zvýší o jedničku a pokud je tato nováho hodnota menší nebo rovna koncové hodnotě, příkazy se provedou znovu a celý proces se opakuje, dokud není čítač větší než koncová hodnota. Pak se pokračuje dalším říkazem za tímto cyklem.

Představte si teď tento cyklus:

Dim i As Integer
For i = 1 To 10
    MsgBox(i)
Next 

Příkaz MsgBox(i) se postupně spustí pro každé celé číslo od 1 do 10 včetně těchto hranic. To tedy znamená, že nejprve se objeví zpráva, ve které bude jako text číslo 1, pak se hned vypíše zpráva s číslem 2, pak z číslem 3 atd., poslední zpráva ukáže číslo 10. Čítač cyklu je v tomto případě proměnná i a pro každé spuštění příkazů uvnitř cyklu (průchod) má jinou hodnotu. To, co je uvnitř cyklu, ať už je to cokoliv, se spustí nejdřív pro i = 1, pak pro i = 2, pak pro i = 3 až pro i = 10.

Aplikace Násobilka

Jako demonstraci cyklu si nejprve naprogramujeme jednoduchou aplikaci Násobilka, která ukáže prvních 10 násobků zadaného čísla. Naučíme se také používat komponentu ComboBox, což je rozbalovací seznam.

Spusťte si tedy Visual Basic a vytvořte nový projekt (Windows Application, jako vždy). Na formulář přidejte komponentu Label (její vlastnost Text nastavte na hodnotu "Zobrazit násobky") a hned vedle komponentu ComboBox. Nakonec přidejte komponentu ListBox. Formulář by měl vypadat přibližně takto:

Rozvržení aplikace Násobilka

Nyní vyberte komponentu ComboBox1 a oklepejte na jají vlastnost Items. Objeví se okno, ve kterém zadáme položky, které se mají v komponentě zobrazit. Mohli bychom je vyplnit ručně v tomto okně, ale já jsem řekl ne. Vyplníme je přeci pomocí cyklu, takže klikněte na tlačítko Cancel a dvakrát poklepejte do plochy formuláře (ne na komponentu!). Otevře se vám okno kódu (radši zkontrolujte, jestli se procedura jmenuje Form1_Load. Zapište do ní tento kód:

        For i As Integer = 1 To 20
            ComboBox1.Items.Add(i)
        Next

Pokud program spustíte a rozbalíte toto rozbalovací pole, uvidíte v něm čísla od 1 do 20. Všimněte si, že jsem proměnnou i nadeklaroval až v cyklu, tady už nepoužíváme příkaz Dim. Rozdíl mezi deklarací příkazem Dim a mezi tímto zápisem je v tom, že promenná i platí pouze v rámci cyklu, v příkazu někde za cyklem neexistuje. Pokud použijeme příkaz Dim, platí proměnná v celé proceduře. V tomto případě je to naštěstí úplně jedno.

Aby uživatel nemohl do rozbalovacího seznamu zapisovat vlastní hodnoty, nastavte jeho vlastnost DropDownStyle na hodnotu DropDownList.

Po vybrání čísla z tohoto seznamu vypíšeme do velkého seznamu prvních deset násobků vybraného čísla. Poklepejte tedy na rozbalovací seznam a do procedury ComboBox1_SelectedIndexChanged (která se spustí při vybrání nějaké položky) napište tento kód:

        ListBox1.Items.Clear()
        For i As Integer = 1 To 10
            ListBox1.Items.Add(CInt(ComboBox1.SelectedItem) * i)
        Next

Tento kód je též velmi jednoduchý. První řádek vymaže celý seznam ListBox1, protože tam mohou být násobky, které jsme vypsali předchozím výběrem. Pak následuje cyklus od 1 do 10. Do seznamu vypisujeme hodnotu vybranou v rozbalovacím seznamu, kterou vynásobíme aktuální hodnotou proměnné i. Pokud tedy vyberem třeba 3, nejprve se do seznamu přidá 3 * 1, pak 3 * 2, pak 3 * 3 atd., až 3 * 10. Tyto výrazy se samozřejmě spočítají a do seznamu se vypíšou jejich výsledky. Hodnota ComboBox1.SelectedItem vrátí právě vybranou položku z tohoto seznamu, je lepší ji převést na Integer, protože nevíme, jestli to není text (ComboBox texty obsahovat může). Bez převodu by se sice nic nestalo, ale je to lepší raději převést.

To je vlastně vše. Nyní aplikace Násoblika funguje:

Aplikace Násobilka

Všimněte si, že komponenty ListBox a ComboBox se ovládají velmi podobně - přidávání položek se dělá přes Items.Add, vymazání přes Items.Clear atd., vybranou položku najdeme v SelectedItem, pořadí vybrané položky je v SelectedIndex, zkrátka tyto komponenty jsou velice podobné. To je velká výhoda .NET Frameworku, v některých programovacích jazycích a prostředích to není samozřejmost, i podobné komponenty se používají jinak. V prostředí Visual Basic .NET, které je na .NET Frameworku postavené, je tu zkrátka pořádek - podobné věci se používají stejně.

Aplikace Dělitelé

Další věc, na které si procvičíme cykly, je aplikace Dělitelé. Vytvořte si nový projekt a  na formulář si přidejte komponentu Label (vlastnost Text nastavte na hodnotu "Zadejte číslo:"), hned vedle TextBox, do kterého zapíšeme číslo, a vedle něj komponentu Button (vlastnost Text nastavte na hodnotu "Vypsat dělitele". Dolů přidejte opět velký ListBox. Mělo by to vypadat nějak takto:

Rozvržení aplikace Dělitelé

Nyní poklepejte na tlačítko a otevře se vám procedura Button1_Click. Nejprve ověříme, jestli uživatel zadal nějaké číslo. Text na číslo jsme sic již v minulých dílech převáděli, ale pokud uživatel napsal do políčka třeba "abc", program ohlásil chybu a ukončil se (spadnul). Nyní se naučíme způsob, kterým převedem text na číslo a dozvíme se, jestli se to podařilo. Pokud ne, můžeme nějak zareagovat, třeba zobrazit chybovou hlášku.

Pro bezpečné převedení textu na číslo se používá funkce Integer.TryParse. Potřebuje dva parametry - první je hodnota, kterou chceme převést, a druhá je název proměnné, do které se hodnota uloží. Samotná funkce vrátí True, pokud se převod podařil, nebo False, pokud se převést nepovedlo. Stačí tedy pomocí jednoduché podmínky ověřit, jestli se převedení podařilo, a pokud ne, zobrazit chybu a předčasně ukončit proceduru příkazem Exit Sub.

V této konkrétní ukázce je Exit Sub nadbytečné, ale ve většině případů za touto podmínkou budete dále s proměnnou cislo pracovat, a v takovém případě je nutné proceduru ihned ukončit, pokud se zadaná hodnota nedá převést na číslo. Proto tam je Exit Sub.

Do procedury Button1_Click tedy zapište tento kód:

        'bezpečně převést text na číslo
        Dim cislo As Integer = 0
        If Integer.TryParse(TextBox1.Text, cislo) = False Then
            MsgBox("Musíte zadat číslo!")
            Exit Sub
        End If

Již jednou jsem podotýkal, že podobné věci se dělají podobně. Pokud budu chtít bezpečně převést na Boolean, použiji funkci Boolean.TryParse, to samé platí pro Double, Byte atd.

Nyní tedy máme proměnnou cislo, která obsahuje číslo, jehož dělitele chceme vypsat do seznamu. Dělitel je číslo, kterým můžeme vydělit beze zbytku. V některém z minulých dílů jsme si říkali o operátoru Mod, který spočítá zbytek po dělení. Pokud je zbytek po vydělení nula, znamená to, že je číslo dělitelné beze zbytku.

Jak tedy najdeme a vypíšeme všechny dělitele čísla? Uděláme si cyklus od 1 do cislo (hodnotu této proměnné sice v tuto chvíli neznáme, nevíme totiž, co uživatel do pole zadá, ale to nám nevadí, skutečná hodnota není podstatná, jde o to, aby se vyzkoušely všechna čísla, která mohou být děliteli, a to až do hodnoty této proměnné) a v každém kroku zkusíme proměnnou cislo vydělit aktuální hodnotou čítače. Pokud zbytek vyjde nula, aktuální hodnota čítače je dělitel čísla cislo, přidáme tedy hodnotu tohoto čítače do seznamu (protože hodnota čítače je to, čím zkoušíme vydělit, je to tedy případný dělitel).

Zkrátka a dobře zkusíme cislo vydělit každým číslem od 1 do cislo a pokud se to podaří, přidáme aktuálně zkoušené číslo do seznamu. Před samotným spuštěním cyklu ještě seznam vymažeme, aby tam nezůstaly výsledky z přechozího vyhledávání.

Přidejte tedy za předchozí kousek kódu ještě těchto pět řádků:

        'vyhledat a vypsat dělitele
        ListBox1.Items.Clear()
        For i As Integer = 1 To cislo
            If cislo Mod i = 0 Then ListBox1.Items.Add(i)
        Next

To je celé. Můžete si aplikaci spustit a vyzkoušet.

Aplikace Dělitelé

Protentokrát je to již vše. V příštím díle si vysvětlíme, co to jsou pole a jak se s nimi pomocí cyklu pracuje.


> Na začátek

 

Hodnocení:

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

zastavení výsledného okna

Datum: 5.12.2007 10:34
Autor: neregistrovaný (212.111.21.169)
Hodnocení autora: není
Příspěvků: 0
chtěl bych se zeptat jakou instrukcí zastavím okno po provedení programu abych mohl zkontrolovat jestli funguje dobře (pracuju v consolovém okně) děkuji
 
           [Odpovědět]
 
Hodnocení: -2 Čekejte, prosím...

nekonečná smyčka

Datum: 9.2.2008 0:18
Autor: Michal Tichý
Hodnocení autora: 3
Příspěvků: 2
Dobrý den,
v první řadě Vám chci poděkovat za tento skvělý seriál, který, dle mého, nemá obdoby. V dobrém slova smyslu, samozřejmě. Ale k věci. Pokud budu chtít nekonečnou smyčku a zapíšu kód takhle

        Dim y As Integer = 3
        For i As Integer = 2 To y
            MsgBox(y)
            y += 1
        Next
 
Vypíše se pouze 3 a 4. Proč tato smyčka není nekonečná? Nebo dělám něco špatně? Děkuji za odpověď
 
           [Odpovědět]
 
Hodnocení: 3 Čekejte, prosím...

Re: nekonečná smyčka

Datum: 9.2.2008 10:07
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
Smyčka není nekonečná z jednoho prostého důvodu - za klíčovým slovem To se nachází nějaký výraz, ten se na začátku cyklu vyhodnotí a uschová se (v našem případě se tedy uschová číslo 3). Pak se teprve spustí cyklus, ale hodnota za slovem To se již dále nepřepočítává, použije se ta, která byla vypočítána nebo zjištěna na začátku, tedy 3.
Pokud byste chtěl, aby se to porovnávalo vždy, musíte použít cyklus While.
 
           [Odpovědět]
 
Hodnocení: 10 Čekejte, prosím...

Re: nekonečná smyčka

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

Vrátit se

Datum: 12.3.2008 9:13
Autor: neregistrovaný (212.71.186.190)
Hodnocení autora: není
Příspěvků: 0
Dobrý den,
Vytvářím program, který mám rozdělený na několik kroků. Potřeboval bych vědět, jak mám udělat, aby se program vrátil na určitý krok, který už byl proveden, a od tohoto kroku pokračoval dál. Pokoušel jsem se to udělat takto

    Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
Line1:
        TextBox1.Text = Label1.Text
        If TextBox1.Text = Label1.Text Then
            Label1.Text = 9
        End If

Line2:
        TextBox2.Text = Label2.Text
        If TextBox2.Text = Label2.Text Then
            Label2.Text = 8
        End If

Line3:
        TextBox3.Text = Label3.Text
        If TextBox3.Text = Label3.Text Then
            Label3.Text = 7
        End If

Line4:
        TextBox4.Text = Label4.Text
        If TextBox4.Text = Label4.Text Then
            Label4.Text = 6
        End If
Line5:
        If TextBox1.Text = 5 Then
            GoTo Line2
        End If
    End Sub

 
ale nějak to nešlo. Zjistil jsem, že program může přeskočit pouze na Line, která ještě nebyla provedena. Pokud to tak opravdu je, jak mám tedy svůj program vytvořit?
 
           [Odpovědět]
 
Hodnocení: 3 Čekejte, prosím...

Re: Vrátit se

Datum: 18.10.2010 18:04
Autor: Ondřej Ondryáš
Hodnocení autora: 100
Příspěvků: 237
Dejte to do procedur (ty jsou vysvětleny v jiném díle):


Sub L1()
        TextBox1.Text = Label1.Text
        If TextBox1.Text = Label1.Text Then
            Label1.Text = 9
        End If
End Sub

Sub L2()
        TextBox2.Text = Label2.Text
        If TextBox2.Text = Label2.Text Then
            Label2.Text = 8
        End If
End Sub

Sub L3()
        TextBox3.Text = Label3.Text
        If TextBox3.Text = Label3.Text Then
            Label3.Text = 7
        End If
End Sub

Sub L4()
        TextBox4.Text = Label4.Text
        If TextBox4.Text = Label4.Text Then
            Label4.Text = 6
        End If
End Sub

Sub L5()
        If TextBox1.Text = 5 Then
            L2()
        End If
End Sub

    Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
L1()
L2()
L3()
L4()
L5()
    End Sub
 
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

dotaz na násobilka

Datum: 3.9.2009 15:12
Autor: neregistrovaný (86.61.239.132)
Hodnocení autora: není
Příspěvků: 0
prosim vás tady u té násobilky
Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i As Integer = 1 To 20
ComboBox1.Items.Add(i)
Next
End Sub

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
ListBox1.Items.Clear()
For i As Integer = 1 To 10
to je daný tady že jo kolik bude těch násobků.

ListBox1.Items.Add(CInt(ComboBox1.SelectedItem) * i)
Next
End Sub
End Class

Děkuju ...jo a máte to tady fakt moc dobrý
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Vyplnování textu v cyklu

Datum: 11.2.2011 20:50
Autor: neregistrovaný (82.100.3.4)
Hodnocení autora: není
Příspěvků: 0
Zdravím, děkuji za tento seriál a chtěl bych se zeptat na jednu věc.
Mám tento kod

Dim textik As String = TextBox100.Text
        If textik.Contains("a") Or textik.Contains("A") Then
            Dim i As Integer
            For i = poradi1 To poradi2
                pole(0, i) = 1
            Next
        End If
        If textik.Contains("b") Or textik.Contains("B") Then
            Dim i As Integer
            For i = poradi1 To poradi2
                pole(1, i) = 1
            Next
        End If
 
Prostě zjištuju, zda jsou v určitém textu písmena a,b,c atd. (tedy vždy malé i velké) a pokud ano tak se vyplní nějaká část pole jedničkama. A chtěl bych to dát do nějakého cyklu, abych tam neměl těch if then moc. Řekneme že těch písmen které budu zjištovat je 18 :-(. Zkuste mě prosím nasměrovat, děkuju moc.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Vyplnování textu v cyklu

Datum: 11.2.2011 22:10
Autor: Tomáš Herceg
Hodnocení autora: 1660
Příspěvků: 3533
Všechna písmena, se kterými chcete pracovat, si dejte do jednoho řetězce a projděte jej cyklem:

Dim velkaPismena = "ABCDEFGH"
Dim malaPismena = velkaPismena.ToLower()

For p As Integer = 0 To velkaPismena.Length - 1
    Dim male = malaPismena(p)
    Dim velke = velkaPismena(p)
    If textik.Contains(male) Or textik.Contains(velke) Then
        Dim i As Integer
        For i = poradi1 To poradi2
            pole(0, i) = 1
        Next
    End If
Next
 

Pokud to mají být všechna písmena anglické abecedy po sobě jdoucí, pak tuším jsou funkce Asc a Chr. První udělá ze znaku číslo v ASCII tabulce a druhá z čísla udělá znak.
 
           [Odpovědět]
 
Hodnocení: 2 Čekejte, prosím...

Re: Vyplnování textu v cyklu

Datum: 11.2.2011 22:25
Autor: neregistrovaný (82.100.3.4)
Hodnocení autora: není
Příspěvků: 0
Strašně díky moc za pomoc, jak to tak bývá dva dni jsem na nic nepřišel a asi pět minut co jsem napsal ten příspěvek tak už jsem tušil asi kudy ... sice jsem to neudělal tak elegantně jako Vy, ale už to bylo na dobré cestě ...


Dim textik As String = TextBox100.Text
        Dim znakyvel As String = "ABCDEJKLMN"
        Dim znakymal As String = "abcdejklmn"
        For loopa As Integer = 1 To 10
            If textik.Contains(znakyvel(loopa - 1)) Or textik.Contains(znakymal(loopa - 1)) Then
                For i As Integer = poradi1 To poradi2
                    pole(loopa, i) = 1
                Next
            End If
        Next
 

Nevím proč jsem myslel že cyklus nemůže začínat od 0, napravím to.

Díky moc !!!
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Změna čísla u TextBox1

Datum: 11.2.2011 23:45
Autor: Filip Sladký
Hodnocení autora: 0
Příspěvků: 2
Ještě bych měl jeden dotaz ...

chci vypisovat nějakou hodnotu jako text do TextBoxu. Těch TextBoxů mám ale hodně.


TextBox1.Text = hodnota1
TextBox2.Text = hodnota2
...
...
TextBox60.Text = hodnota60
 

Můžu nějak měnit to číslo toho TextBoxu ??? Abych to mohl dát do cyklu například (když je mám ty TextBoxy číselně po sobě).
Děkuji.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Změna čísla u TextBox1

Datum: 12.2.2011 15:04
Autor: Filip Sladký
Hodnocení autora: 0
Příspěvků: 2
Myslím že sem to našel ve foru ...
bude to něco okolo tohohle
http://www.vbnet.cz/forum-tema--4618-c_2...
 
           [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.