Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

4. diel - Podmienky (vetvenia) v Kotlin

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

V minulej lekcii Kotlin kurzu, Riešené úlohy k 3. lekcii Kotlin , 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 vetvenie používame podmienky. Tým sa budeme venovať celý dnešný Kotlin tutoriál. Vytvoríme program na výpočet odmocniny a vylepšíme našu kalkulačku.

Podmienky

V Kotlin sa podmienky píšu dosť rovnako, ako vo všetkých Clik 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:

Klikni pre editáciu
  • if (15 > 5)
        println("Pravda")
    println("Program tu pokračuje ďalej")
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    Výstup programu:

    Pravda
    Program tu pokračuje ďalej

    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á:

    Klikni pre editáciu
    • println("Zadaj nejaké číslo")
      val a = readLine()!!.toInt()
      if (a > 5)
          println("Zadal si číslo väčšie ako 5!")
      println("Ďakujem za zadania")
      
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      Operátormi

      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 pred neho výkričník. V podmienkovom bloku samozrejme môžeme vykonať ľubovoľne príkazov. Ak vykonávame viac ako jeden, vkladáme ich do bloku zo zložených zátvoriek:
      Klikni pre editáciu
      • import kotlin.math.* // Import vždy patrí do hlavičky súboru
        
        fun main(args: Array<String>) {
            println("Zadaj nejaké číslo, z ktorého spočítám odmocninu:")
            val a = readLine()!!.toInt()
            if (a > 0) {
                println("Zadal si číslo väčšie ako 0, to znamená, že ho môžem odmocniť!")
                val o = sqrt(a.toDouble())
                println("Odmocnina z čísla $a je $o")
            }
            println("Ďakujem za zadania")
        }
        
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        výsledok:

        Zadaj nejaké číslo, z ktorého spočítám odmocninu:
        144
        Zadal si číslo väčšie ako 0, to znamená, že ho môžem odmocniť!
        Odmocnina z čísla 144 je 12.0
        Ďakujem za zadania

        Program načíta od užívateľa číslo a ak je väčšia ako 0, vypočíta z neho druhú odmocninu. Funkcia sqrt() vracia druhú odmocninu ako Double, ale musíme najskôr vstup konvertovať na Double. Aby sme mohli takého matematické funkcie v Kotlin používať, je potrebné najprv naimportovať kotlin.math, pozri prvý riadok zdrojového kódu vyššie. 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:

        Klikni pre editáciu
        • import kotlin.math.* // Import vždy patrí do hlavičky súboru
          
          fun main(args: Array<String>) {
          
              println("Zadaj nejaké číslo, z ktorého spočítám odmocninu:")
              val a = readLine()!!.toInt()
              if (a > 0) {
                  println("Zadal si číslo väčšie ako 0, to znamená, že ho môžem odmocniť!")
                  val o = sqrt(a.toDouble())
                  println("Odmocnina z čísla $a je $o)")
              }
              if (a <= 0) {
                  println("Odmocnina zo záporného čísla neexistuje!")
              }
          
              println("Ďakujem za zadania")
          }
          
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          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á:

          Klikni pre editáciu
          • import kotlin.math.* // Import vždy patrí do hlavičky súboru
            
            fun main(args: Array<String>) {
                println("Zadaj nejaké číslo, z ktorého spočítám odmocninu:")
                val a = readLine()!!.toInt()
                if (a > 0) {
                    println("Zadal si číslo väčšie ako 0, to znamená, že ho môžem odmocniť!")
                    val o = sqrt(a.toDouble())
                    println("Odmocnina z čísla $a je $o")
                }
                else
                    println("Odmocnina zo záporného čísla neexistuje!")
            
                println("Ďakujem za zadania")
            }
            
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            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 opäť blok { }.

            Kľúčové slovo 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 vetvy 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, dosadíme tam 1, ak 1, dosadíme 0). Naivne by sme mohli kód napísať takto:

            Klikni pre editáciu
            • var a = 0 // do a si priradíme na začiatku 0
              
              if (a == 0) { // ak je a 0, dáme do neho jedničku
                  a = 1
              }
              
              if (a == 1) { // ak je a 1, dáme doňho nulu
                  a = 0
              }
              println(a)
              
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              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.

              Klikni pre editáciu
              • var a = 0 // do a si priradíme na začiatku 0
                
                if (a == 0) { // ak je a 0, dáme do neho jedničku
                    a = 1
                } else { // ak je a 1, dáme doňho nulu
                    a = 0
                }
                
                println(a)
                
                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                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:
                Klikni pre editáciu
                • println("Zadajte číslo v rozmedzí 10-20:")
                  val a = readLine()!!.toInt()
                  if (a >= 10 && a <= 20) {
                      println("Zadal si správne")
                  } else {
                      println("Zadal si zle")
                  }
                  
                  • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

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

                  Klikni pre editáciu
                  • println("Zadajte číslo v rozmedzí 10-20 alebo 30-40:")
                    val a = readLine()!!.toInt()
                    if (((a >= 10) && (a <= 20)) || ((a >=30) && (a <= 40))) {
                        println("Zadal si správne")
                    } else {
                        println("Zadal si zle")
                    }
                    
                    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                    when

                    Konštrukcia when je prevzatá z jazyka C (ako veľká časť gramatiky Kotlin), kde je známa ako konštrukcia switch. 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 when by sme napísali kód podobný tomuto:

                    Klikni pre editáciu
                    • println("Vitajte v kalkulačke")
                      println("Zadajte prvé číslo:")
                      val a = readLine()!!.toDouble()
                      println("Zadajte druhé číslo:")
                      val b = readLine()!!.toDouble()
                      println("Zvoľte si operáciu:")
                      println("1 - sčítanie")
                      println("2 - odčítanie")
                      println("3 - násobenie")
                      println("4 - delenie")
                      val volba = readLine()!!.toInt()
                      var vysledek: Double = 0.0
                      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)) {
                          println("Výsledok: $vysledek")
                      } else {
                          println("Neplatná voľba")
                      }
                      println("Ďakujem za použitia kalkulačky.")
                      
                      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                      výstup:

                      Vitajte v kalkulačke
                      Zadajte prvé číslo:
                      3,14
                      Zadajte druhé číslo:
                      2,72
                      Zvoľte si operáciu:
                      1 - sčítanie
                      2 - odčítanie
                      3 - násobenie
                      4 - delenie
                      2
                      Výsledok: 0,42
                      Ďakujem za použitia kalkulačky.

                      Všimnite si, že sme premennú vysledek deklarovali na začiatku, len tak do nej môžeme potom priraďovať. Keby sme ju deklarovali u každého priradenie, Kotlin by kód nezkompiloval a vyhodil chybu redeklarace premenné. Premenná môže byť deklarovaná (založená v pamäti) vždy iba raz. Bohužiaľ Kotlin nie je schopný poznať, či je do premennej vysledek naozaj priradená nejaká hodnota. Ozve sa pri výpise na konzole, kde sa mu nepáči, že môže vypisovať premennú, ktorá nemá priradenú hodnotu. Z tohto dôvodu na začiatku dosadíme do vysledek nulu.

                      Ďalšia vychytávka je kontrola 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 when:

                      Klikni pre editáciu
                      • println("Vitajte v kalkulačke")
                        println("Zadajte prvé číslo:")
                        val a = readLine()!!.toDouble()
                        println("Zadajte druhé číslo:")
                        val b = readLine()!!.toDouble()
                        println("Zvoľte si operáciu:")
                        println("1 - sčítanie")
                        println("2 - odčítanie")
                        println("3 - násobenie")
                        println("4 - delenie")
                        val volba = readLine()!!.toInt()
                        var vysledek: Double = 0.0
                        when (volba) {
                            1 -> vysledek = a + b
                            2 -> vysledek = a - b
                            3 -> vysledek = a * b
                            4 -> vysledek = a / b
                        }
                        if ((volba > 0) && (volba < 5)) {
                            println("Výsledok: $vysledek")
                        } else {
                            println("Neplatná voľba")
                        }
                        println("Ďakujem za použitia kalkulačky.")
                        
                        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                        Vidíme, že kód je trochu prehľadnejšie. Ak by sme potrebovali v nejakej vetve when spustiť viac príkazov, budeme ich písať do bloku { }. V pôvodnom switch z jazyka C sa jednotlivé vetvy museli ukončovať príkazom break, v Kotlin toto neplatí a v prípade when vždy vykoná iba jednu z nich. Konštrukcia when môže namiesto x -> obsahovať ešte možnosť else ->, ktorá sa vykoná v prípade, že nebude platiť žiadna vetva. Je len na vás, či budete when používať, všeobecne sa oplatí len pri väčšom množstve príkazov a vždy ide nahradiť sekvencií if a else. Samozrejme je možné použiť when aj pre hodnoty String ové premennej.

                        V budúcej lekcii, Riešené úlohy k 4. lekcii Kotlin , sa budeme venovať cyklom.

                        V nasledujúcom cvičení, Riešené úlohy k 4. lekcii Kotlin, 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é 50x (12.24 kB)
                        Aplikácia je vrátane zdrojových kódov v jazyku Kotlin

                         

                        Ako sa ti páči článok?
                        Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
                        Predchádzajúci článok
                        Riešené úlohy k 3. lekcii Kotlin
                        Všetky články v sekcii
                        Základné konštrukcie jazyka Kotlin
                        Preskočiť článok
                        (neodporúčame)
                        Riešené úlohy k 4. lekcii Kotlin
                        Článok pre vás napísal Samuel Kodytek
                        Avatar
                        Užívateľské hodnotenie:
                        3 hlasov
                        Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
                        Aktivity