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