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...).
import kotlin.math.*
fun main(args: Array<String>) {
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:
import kotlin.math.*
fun main(args: Array<String>) {
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.
import kotlin.math.*
fun main(args: Array<String>) {
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ť:
import kotlin.math.*
fun main(args: Array<String>) {
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:
import kotlin.math.*
fun main(args: Array<String>) {
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
%:
import kotlin.math.*
fun main(args: Array<String>) {
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é 37x (6.07 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Kotlin
