IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

11. diel - Matematické funkcie v Kotlin

V minulej lekcii, Viacrozmerné polia v Kotlin , sme si predstavili viacrozmerné pole. Naša výučba Kotlin teraz vlastne len začína, avšak tento on-line kurz tých najzákladnejších konštrukciách jazyka už dokončujeme. Som rád, že sme sa úspešne dostali až sem, ďalšie on-line kurz sa totiž bude venovať objektovo orientovanému programovania. Budeme tam vytvárať naozaj zaujímavé aplikácie a aj jednu hru. Kurz zakončíme odľahčujúcim článkom s prehľadom matematických funkcií, ktoré sa nám v našich programoch iste budú v budúcnosti hodiť.

Základné matematické funkcie sú v Kotlin obsiahnuté v balíčku kotlin.math. Už sme sa stretli s funkciou sqrt() pre získanie odmocniny.

V starších verzií jazyka sa matematické funkcie volali na triede Math, ako napr. Math.sqrt(24.0). Dajte si pozor, aby ste používali už nový zápis, kde sa volajú samostatne.

Import knižnice kotlin.math

Aby sme mohli matematické funkcie používať, musíme na začiatok nášho súboru napísať:

import kotlin.math.*

Konštanty

Máme k dispozícii matematické konštanty: PI a E. PI je pochopiteľne číslo Pí (3.1415...) a E je Eulerovo Číslo, teda základ prirodzeného logaritmu (2.7182...).

print("Pí: ${PI}\ne: ${E}\n")

výstup:

Pí: 3.141592653589793
e: 2.718281828459045

Dostupné matematické funkcie

Poďme si teraz popísať funkcie, ktoré knižnica poskytuje.

Podpora dátových typov na vstupe nižšie spomínaných funkcií je rôzna. Niektoré funkcie sú definované len pre desatinné čísla a niektoré len napr. Pre Double a Int, ale zas nepodporujú Float. Už vieme, že ak napíšeme názov funkcie a stlačíme Ctrl + Space, ukážu sa nám preťaženiu, teda možné spôsoby ako danú funkciu môžeme zavolať.

Ak by ste chceli napr. Použiť funkciu pow(), pozri nižšie, pre čísla celá, je potrebné tieto čísla najprv pretypovať napr. Na typ Double. To docielime zápisom (3 as Double).pow(2), čo by hodnotu 3 najprv previedlo na desatinné číslo a potom umocnilo na druhú.

min(), max()

Začnime s tým jednoduchším :) Obe funkcie berú ako parameter dve čísla ľubovoľného dátového typu (ale obaja parametre musia byť rovnakého typu). Funkcia min() vráti to menšie z čísel, funkcie max() to väčší z nich.

round(), ceil(), floor() a truncate()

Všetky tieto funkcie sa týkajú zaokrúhľovania. round() berie ako parameter desatinné číslo a vracia zaokrúhlené číslo typu Double alebo Float tak, ako to poznáme zo školy (od 0.5 nahor, inak dole). ceil() (ceiling) zaokrúhli vždy hore a floor() vždy dolu. Všetky tieto funkcie očakávajú typ Double alebo Float.

round() budeme určite potrebovať často, ďalšie funkcie som prakticky často použil napr. pri zisťovaní počtu stránok pri výpise komentárov v knihe návštev. Keď máme 33 príspevkov a na stránke ich je vypísané 10, budú teda zaberať 3.3 stránok. Výsledok musíme zaokrúhliť nahor, pretože v reále stránky budú samozrejme 4.

Ak vás napadlo, že floor() a truncate() robia to isté, správajú sa inak u záporných čísel. Vtedy floor() zaokrúhli na číslo viac do mínusu, truncate() zaokrúhli vždy k nule.

Zaokrúhlenie desatinného čísla a jeho uloženie do premennej typu Int teda vykonáme nasledujúcim spôsobom:

var d = 2.72
var a: Int = round(d).toInt()

abs() a sign()

abs() berie ako parameter ľubovoľné číslo ľubovoľného typu a vráti jeho absolútnu hodnotu. sign() berie na vstupe desatinné číslo a vráti podľa znamienka -1.0, 0.0 alebo 1.0 (pre záporné číslo, nulu a kladné číslo).

sin(), cos(), tan()

Klasické goniometrické funkcie, ako parameter berú uhol typu Double alebo Float, ktorý považujú v radiánoch, nie v stupňoch. Pre konverziu stupňov na radiány stupňa vynásobíme * (PI / 180). Výstupom je opäť desatinné číslo.

acos(), asin(), atan()

Opäť klasické cyklometrické funkcie (arkus funkcie), ktoré podľa hodnoty goniometrické funkcie vráti daný uhol. Parametrom je hodnota ako desatinné číslo, výstupom uhol v radiánoch (tiež desatinné číslo). Pokiaľ si prajeme mať uhol v stupňoch, vydelíme radiány / (180 / PI).

pow() a sqrt()

Metódu pow() nevoláme samostatne, ale na základu mocniny, ktorý je typu Double alebo Int. Ako parameter berie exponent. Ak by sme teda chceli spočítať napr. 2^3, kód by bol nasledujúci:

println(2.0.pow(3))

sqrt() je skratka zo square root a vráti teda druhú odmocninu z daného čísla typu Double alebo Float.

print(sqrt(24.0))

exp(), log(), log10(), log2()

exp() vracia Eulerovo Číslo, umocnené na daný desatinný exponent. log() vracia prirodzený logaritmus daného desatinného čísla. log10() vracia potom dekadický logaritmus daného desatinného čísla a log2() logaritmus so základom 2.

V zozname funkcií nápadne chýba ľubovoľná odmocnina. My ju však dokážeme spočítať aj na základe funkcií, ktoré knižnica kotlin.math poskytuje.

Vieme, že platí: 3. odm. z 8 = 8^(1/3). Môžeme teda napísať:

println(8.0.pow((1.0/3.0)))

Delenie

Programovacie jazyky sa často odlišujú tým, ako v nich funguje delení čísel. Túto problematiku je nutné dobre poznať, aby ste neboli potom (nepríjemne) prekvapení. Napíšme si jednoduchý program:

    val a = 5 / 2
    val b = 5.0 / 2
    val c = 5 / 2.0
    val d = 5.0 / 2.0
    // val e: Int = 5 / 2.0
    // val f: Double = 5 / 2

    print("$a\n$b\n$c\n$d")

V kóde niekoľkokrát delíme 5 / 2, čo je matematicky 2.5. Iste ale tušíte, že výsledok nebude vo všetkých prípadoch rovnaký. Trúfnete si tipnúť si čo kedy vyjde? Skúste to :)

Kód by sa nepreložil kvôli riadkom s premennou e a f, preto sme ich zakomentovali. Problém je v tom, že v týchto prípadoch vyjde desatinné číslo, ktoré sa snažíme uložiť do položky celého (Int) alebo celé číslo do Double. Výstup programu je potom nasledovné:

2
2.5
2.5
2.5

Vidíme, že výsledok delenie je niekedy celočíselný a niekedy reálny. Ak je jedno z čísel desatinné, je výsledok vždy desatinné číslo. 2 celé čísla vráti vždy zas celé číslo, dajte si na to pozor napr. Keď budete počítať priemer, pre desatinný výsledok je nutné aspoň jednu premennú pretypovať na desatinné číslo.

Napr. v jazyku PHP je výsledok delenie vždy desatinný. Až budete deliť v inom programovacom jazyku než je Kotlin, zistite si ako delenie funguje ako ho použijete.

Zvyšok po delení

V našich aplikáciách môžeme často potrebovať zvyšok po delení (tzv. Modulo). U nášho príkladu 5 / 2 je celočíselný výsledok 2 a modulo 1 (zvyšok). Modulo sa často používa pre zistenie či je číslo párne (zvyšok po delení 2 je 0), keď chcete napr. Vyfarbiť šachovnicu, zistiť odchýlku vašej pozície od nejakej štvorcovej siete a podobne.

V Kotlin a všeobecne tiež v céčkových jazykoch zapíšeme modulo ako %:

println(5 % 2) // Vypíše 1

Tak to by sme mali. Kurz pokračuje v sekcii Základy objektovo orientovaného programovania v Kotlin. Nabudúce si teda predstavíme objektový svet a pochopíme veľa vecí, ktoré nám až doteraz boli utajované :) Určite si skúste cvičenie, obsahuje nejaké veci s konzolou, čo sme si neukazovali a zaujímavé projekty.

V budúcej lekcii, Najčastejšie chyby Kotlin nováčikov - Vieš pomenovať premenné? , si ukážeme najčastejšie chyby začiatočníkov v Kotlin ohľadom pomenovanie premenných.


 

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é 31x (6.07 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Kotlin

 

Predchádzajúci článok
Viacrozmerné polia v Kotlin
Všetky články v sekcii
Základné konštrukcie jazyka Kotlin
Preskočiť článok
(neodporúčame)
Najčastejšie chyby Kotlin nováčikov - Vieš pomenovať premenné?
Č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