17. diel - Matematické funkcie v Jave a knižnica Math
V minulej lekcii, Cykly v Jave do tretice - do-while, break a continue, sme ucelili naše znalosti cyklov ďalšími konštrukciami a kľúčovými slovami, na ktoré môžeme naraziť v cudzích zdrojových kódoch.
Naša on-line výučba Javy teraz vlastne ešte len začína, avšak v tomto kurze s tutoriálmi o tých najzákladnejších konštrukciách jazyka sme už na konci. Som rád, že sme sa úspešne dostali až sem, ďalšia sekcia sa totiž bude venovať objektovo orientovanému programovaniu. Budeme tam vytvárať naozaj zaujímavé aplikácie a aj jednu hru. Sekciu zakončíme odľahčujúcim článkom s prehľadom matematických funkcií, ktoré sa nám v našich programoch určite budú v budúcnosti hodiť.
Trieda Math
Základné matematické metódy sú v Jave obsiahnuté v triede
Math
. Trieda nám poskytuje dve základné konštanty:
PI
a E
. Konštanta PI
je pochopiteľne
číslo Pí (3.1415...
) a E
je Eulerovo číslo, teda
základ prirodzeného logaritmu (2.7182...
). Asi je jasné, ako sa
s triedou pracuje, ale pre istotu si na ukážku konštanty vypíšme do
konzoly:
{JAVA_CONSOLE}
System.out.println("Pi: " + Math.PI);
System.out.println("e: " + Math.E);
{/JAVA_CONSOLE}
Vidíme, že všetko voláme na triede Math
.
Konzolová aplikácia
Pi: 3.141593
e: 2.718282
Poďme si teraz popísať metódy, ktoré trieda poskytuje:
Metódy na triede Math
Metódy min()
a max()
Začnime tým jednoduchším Obe metódy berú ako parameter dve čísla ľubovoľného dátového
typu. Metóda min()
vráti to menšie, metóda max()
to väčšie z nich.
Metódy round()
,
ceil()
a floor()
Všetky tri metódy sa týkajú zaokrúhľovania. Metóda
round()
berie ako parameter desatinné číslo a vracia
zaokrúhlené číslo typu double
tak, ako to
poznáme zo školy (od 0.5
hore, inak dole). Metóda
ceil()
zaokrúhli vždy nahor a metóda floor()
vždy
nadol.
Metódu round()
budeme určite potrebovať často, ďalšie
metódy som v praxi č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ých 10, budú teda zaberať 3.3 stránok.
Výsledok musíme zaokrúhliť nahor, pretože v reáli budú stránky
samozrejme 4.
Metódy abs()
a
signum()
Obe metódy berú ako parameter číslo ľubovoľného typu. Metóda
abs()
vráti jeho absolútnu hodnotu a signum()
vráti
podľa znamienka -1
, 0
alebo 1
(pre
záporné číslo, nulu a kladné číslo).
Metódy sin()
, cos()
a
tan()
Ide o klasické goniometrické funkcie, ako parameter berú uhol typu
double
v radiánoch, nie v stupňoch. Pre konverziu stupňov na
radiány vynásobíme stupne * (Math.PI/180)
. Výstupom je opäť
double
.
Metódy acos()
,
asin()
a atan()
Opäť klasické cyklometrické metódy (arkus funkcie), ktoré podľa
hodnoty goniometrickej funkcie vrátia daný uhol. Parametrom je hodnota
dátového typu double
, výstupom uhol v radiánoch (tiež typu
double
). Ak si prajeme mať uhol v stupňoch, vydelíme radiány
vzorcom / (180 / Math.PI)
.
Metódy pow()
a
sqrt()
Metóda pow()
berie dva parametre typu double
,
prvý je základ mocniny a druhý exponent. Ak by sme teda chceli spočítať
napr. 23, kód by bol nasledovný:
{JAVA_CONSOLE}
System.out.println(Math.pow(2, 3));
{/JAVA_CONSOLE}
Skratka sqrt je zo SQuare
RooT a vráti teda druhú odmocninu z daného
čísla typu double
. Obe funkcie vracajú výsledok ako typ
double
.
Metódy exp()
, log()
a log10()
Metóda exp()
vracia Eulerovo číslo umocnené na daný
exponent. Ďalej metóda log()
vracia prirodzený logaritmus
daného čísla. Metóda log10()
vracia potom dekadický logaritmus
daného čísla.
V zozname metód nápadne chýba ľubovoľná odmocnina. My ju však
dokážeme spočítať aj na základe funkcií, ktoré Math
poskytuje.
Vieme, že platí: 3. odmocnina z 8 je 8 1/3. Môžeme teda napísať:
{JAVA_CONSOLE}
System.out.println(Math.pow(8, (1.0/3.0)));
{/JAVA_CONSOLE}
Je veľmi dôležité, aby sme pri delení napísali aspoň jedno číslo s desatinnou bodkou, inak bude Java predpokladať celočíselné delenie a výsledkom by v tomto prípade bolo 80 = 1.
Delenie
Programovacie jazyky sa často odlišujú tým, ako v nich funguje delenie čísel. Túto problematiku je nutné dobre poznať, aby ste potom neboli (nepríjemne) prekvapení. Napíšme si jednoduchý program:
{JAVA_CONSOLE}
int a = 5 / 2;
double b = 5 / 2;
double c = 5.0 / 2;
double d = 5 / 2.0;
double e = 5.0 / 2.0;
// int f = 5 / 2.0;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
{/JAVA_CONSOLE}
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úť, čo kedy vyjde? Skúste to
Kód by sa nepreložil kvôli riadku s premennou f
, preto sme ho
zakomentovali. Problém je v tom, že v tomto prípade vyjde desatinné číslo,
ktoré sa snažíme uložiť do čísla celého (typ int
). Výstup
programu je potom nasledujúci:
Konzolová aplikácia
2
2.0
2.5
2.5
2.5
Vidíme, že výsledok delenia je niekedy celočíselný a niekedy reálny. Pritom vôbec nezáleží na dátovom type premennej, do ktorej výsledok ukladáme, ale na dátovom type čísel, ktoré delíme. Pokiaľ je jedno z čísel desatinné, je výsledok vždy desatinné číslo. Dve celé čísla vrátia vždy 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:
int sum = 10; int count = 4; double diameter = (double)sum / count;
Napríklad v jazyku PHP je výsledok delenia vždy desatinný. Až budete deliť v inom programovacom jazyku ako v Jave, zistite si, ako delenie funguje, než ho použijete.
Zvyšok po celočíselnom delení
V našich aplikáciách môžeme často potrebovať zvyšok po celočíselnom
delení (tzv. modulo). V našom príklade 5 / 2
je
celočíselný výsledok 2
a modulo 1
(zvyšok).
Modulo sa často používa na 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 Jave a všeobecne v céčkových jazykoch zapíšeme modulo ako
%
:
{JAVA_CONSOLE}
System.out.println(5 % 2); // result is 1
{/JAVA_CONSOLE}
Tak to by sme mali. V kurze Základná konštrukcia jazyka Java nájdete ešte niekoľko ďalších príkladov na precvičenie, ktoré určite odporúčame vypracovať. Na kurz teraz nadväzujú Základy objektovo orientovaného programovania v Jave. Nabudúce si teda predstavíme objektový svet a pochopíme mnoho vecí, ktoré nám až doteraz boli utajované
V nasledujúcom kvíze, Kvíz - Pokročilé podmienky a cykly v Jave, si vyskúšame 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é 13x (2.15 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java