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

5. diel - Cykly v Kotlin

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

Teraz prejdeme k cyklom. Po dnešnom Kotlin tutoriálu už budeme mať takmer kompletnú výbavu základných konštrukcií a budeme schopní tvoriť rozumné aplikácie.

Cykly

Ako už slovo cyklus napovie, niečo sa bude opakovať. Keď chceme v programe niečo urobiť 100x, určite nebudeme písať pod seba 100x ten istý kód, ale vložíme ho do cyklu. Cyklov máme niekoľko druhov, vysvetlíme si, kedy ktorý použiť. Samozrejme si ukážeme praktické príklady.

for cyklus

for cyklus má pevne stanovený počet opakovaní a umožňuje nám postupne prejsť všetky prvky nejakej skupiny objektov. Cyklus sa spúšťa postupne pre všetky prvky danej skupiny, pričom každému takémuto behu cyklu hovoríme iterácie. Cyklus všeobecne zapíšeme nasledujúcim spôsobom:

for (premenna in skupina)

Najprv si ukážme ako jednoducho urobiť niečo viackrát. Ak chceme napr. 5x vykonať kód v cykle, vygenerovali by sme si rozsah čísel od 1 do 5 a tie cyklom prešli. Kód by bol nasledujúci:

for (i in 1..5) {

}

Týmto sa kód cyklu vykoná 5x a premenná i bude mať postupne hodnoty od 1 do 5.

Ak poznáte for cyklus z iných jazykov, pravdepodobne ste si všimli, že v Kotlin pripomína skôr tzv. Cyklus foreach.

Poďme si urobiť jednoduchý príklad, väčšina z nás určite pozná Sheldona z The Big Bang Theory. Pre tých čo nie, budeme simulovať situáciu, kedy klope na dvere svojej susedky. Vždy 3x zaklope a potom zavolá: "Penny!". Náš kód by bez cyklov vyzeral takto:

Klikni pre editáciu
  • println("Knock")
    println("Knock")
    println("Knock")
    println("Penny!")
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    My ale už nič nemusíme otrocky opisovať:

    Klikni pre editáciu
    • for (i in 1..3) {
          println("Knock")
      }
      println("Penny!")
      
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      výsledok:

      Knock
      Knock
      Knock
      Penny!

      Skúsme si teraz využiť to, že sa nám premenná inkrementuje. Vypíšme si čísla od jednej do desať. Pretože nebudeme chcieť, aby sa nám v konzole text vždy odřádkoval, použijeme funkciu print().

      Klikni pre editáciu
      • for (i in 1..10) {
            print("$i ")
        }
        
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        výsledok:

        1 2 3 4 5 6 7 8 9 10

        Vidíme, že riadiaci premenná má naozaj v každej iterácii (priebehu) inú hodnotu.

        Teraz si vypíšeme malú násobilku (násobky čísel 110, vždy do desať). Stačí nám urobiť cyklus od 1 do 10 a premennú vždy násobiť daným číslom. Mohlo by to vyzerať asi takto:

        Klikni pre editáciu
        • println("Malá násobilka pomocou cyklov:")
          for (i in 1..10) {
              print("$i ")
          }
          println()
          for (i in 1..10) {
              print("${i * 2} ")
          }
          println()
          for (i in 1..10) {
              print("${i * 3} ")
          }
          println()
          for (i in 1..10) {
              print("${i * 4} ")
          }
          println()
          for (i in 1..10) {
              print("${i * 5} ")
          }
          println()
          for (i in 1..10) {
              print("${i * 6} ")
          }
          println()
          for (i in 1..10) {
              print("${i * 7} ")
          }
          println()
          for (i in 1..10) {
              print("${i * 8} ")
          }
          println()
          for (i in 1..10) {
              print("${i * 9} ")
          }
          println()
          for (i in 1..10) {
              print("${i * 10} ")
          }
          
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          Výstup programu:

          Malá násobilka pomocou cyklov:
          1 2 3 4 5 6 7 8 9 10
          2 4 6 8 10 12 14 16 18 20
          3 6 9 12 15 18 21 24 27 30
          4 8 12 16 20 24 28 32 36 40
          5 10 15 20 25 30 35 40 45 50
          6 12 18 24 30 36 42 48 54 60
          7 14 21 28 35 42 49 56 63 70
          8 16 24 32 40 48 56 64 72 80
          9 18 27 36 45 54 63 72 81 90
          10 20 30 40 50 60 70 80 90 100

          Program funguje pekne, ale stále sme toho dosť napísali. Ak vás napadlo, že v podstate robíme 10x to isté a len zvyšujeme číslo, ktorým násobíme, máte pravdu. Nič nám nebráni vložiť 2 cykly do seba:

          Klikni pre editáciu
          • println("Malá násobilka pomocou dvoch cyklov:")
            for (i in 1..10) {
                for (j in 1..10) {
                    print("${i * j} ")
                }
                println()
            }
            
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            Pomerne zásadný rozdiel, že? Pochopiteľne nemôžeme použiť u oboch cyklov i, pretože sú vložené do seba. Premenná j nadobúda vo vonkajšom cykle hodnôt 110. V každej iterácii (rozumejte priebehu) cyklu je potom spustený ďalší cyklus s premennou i. Ten je nám už známy, vypíše násobky, v tomto prípade násobíme premennú j. Po každom behu vnútorného cyklu treba odřádkovat, to vykoná println().

            Urobme si ešte jeden program, na ktorom si ukážeme prácu s vonkajšou premennou. Aplikácia bude vedieť spočítať ľubovoľnú mocninu ľubovoľného čísla:

            Klikni pre editáciu
            • println("Mocninátor")
              println("==========")
              println("Zadajte základ mocniny: ")
              val a = readLine()!!.toInt()
              println("Zadajte exponent: ")
              val n = readLine()!!.toInt()
              var vysledek = a
              for (i in 1..n-1) {
                  vysledek = vysledek * a
              }
              println("Výsledok: $vysledek")
              println("Ďakujem za použitia mocninátoru")
              
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              Asi všetci tušíme, ako funguje mocnina. Pre istotu pripomeniem, že napríklad 2^3 = 2 * 2 * 2. Teda a^n spočítame tak, že n-1 krát vynásobíme číslo a číslom a. Výsledok si samozrejme musíme ukladať do premennej. Spočiatku bude mať hodnotu a a postupne sa bude v cykle pronásobovat. Ak ste to nestihli, máme tu samozrejme článok s algoritmom výpočtu ľubovoľnej mocniny. Vidíme, že naša premenná vysledek je v tele cyklu normálne prístupná. Ak si však nejakú premennú založíme v tele cyklu, po skončení cyklu zanikne a už nebude prístupná.

              Mocninátor
              ==========
              Zadajte základ mocniny:
              2
              Zadajte exponent:
              3
              Výsledok: 8
              Ďakujem za použitia mocninátoru

              Už tušíme, na čo sa for cyklus využíva. Zapamätajme si, že je počet opakovaní pevne daný. Premenná cyklu je v každej iterácii konštanta, takže ju ani nemôžete meniť (niektoré jazyky to umožňujú, ale vedie to k problémom).

              while cyklus

              Cyklus while funguje inak, jednoducho opakuje príkazy v bloku kým platí podmienka. Syntax cyklu je nasledovné:

              while (podmienka) {
                  // príkazy
              }

              Ak vás napadá, že možno cez while cyklus urobiť aj for cyklus, máte pravdu:) Cyklus for je vlastne špeciálny prípad while cyklu. Cyklus while sa ale používa na trochu iné veci, často máme v jeho podmienke napr. Metódu vracajúci logickú hodnotu true / false. Pôvodný príklad z for cyklu by sme urobili pomocou while nasledovne:

              Klikni pre editáciu
              • var i = 1
                while (i <= 10) {
                    println(i)
                    i += 1
                }
                
                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                To ale nie je ideálne použitie while cyklu. Vezmeme si našu kalkulačku z minulých lekcií a opäť ju trochu vylepšíme, konkrétne o možnosť zadať viac príkladov. Program teda hneď neskončí, ale spýta sa užívateľa, či si praje spočítať ďalší príklad. Pripomeňme si pôvodnú verziu kódu (je to tá verzia s when, ale pokojne použite aj tú bez neho, záleží na vás):

                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ú.

                  Teraz vložíme takmer celý kód do while cyklu. Našou podmienkou bude, že používateľ zadá ano, budeme teda kontrolovať obsah premennej pokracovat. Spočiatku bude táto premenná nastavená na "ano", aby sa program vôbec spustil, potom do nej necháme načítať voľbu užívateľa:

                  println("Vitajte v kalkulačke")
                  var pokracovat = "áno"
                  while (pokracovat == "áno") {
                      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("Prajete si zadať ďalší príklad? [áno/nie]")
                      pokracovat = readLine()!!
                  }
                  println("Ďakujem za použitia kalkulačky.")

                  výsledok:

                  Vitajte v kalkulačke
                  Zadajte prvé číslo:
                  12
                  Zadajte druhé číslo:
                  128
                  Zvoľte si operáciu:
                  1 - sčítanie
                  2 - odčítanie
                  3 - násobenie
                  4 - delenie
                  1
                  Výsledok: 140
                  Prajete si zadať ďalší príklad? [áno/nie]
                  áno
                  Zadajte prvé číslo:
                  -10,5
                  Zadajte druhé číslo:

                  Naši aplikáciu možno teraz používať viackrát a je už takmer hotová.

                  Už toho vieme celkom dosť, začína to byť zábava, že?:)

                  V nasledujúcom cvičení, Riešené úlohy k 5. 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é 39x (26.98 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 4. lekcii Kotlin
                  Všetky články v sekcii
                  Základné konštrukcie jazyka Kotlin
                  Preskočiť článok
                  (neodporúčame)
                  Riešené úlohy k 5. 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