4. díl - Podmínky a větvení v Batchi

Ostatní jazyky Příkazový řádek a dávkové soubory Podmínky a větvení v Batchi

Z minulého dílu již umíme vytvářet proměnné a ukládat si do nich nějaké hodnoty. Dokonce umíme i ukládat vstup od uživatele. Často se však stává, že se potřebujeme rozhodovat a následně reagovat na různé situace. Například podle zadání uživatele měnit běh programu. Od toho jsou podmínky – na základě zadaných informací se program rozhodne, jak bude postupovat dále. Takovou podmínkou může být například – 1 > 2, nebo proměnná vstup = něčemu.

Zápis podmínky

Podmínku můžeme zapsat pomocí klíčového slova

if

Poté následuje logický výraz. Pokud je tento výraz pravdivý, provede se následující příkaz.

Zkusme si to! Vytvořte si program porovnani.bat a vložte do něj základní strukturu. Zkusme si porovnat, zda se číslo 15 rovná číslu 5. Rovnost se označuje dvojitým rovnítkem.

if 15 == 5 echo Rovnaji se!

Program spusťme. Program nám nic nevypíše. Jak nám rozum napovídá, číslo 15 se nerovná číslu 5, proto je prázdná obrazovka správný výsledek. Co když chceme uživateli vypsat zprávu, že se čísla nerovnají? K tomu slouží klíčové slovo:

else

Jen bych rád upozornil, že v případě, že chceme else použít, musíme dát příkazy do závorek. Upravte proto náš program do této podoby:

if 15 == 5 (echo Rovnaji se!) else (echo Nerovnaji se!)

Pokud program spustíme nyní, zjistíme, že nám vypíše, že se čísla nerovnají.

Podmínky s if a else v batchi

Relační operátory

Operátor Zápis Příklad Matematický zápis
Rovná se == nebo EQU 5 == 2 nebo 5 EQU 2 5 = 2
Nerovná se NEQ 5 NEQ 2 5 ≠ 2
Menší LSS 5 LSS 2 5 < 2
Menší nebo rovno LEQ 5 LEQ 2 5 ≤ 2
Větší GTR 5 GTR 2 5 > 2
Větší nebo rovno GEQ 5 GEQ 2 5 ≥ 2

Zkusme si nyní vytvořit program, který bude dělit zadané číslo nějakým jiným číslem. Naším úkolem bude zjistit, zda druhé číslo není rovno nule. Jak jistě víte, nulou dělit nelze. A pokud to nevíte, tak jste se to právě dozvěděli :-).

Vytvořte si program s názvem deleni.bat a vložte do něj základní strukturu.

Jako první věc se uživateli přestavíme a vytáhneme z něj obě čísla.

echo Vitej v kalkulacce ktera umi jen delit :)
set /p prvni=Zadej prvni cislo:
set /p druhe=Zadej druhe cislo:

Nyní zjistíme, zda se druhé číslo rovná nule. Pokud ano, vypíšeme uživateli hlášku, že nulou není možné dělit. V opačném případě vypíšeme výsledek operace. Nejspíše vás napadá, jak to uděláme. Jednoduše – vytvoříme si pomocnou proměnnou „vysledek“, do které budeme ukládat výsledek. Pokud bude druhé číslo nulové, při vytváření proměnné nenastavíme žádný přepínač. Pokud číslo nulové není, přidáme přepínač /a (pro matematickou operaci).

if %druhe%==0 (set vysledek=Nulou nelze delit!) else (set /a vysledek=%prvni%/%druhe%)
echo Vysledek teto operace je: %vysledek%

Program uložíme a spustíme.

Dělení v Batchi

Větvení

Zde se již dostáváme k samotné změně chodu našeho programu. Větvení programu se v Batchi provádí pomocí příkazu:

goto

Jak již název příkazu napovídá, jedná se o „skok“ na jinou část programu, například na začátek. Cílové umístění (label) se označuje následujícím způsobem:

:ciloveUmisteni

A na toto umístění můžeme „přeskočit“ již zmíněným příkazem goto:

goto cisloveUmisteni

Jednoduchá kalkulačka

Pamatujete si náš prográmek Jednoduchá kalkulačka z minulé lekce? Pojďme jej trochu vylepšit! Stáhněte si zdrojový kód tohoto programu (můžete jej najít pod minulým článkem).

Ještě připomenu, co tento program dělá. Na začátku si program vyžádá 2 čísla, a následně vypíše jejich součet, rozdíl, součin a podíl. Poté program počká na stisk klávesy a skončí.

Pojďme tento program upravit – zkusme udělat to, že místo ukončení se program zeptá, zda si uživatel přeje, aby byl program spuštěn znovu. Jako možnosti vstupu budeme mít například „Ano“ nebo „Ne“. Pro zjednodušení – pokud bude vstup „Ano“, program spustíme znovu, pokud bude vstup cokoliv jiného, program ukončíme.

Jak na to? Jednoduše. Kalkulačka se na začátku představuje a poté žádá zadání dvou čísel. Mezi řádek s výpisem a zadáním (přece se nebudeme představovat při každém znovu-spuštění) vložte label:

:zacatek

Nyní se přesuneme na příkaz „pause > nul“ na konci programu. Tento příkaz smažeme, místo něj budeme psát rozhodování. Nejprve musíme uživateli sdělit, že se bude rozhodovat. Pro přehlednost vložíme prázdný řádek.

echo.
echo Prejete si program spustit znovu ?

A přidáme čtení vstupu:

set /p pokracuj=Zadej Ano nebo Ne:

Tak, nyní máme načtený vstup od uživatele. Přejdeme k rozhodování – pokud je vstup roven „Ano“, přeskočíme na label „zacatek“.

if %pokracuj%==Ano goto zacatek

Pokud se vstup rovná čemukoliv jinému, program pojede dál. Dál ale nic není, proto program skončí.

Program uložíme a vyzkoušíme. Všimněme si, že uživatel musí zadat „Ano“ - podmínka je tzv. Case-sensitive (citlivá na velikost písmen). Pokud toto nechcete, vložte za klíčové slovo „if“ přepínač /i. Podmínka nyní bude vypadat takto:

if /i %pokracuj%==Ano goto zacatek

A náš program je hotový.

Podmínka pokračování programu v Batch

Vylepšená kalkulačka

Založíme si nový soubor, který se bude jmenovat vylepsena-kalkulacka.bat. Vložíme si do něj základní strukturu.

Tento program vypíše seznam dostupných operací a podle zadání uživatele operaci provede. Také si zkusíme ošetřit vstup od uživatele, aby např. nedělil nulou.

V úvodu přivítáme uživatele, vytáhneme z něj dvě čísla, vypíšeme mu seznam operací a vyzveme jej k zadání čísla operace. Před zadáváním čísel a před zadáváním operace si vytvoříme label, který později využijeme.

echo Vitej v kalkulacce!

:zadavani
set /p prvni=Zadej prvni cislo:
set /p druhe=Zadej druhe cislo:
echo.
echo 1 - scitani
echo 2 - odcitani
echo 3 - nasobeni
echo 4 – deleni
:operace
set /p operace=Zadej cislo operace:

Nyní přejdeme k větvení programu. Zadáme si podmínky.

if %operace%==1 goto scitani
if %operace%==2 goto odcitani
if %operace%==3 goto nasobeni
if %operace%==4 goto deleni

Nyní nám program bude „skákat“ podle toho, co uživatel chce :-). Vytvoříme si labely s akcemi.

:scitani
set /a vysledek=%prvni%+%druhe%
goto vypis

:odcitani
set /a vysledek=%prvni%-%druhe%
goto vypis

:nasobeni
set /a vysledek=%prvni%*%druhe%
goto vypis

:deleni
if %druhe%==0 goto zadavani
set /a vysledek=%prvni%/%druhe%
goto vypis

Po zadání program skočí na label s akcí, kde spočítá výsledek a uloží jej do proměnné „vysledek“. Poté skočí na label „vypis“, kde si výsledek vypíšeme. Všimněte si, že u dělení kontrolujeme, zda se druhé číslo nerovná nule. Pokud ano, skáčeme zpět na zadání. Nyní si vytvoříme label „vypis“, kde uživateli vypíšeme výsledek.

:vypis
echo.
echo Vysedek operace je %vysledek%

Zkuste do čísla operace zadat cokoliv jiného – například nějaký text. Program prostě pojede dál, jako by tu nebyly žádné podmínky ani labely. Co s tím? Je to jednodušší, než byste čekali. Pod podmínky vložíme skok na zadání operace.

goto operace

Na konci nesmíme zapomenout na možnost znovu spustit program. Zeptejme se tedy uživatele, zda chce program spustit znovu.

echo.
set /p pokracuj=Prejes si program spustit znovu ? Ano nebo ne:
if /i %pokracuj%==Ano goto zadavani

Výsledek:

Skoky v Batchi

Máme hotovo, program je jako vždy ke stažení níže.


 

Stáhnout

Staženo 125x (1.31 kB)
Aplikace je včetně zdrojových kódů v jazyce Batch

 

  Aktivity (1)

Článek pro vás napsal Daniel Vítek
Avatar
Primárně PHP programátor, rád si hraje s Arduinem a píše články do sekce Batch.

Jak se ti líbí článek?
Celkem (10 hlasů) :
4.94.94.94.94.9


 


Miniatura
Předchozí článek
Cvičení k 3. lekci Batche
Miniatura
Všechny články v sekci
Příkazový řádek a dávkové soubory
Miniatura
Následující článek
Cvičení ke 4. lekci Batche

 

 

Komentáře

Avatar
Tomáš Brůna
Redaktor
Avatar
Tomáš Brůna:

Ahoj dá se nějak udělat např: {set /p heslo=Zadejte heslo: }
a pokud bude heslo prázdné program něco udělá (jak nastavit program aby zjistil zda je heslo prázdné) :-D

Editováno 10.3.2015 20:02
Odpovědět 10.3.2015 20:01
Lepší být šprt než blbec :)
Avatar
Tomáš Brůna
Redaktor
Avatar
Tomáš Brůna:

Ja bych spis potreboval:

set /p heslo=Heslo
if heslo="  " goto trest
if heslo=asus goto spravne
:trest
start cmd.exe
:spravne
exit

A jak udělat aby to poznalo ze heslo nebylo vyplneno a misto asus tam byla jenom mezera
Takze pokud heslo bude " " tak se stane neco :-)

Odpovědět 10.3.2015 20:34
Lepší být šprt než blbec :)
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Tomáš Brůna
Daniel Vítek:

Můžeš to nastavit pro všechny špatné odpovědi pomocí else .. s tou mezerou nevím.

 
Odpovědět  +1 10.3.2015 20:40
Avatar
Tomáš Brůna
Redaktor
Avatar
Odpovědět  +1 10.3.2015 20:55
Lepší být šprt než blbec :)
Avatar
Šimon Rataj
Člen
Avatar
Šimon Rataj:

Jak se udělá, aby nebylo heslo při zadávání vidět?

Editováno 20. června 13:29
 
Odpovědět 20. června 13:28
Avatar
Ondřej Bína:

Jak můžu dát při výběru více než 2 možnosti? Myslím tím něco jako v pythonu IF, ELIF, ELSE... Jaký je příkaz v bytchi místo ELIF?

 
Odpovědět 24. června 17:51
Avatar
Odpovídá na Ondřej Bína
Tomáš Pařízek:

Víš,
ono když se podíváš do programovacích jazyků,
tak většinou je tam funkce "else if"
Jakou to má výhodu?
Program jenom přečte jednu podmínku, a když neplatí tak přečte druhou.

Pokud však napíšeš 5× "if".
Tak je vždy přečte zaráz, ale Batch není odfláknutý jazyk, tudíž se s tím nějak popere.

 
Odpovědět 4. července 10:24
Avatar
Odpovídá na Tomáš Brůna
Tomáš Pařízek:

Batch velice dobře chápe mezery. Proto stačí napsat:

if %heslo%== ( goto TAM )

 
Odpovědět 4. července 10:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.