Programujeme ve Visual Basic .NET - 8.díl - nekonečné smyčky

V tomto dílu našeho seriálu o programování v prostředí VB.NET se budeme věnovat řídícím strukturám - příkazům cyklu pro opakované provádění části kódu.

V předchozích dílech seriálu jsme se seznámili s výpisem pomocí příkazu System.Console.WriteLine(). Pro opakovaný výpis lze volání příkazu opakovat na několika řádcích, ale je jasné, že pro rozsáhlejší výpisy je tato metoda zbytečně pracná, pokud ne přímo nepoužitelná.

Představme si například, že máme za úkol spočítat součet čísel od nuly do sta. Je vidět, že vypsat tuto hodnotu postupem :

Console.WriteLine(0 + 1 + 2 + 3 + 4 + .... + 98 + 99 + 100)

je nesmyslné a stejně pracné, jako hodnotu spočítat na kalkulačce předem a pak ji vypsat jedinou číslicí. Ve skutečnosti je možné se úlohy snadno zhostit tak, že k nějakému číslu postupně přičítáme čísla od jedné do stovky. K tomu, abychom úkol vyřešili programovým kódem, je nutné uložit číslo, které bude budoucím součtem do paměti a pak k němu postupně přičítat další číslo, které budeme postupně zvyšovat od nuly o jednotku v každém průběhu cyklu.

Schematicky lze tento postup znázornit následujícím vývojovým diagramem například takto:

Klepněte pro větší obrázek

Příkaz cyklu Do - Loop

Pokud v kódu potřebujeme opakovaně provádět nějakou činnost, použijeme řídící příkaz cyklu (programové smyčky). Další možnost (která je ve VB.NET z historických důvodů rovněž podporována) je využití skoku GoTo na návěští. Jelikož použití příkazu GoTo neodpovídá moderním zásadám strukturovaného programování a v současné praxi na něj narazíme jen výjimečně, nebudeme na tomto místě příkaz GoTo probírat.

Vedle tzv. nekonečných cyklů typu Do ... Loop většina programovacích jazyků, a tedy i VB.NET podporuje i tzv. konečné cykly (cykly s čítačem), prováděné pro předem pevně daný počet opakování. K počítání cyklů slouží proměnná, nazývaná čítač cyklu.  Ačkoliv použití čítačů v konečných cyklech výrazně usnadňují a zpřehledňují zápis programu, lze je vždy nahradit obecnější konstrukcí nekonečné smyčky Do ... Loop přerušenou logickou podmínkou. To je důvod, proč se konečným cyklům budeme věnovat v dalším dílu našeho seriálu, přestože jsou strukturovanější a měli bychom jim dávat obecně přednost před cyklem Do ... Loop.

Nejjednodušší příkaz cyklu využívá kombinace příkazů Do ... Loop následovně:

Do         
  příkaz_1
   ....
Loop
nebo na jediném řádku:

Do: příkaz_1: ....: Loop

Veškerý kód mezi příkazy Do ... Loop se přitom provádí tak dlouho, dokud není dosaženo splnění nějaké podmínky, která cyklus ukončí. Pokud kód takovou podmínku neobsahuje, nebo k jejímu splnění z nějakých důvodů nedojde, může program běžet donekonečna, protože uvázne v nekonečné smyčce. To je nepříjemná situace, pokud program přitom přestane reagovat na zásahy uživatele a uživatel ztratí nad prováděním kódu kontrolu. V praxi by měla platit zásada, že blokující smyčky by neměly trvat déle, než několik vteřin, pokud trvají z nezbytných důvodů déle, je nutné program doplnit nějakým indikátorem průběhu operace. Později si ukážeme několik způsobů, jak realizovat delší programové smyčky tak, aby běh ostatních částí programu neblokovaly.

Nejčastějším příkazem, kterým lze po splnění podmínky opustit provádění nekonečné smyčky je příkaz Exit Do. Typický případ nekonečné smyčky pak vypadá následovně:

Do                                 
  příkaz_1
   ....
  If podmínka Then Exit Do
  příkaz_x
  ....
Loop

V případě, že podmínka pro ukončení cyklu tvoří současně první či poslední příkaz cyklu, VB.NET podporuje zkrácenou syntaxi s využitím klíčových slov While a Until, což umožní obejít použítí příkazu Exit Do:

Do While podmínka
  ....
  ....
Loop

Do Until podmínka
  ....
  ....
Loop

Do
  ....
  ....
Loop While podmínka

Do
  ....
  ....
Loop Until podmínka

Význam a funkce smyčky vyplývá z významu klíčových slov While ("zatímco") a Until ("dokud") v anglickém jazyce. Cyklus Do While ... Loop je prováděn dokud podmínka zůstává splněna, přičemž cyklus Do While ... Loop je prováděn, dokud tato podmínka splněna není. Rozdíl mezi Do While ... Loop a Do ... Loop While spočívá v tom, že v prvním případě je logická podmínka vyhodnocována na začátku, v druhém případě na konci cyklu.

Poznámka: Visual Basic umožňuje zápis Do While podmínka ... Loop dále ještě více zkrátit (nahradit) zápisem While podmínka ... Wend. Na konstrukce While ... Wend často narazíme v případech kódu z předchozích verzích Visual Basicu - ale obecně bychom se jim měli vyhýbat z důvodu jejich snížené přehlednosti.

Ukázkový program pro výpočet součtu čísel od jedné do sta

Nyní se jsme již vybaveni všemi potřebnými znalostmi k sestavení programu pro výpočet součtu čísel od nuly do sta.

Pro řešení úlohy obecným programem budeme muset vyhradit v paměti prostor pro dvě čísla, jedno obsahující průběžný součet (suma), druhé obsahující průběžně se zvyšující přírůstek (increment), který budeme v každém kroku výpočtu postupně zvyšovat o jedničku a tato čísla opakovaně sčítat, dokud hodnota incrementu nedosáhne hodnoty sto. V praxi se postupuje tak, že hodnotu součtu i přírůstku udržujeme v tzv. proměnných, se kterými provádíme operace v uzavřeném cyklu. Vystoupení z cyklu a ukončení výpočtu  provedeme, jakmile hodnota přírůstku dosáhne stovky.

Veškerý výpočet proběhne při spuštění programu v proceduře Main(). Z uvedeného schématu činnosti budoucího programu (tzv. vývojového diagramu) vidime, že budeme využívat hodnoty dvou proměnných suma  a incr. Do proměnné suma budeme ukládat průběžný součet, do proměnné incr postupně se zvyšující přírůstky. Před spuštěním programu budou obě proměnné nastaveny na nulovou hodnotu. Je pravděpodobné, že by program pracoval správně, i kdybychom nastavení počátečních hodnot proměnných neprovedli, ale inicializace proměnných patří k dobrým zásadám přehledného programování a zvyšuje odolnost programu vůči chybám.

Dim suma = 0, incr = 0

Horní hranice proměnné incr je pevně dána (incr ≤ 100), ale aby ji bylo možné ji později snadno měnit v jediném místě programu,  nadeklarujeme jako konstantu iMAX :

Const iMAX = 100

Nyní budeme provádět vlastní výpočet v nekonečném cyklu Do ... Loop. V každém cyklu programové smyčky Do...Loop provedeme následující akce:

  • k hodnotě proměnné incr přičteme jedničku
  • provedeme porovnání hodnot incr a konstanty iMAX. Pokud bude hodnota incr větší, než hodnota iMAX cyklus opustíme příkazem Exit Do
  • k hodnotě proměnné suma přičteme aktuální hodnotu proměnné incr
    Do
      incr = incr + 1
      suma = suma + incr
      If incr > iMAX Then Exit Do
    Loop

Po provedení potřebného počtu cyklů zobrazíme výsledek nám již známou metodou System.Console.WriteLine. Výsledek zobrazíme pomocí metody System.Console.WriteLine() s komentářem :

    System.Console.WriteLine("suma: ")
    System.Console.WriteLine(suma)

Kompletní výpis celého programu v modulu VB.NET je uveden níže. Všiměte si použité konvence v odsazování vnitřku bloku moudulu, procedur i smyček mezerami nebo tabelátory, která činí program čitelnějším i přehlednějším. Ačkoliv prostředí VB.NET nerozlišuje mezi velkými a malými písmeny (tj. je case insensitive), počlivé dodržování velikosti písmen jednak zlepší konzistenci a čitelnost programu, jednak nám může usnadnit jeho pozdější převedení do jiného jazyka s přísnější syntaxí (jako je C# nebo C++).

Module modMain
  Sub Main
    Const iMAX = 100
    Dim suma = 0, incr = 0
      Do
        incr = incr + 1
        If incr > iMAX Then Exit Do
        suma = suma + incr
      Loop
      System.Console.WriteLine("suma: ")
      System.Console.WriteLine(suma)
    End Sub
 End Module

Program opíšeme do editoru SnippetCompiler a spustíme tlačítkem se zelenou šipkou. Pokud je vše v pořádku (viz doporučená konfigurace prostředí SnippetCompiler v menu Tools - Options... uvedená ve druhém dílu seriálu), téměř okamžitě se zobrazí černé okno systémové konzole zobrazující výsledek:

suma:
5050

Nyní můžeme např. experimentovat s počtem cyklů, tedy s hodnotou konstanty iMAX, čímž si současně ověříme výhodu použití pojmenované konstanty namísto pevně daných hodnot, které by bylo jinak nutné v kódu měnit na několika místech zároveň. Zde se uplatní vysoká rychlost kompilovaného kódu VB.NET, zvláště v porovnání se staršími verzemi BASICu nebo třeba VBScriptem. Až do hodnoty iMax = 1000000 získáte i na středně výkonném počítači výsledek prakticky okamžitě - to tedy znamená, že váš počítač stihne provést za vteřinu více než milión operací! V některé z příštích ukázek tohoto výpočetního výkonu využijeme pro modelování některých jednoduchých situací z reálného světa numerickým výpočtem.

Stručné shrnutí

Pro opakované provádění kódu využíváme programové cykly. Nejjednodušším a nejobecnějším je konstrukce Do..Loop, kterou je nutné opustit příkazem Exit Do na základě logického výrazu (kritéria pro ukončení smyčky). Příkaz smyčky lze s podmínkou vyhodnocující logický výraz spojit v některé z variant příkazu Do Until - Loop, Do While - Loop, Do - Loop Until, Do - Loop While v závislosti na tom, zda vyhodnocení podmínky provádíme na začátku a na konci cyklu a zda tvoří kritérium pro pokračování nebo opuštění cyklu.

Jelkož náš program provádí výpočet v předem pevně daném počtu kroků, v příštím díle seriálu se pokusíme náš program dále zdokonalit i zjednodušit použitím konečné programové smyčky s čítačem.

Diskuze (26) Další článek: Česká verze WinRARu 3.4 je na světě

Témata článku: Software, Programování, Jediný důvod, Visual, Syntax, Exit, Loop, Suma, Pre, Sumo, IMAX, Následující vývoj, Vývojový diagram, Nepříjemná situace, Budoucí krok


Určitě si přečtěte

Jak funguje kontroverzní program, který ženám krade plavky. Mají se čeho bát?

Jak funguje kontroverzní program, který ženám krade plavky. Mají se čeho bát?

** Strojové učení ještě nepřitáhlo takový zájem jako na začátku prázdnin ** Ne, umělá inteligence nenašla lék na rakovinu ** Naučila se svlékat ženy nejen z plavek

Jakub Čížek | 35

10 novinek Androidu 10, které vás budou bavit

10 novinek Androidu 10, které vás budou bavit

Jan Láska, Vladislav Kluska | 28

Šmírování kamerami Googlu: Koukněte, co šíleného se objevilo na Street View

Šmírování kamerami Googlu: Koukněte, co šíleného se objevilo na Street View

Google stále fotí celý svět do své služby Street View. A novodobou zábavou je hledat v mapách Googlu vtipné záběry. Podívejte se na výběr nejlepších!

redakce | 6


Aktuální číslo časopisu Computer

Megatest: 20 powerbank s USB-C

Test: mobily do 3 500 Kč

Radíme s výběrem routeru

Tipy na nejlepší vánoční dárky