Cyklus For

6. díl - Cyklus For

Tomáš Herceg       05.05.2007       VB.NET       24039 zobrazení

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.

 

hodnocení článku

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

 

Mohlo by vás také zajímat

Návrh uživatelského rozhraní v desktopových aplikacích

Doporučené postupy a běžné praktiky při vytváření uživatelského rozhraní desktopových aplikací převážně ve Windows Forms.

Řešené příklady v ASP.NET - díl 4.: Jak na dlouhotrvající úlohy

Občas potřebujeme ve webových aplikacích provádět dlouhotrvající úlohy, které se nevejdou do jednoho HTTP požadavku. V tomto článku si ukážeme jeden z možných přístupů k řešení tohoto problému.

Práce s časovými pásmy a letním časem v aplikaci a databázi - díl 2.: DateTime v .NET Frameworku

Práce se strukturou DateTime v .NET Frameworku lze využívat pro práci s lokálním časem i časem v jiných časových pásmech. Tento díl se věnuje základnímu popisu a konverzím mezi lokálním a UTC časovým údajem.

 

 

Nový příspěvek

 

Diskuse: Cyklus For

Dobrý den,

ve VB Express 2012 nemůžu najít komponentu ComboBox. Nevíte, prosím, zda je v této verzi přejmenovaná, nebo kde ji najít když ji zkrátka v Toolboxu nemám? A dá se případně nahradit DropDownList-em v jejich funkcích?

Za případné odpovědi předem děkuji.

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

chce to se pořádně kouknout... -> Běžné ovládací prvky

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

2013 to má taky

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

příkaz step

Ještě bych doplnil volitelný příkaz step

např. for i=10 to 200 step 10

tzn. při každém cyklu se i zvětší o 10 (10,20,30,40...)

Moc se to nevyužívá ale je dobré to zmínit.

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

Diskuse: Cyklus For

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.

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

Myslím že sem to našel ve foru ...

bude to něco okolo tohohle

http://www.vbnet.cz/forum-tema--4618-c_2...

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

Diskuse: Cyklus For

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.

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

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.

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

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

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

Diskuse: Cyklus For

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?

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

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
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Cyklus For

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ý

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

Diskuse: Cyklus For

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

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

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.

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

Díky za odpověď.

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

Diskuse: Cyklus For

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

nahlásit spamnahlásit spam -2 / 2 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