Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

5. diel - Podmienky (vetvenia) v Dart

V predchádzajúcom cvičení, Riešené úlohy k 4. lekcii Dart, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii Dart kurzu, Riešené úlohy k 4. lekcii Dart , sme si podrobne prebrali dátové typy. Aby sme si niečo naprogramovali, potrebujeme nejako reagovať na rôzne situácie. Môže to byť napríklad hodnota zadaná užívateľom, podľa ktorej budeme chcieť meniť ďalšie beh programu. Hovoríme, že sa program vetví a k vetvenia používame podmienky, tým sa budeme venovať celý dnešný tutoriál. Vytvoríme program na výpočet odmocniny a vylepšíme našu kalkulačku.

Podmienky

V Dart sa podmienky píšu úplne rovnako, ako vo všetkých C-like jazykoch, pre začiatočníkov samozrejme vysvetlím. Pokročilejšie sa asi budú chvíľku nudiť.:-)

Podmienky zapisujeme pomocou kľúčového slova if, za ktorým nasleduje logický výraz. Ak je výraz pravdivý, vykoná sa nasledujúci príkaz. Ak nie, nasledujúci príkaz sa preskočí a pokračuje sa až pod ním. Vyskúšajme si to:

if (15 > 5)
    print('Pravda');
print('Program zde pokračuje dál');

Výstup programu:

Konzolová aplikácia
Pravda
Program zde pokračuje dál

Ak podmienka platí (čo tu áno), vykoná sa príkaz Vyhlasujúca do konzoly text pravda. V oboch prípadoch program pokračuje ďalej. Súčasťou výrazu samozrejme môže byť aj premenná:

print('Zadej nějaké číslo');
int a = int.parse(stdin.readLineSync(encoding: UTF8));
if (a > 5)
    print('Zadal jsi číslo větší než 5!');
print('Děkuji za zadání');

Ukážme si teraz relačné operátory, ktoré môžeme vo výrazoch používať:

operátor C-like zápis
rovnosť ==
Je ostro väčšia >
Je ostro menšia <
Je väčšie alebo rovné > =
Je menšie alebo rovné <=
nerovnosť ! =
Všeobecná negácia !
Rovnosť zapisujeme dvoma == preto, aby sa to neplietlo s bežným priradením do premennej, ktoré sa robí len jedným =. Ak chceme nejaký výraz znegovat, napíšeme ho do zátvorky a dáme pred neho výkričník. Keď budeme chcieť vykonať viac než len jeden príkaz, musíme príkazy vložiť do bloku zo zložených zátvoriek:
print('Zadej nějaké číslo');
int a = int.parse(stdin.readLineSync(encoding: UTF8));
if (a > 0) {
    print('Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!');
    double o = sqrt(a);
    print('Odmocnina z čísla $a je $o');
}
print('Děkuji za zadání');

Výstup programu:

Konzolová aplikácia
Zadej nějaké číslo
144
Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!
Odmocnina z čísla 144 je 12.0
Děkuji za zadání

Program načíta od užívateľa číslo a ak je väčšia ako 0, vypočíta z neho druhú odmocninu. Okrem iného sme použili knižnicu dart:math, ktorá obsahuje množstvo užitočných matematických metód. Na konci tejto kapitoly si ju bližšie predstavíme. Metóda sqrt() vracia hodnotu ako double. Bolo by pekné, keby nám program vyhubovala v prípade, že zadáme záporné číslo. S doterajšími znalosťami by sme napísali niečo ako:

print('Zadej nějaké číslo, ze kterého spočítám odmocninu:');
int a = int.parse(stdin.readLineSync(encoding: UTF8));
if (a > 0) {
    print('Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!');
    double o = sqrt(a);
    print('Odmocnina z čísla $a je $o');
}
if (a <= 0) print('Odmocnina ze záporného čísla neexistuje!');
print('Děkuji za zadání');

Všimnite si, že musíme pokryť aj prípad, kedy sa a == 0, nielen keď je menšia. Kód však môžeme výrazne zjednodušiť pomocou kľúčového slova else, ktoré vykoná nasledujúci príkaz alebo blok príkazov v prípade, že sa podmienka nevykoná:

print('Zadej nějaké číslo, ze kterého spočítám odmocninu:');
int a = int.parse(stdin.readLineSync(encoding: UTF8));
if (a > 0) {
    print('Zadal jsi číslo větší než 0, to znamená, že ho mohu odmocnit!');
    double o = sqrt(a);
    print('Odmocnina z čísla $a je $o');
} else
    print('Odmocnina ze záporného čísla neexistuje!');
print('Děkuji za zadání');

Kód je oveľa prehľadnejšie a nemusíme vymýšľať opačnú podmienku, čo by v prípade zloženej podmienky mohlo byť niekedy aj veľmi ťažké. V prípade viac príkazov by bol za else doplnil opäť blok { }.

Else sa tiež využíva v prípade, keď potrebujeme v príkaze manipulovať s premennou z podmienky a nemôžeme sa na ňu teda pýtať potom znova. Program si sám pamätá, že sa podmienka nesplnila a prejde do sekcie else. Ukážme si to na príklade: Majme číslo a, kde bude hodnota 0 alebo 1 a po nás sa bude chcieť, aby sme hodnotu prehodili (ak tam je 0, dáme tam 1, ak 1, dáme tam 0). Naivne by sme mohli kód napísať takto:

int a = 0; // do a si přiřadíme na začátku 0

if (a == 0) // pokud je a 0, dáme do něj jedničku
    a = 1;
if (a == 1) // pokud je a 1, dáme do něj nulu
    a = 0;

print(a);

Nefunguje to, že? Poďme si prejsť, čo bude program robiť. Na začiatku máme v a nulu, prvá podmienka sa určite splní a dosadí do a jedničku. No ale razom sa splní aj tá druhá. Čo s tým? Keď podmienky otočíme, budeme mať ten istý problém s jednotkou. Ako z toho von? Áno, použijeme else.

int a = 0; // do a si přiřadíme na začátku 0

if (a == 0) // pokud je a 0, dáme do něj jedničku
    a = 1;
else // pokud je a 1, dáme do něj nulu
    a = 0;

print(a);

Podmienky je možné skladať a to pomocou dvoch základných logických operátorov:

operátor C-like zápis
A zároveň &&
alebo ||
Uveďme si príklad:
print('Zadejte číslo v rozmezí 10-20:');
int a = int.parse(stdin.readLineSync(encoding: UTF8));
if ((a >= 10) && (a <= 20))
    print('Zadal jsi správně');
else
    print('Zadal jsi špatně');

S tým si zatiaľ vystačíme, operátorov sa pomocou zátvoriek samozrejme dajú kombinovať.

print('Zadejte číslo v rozmezí 10-20 nebo 30-40:');
int a = int.parse(stdin.readLineSync(encoding: UTF8));
if (((a >= 10) && (a <= 20)) || ((a >= 30) && (a <= 40)))
    print('Zadal jsi správně');
else
    print('Zadal jsi špatně');

Switch

Switch je konštrukcia, prevzatá z jazyka C (ako väčšina gramatiky Dart). Umožňuje nám zjednodušiť (relatívne) zápis viac podmienok pod sebou. Spomeňme si na našu kalkulačku v prvých lekciách, ktorá načítala 2 čísla a vypočítala všetky 4 operácie. Teraz si ale budeme chcieť zvoliť, ktorú operáciu chceme. Bez switche by sme napísali kód podobný tomuto:

print('Vítejte v kalkulačce');
print('Zadejte první číslo:');
double a = double.parse(stdin.readLineSync(encoding: UTF8));
print('Zadejte druhé číslo:');
double b = double.parse(stdin.readLineSync(encoding: UTF8));
print('Zvolte si operaci:');
print('1 - sčítání');
print('2 - odčítání');
print('3 - násobení');
print('4 - dělení');
int volba = int.parse(stdin.readLineSync(encoding: UTF8));
double vysledek;
if (volba == 1)
    vysledek = a + b;
else if (volba == 2)
    vysledek = a - b;
else if (volba == 3)
    vysledek = a * b;
else if (volba == 4)
    vysledek = a / b;
if ((volba > 0) && (volba < 5))
    print('Výsledek: $vysledek');
else
    print('Neplatná volba');
print('Děkuji za použití kalkulačky.');

Výstup aplikácie:

Konzolová aplikácia
Vítejte v kalkulačce
Zadejte první číslo:
3.14
Zadejte druhé číslo:
2
Zvolte si operaci:
1 - sčítání
2 - odčítání
3 - násobení
4 - dělení
3
Výsledek: 6.28
Děkuji za použití kalkulačky.

Všimnite si, že v kóde máme vychytávku pre kontrolu správnosti voľby. Program by v tomto prípade fungoval rovnako aj bez tých else, ale načo sa ďalej pýtať, keď už máme výsledok.

Teraz si skúsime napísať ten istý kód pomocou switche:

print('Vítejte v kalkulačce');
print('Zadejte první číslo:');
double a = double.parse(stdin.readLineSync(encoding: UTF8));
print('Zadejte druhé číslo:');
double b = double.parse(stdin.readLineSync(encoding: UTF8));
print('Zvolte si operaci:');
print('1 - sčítání');
print('2 - odčítání');
print('3 - násobení');
print('4 - dělení');
int volba = int.parse(stdin.readLineSync(encoding: UTF8));
double vysledek;
switch (volba) {
    case 1:
        vysledek = a + b;
        break;
    case 2:
        vysledek = a - b;
        break;
    case 3:
        vysledek = a * b;
        break;
    case 4:
        vysledek = a / b;
        break;
}
if ((volba > 0) && (volba < 5))
    print('Výsledek: $vysledek');
else
    print('Neplatná volba');
print('Děkuji za použití kalkulačky.');

Vidíme, že kód je trochu prehľadnejšie. Ak by sme potrebovali v nejakej vetve switche spustiť viac príkazov, prekvapivo ich nebudeme písať do {} bloku, ale rovno pod seba. Blok {} nám tu nahrádza príkaz break, ktorý spôsobí vyskočeniu z celého switche. Switch môže namiesto case x: obsahovať ešte možnosť default:, ktorá sa vykoná v prípade, že nebude platiť žiadny case. Je len na vás, či budete switch používať, všeobecne sa oplatí len pri väčšom množstve príkazov a vždy ide nahradiť sekvencií if a else. Nezabúdajte na breaky. Switch ide samozrejme urobiť aj pre hodnoty stringové premennej.

To by sme mali. V budúcej lekcii, Riešené úlohy k 5. lekcii Dart , nás čakajú polia a cykly, tým dovŕšite základné znalosti, máte sa na čo tešiť.:)

V nasledujúcom cvičení, Riešené úlohy k 5. lekcii Dart, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 6x (2.88 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Dart

 

Predchádzajúci článok
Riešené úlohy k 4. lekcii Dart
Všetky články v sekcii
Základné konštrukcie jazyka Dart
Preskočiť článok
(neodporúčame)
Riešené úlohy k 5. lekcii Dart
Článok pre vás napísal Honza Bittner
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Aktivity