11. diel - Matematické funkcie vo Swift
V minulej lekcii, Viacrozmerné polia vo Swift , sme si predstavili viacrozmerné pole. Naša výučba Swift 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ú vo Swiftu obsiahnuté v module
Foundation
, ktorý inak potrebujete pre rad ďalšie funkcionality.
Už sme sa stretli so sqrt()
pre získanie odmocniny.
Máme k dispozícii tiež matematické konštanty: M_PI
a
M_E
. M_PI
je pochopiteľne číslo Pí
(3.1415
...) a E
je Eulerovo Číslo, teda základ
prirodzeného logaritmu (2.7182
...). Konštantu Pí môžeme
získať aj z typov Double
alebo Float
.
{SWIFT}
print("Pí: \(Double.pi) \ne: \(M_E)")
{/SWIFT}
výstup:
Pí: 3.14159265358979 e: 2.71828182845905
Poďme si teraz popísať dostupné matematické funkcie.
Dostupné matematické funkcie
min()
, max()
Začnime s tým jednoduchším Obe funkcie berú ako parameter dve čísla ľubovoľného dátového
typu. Funkcia min()
vráti to menšie, funkcia max()
to väčší z nich.
round()
, ceil()
,
floor()
a trunc()
Všetky tieto funkcie sa týkajú zaokrúhľovania. round()
berie ako parameter desatinné číslo a vracia zaokrúhlené číslo
typu Double
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. trunc()
(truncate)
nezaokrúhľujú, iba odtrhne desatinnú časť. Všetky tieto funkcie
očakávajú typ Double
, pre Float
existujú varianty
s f
na konci názvu, napr .: roundf()
.
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 trunc()
robia to
isté, správajú sa inak u záporných čísel. Vtedy floor()
zaokrúhli na číslo viac do mínusu, trunc()
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:
let d = 2.72 let a : Int = Int(round(d))
Pretypovanie na Int
je nutné, pretože round()
vracia síce celé číslo, ale stále uložené v type Double
a to
kvôli tomu, aby všetky matematické funkcie pracovali s typom
Double
.
abs()
, sign
a
signum()
Častejšie budete používať abs()
, ktorá vráti absolútnu
(preložené: vždy kladnú) hodnotu čísla. Metóda signum()
sa
volá na Int
premenných a vráti podľa znamienka -1
,
0
alebo 1
(pre záporné číslo, nulu a kladné
číslo).
Vlastnosť sign
pre typy Float
a
Double
vracia FloatingPointSign
, čo je
enum
s hodnotami plus
a minus
. Plus
dostanete pre 0
a kladné čísla, mínus pre záporná.
Každopádne Apple v dokumentácii varuje, aby sme nepoužívali túto
vlastnosť k zisteniu, či je hodnota záporná, pretože môže byť
NaN
(Not-a-number).
sin()
, cos()
,
tan()
Klasické goniometrické funkcie, ako parameter berú uhol typu
Double
, ktorý považujú v radiánoch, nie v stupňoch. Pre
konverziu stupňov na radiány stupňa vynásobíme * (M_PI/180)
.
Výstupom je opäť Double
. Funkcia majú opäť aj
Float
varianty.
acos()
, asin()
,
atan()
Klasické cyklometrické funkcie (arkus funkcie), ktoré podľa hodnoty
goniometrické funkcie vráti daný uhol. Parametrom je hodnota v
Double
(a zase máme Float
varianty), výstupom uhol v
radiánoch (tiež Double
). Pokiaľ si prajeme mať uhol v
stupňoch, vydelíme radiány / (180 / M_PI)
.
pow()
a sqrt()
pow()
berie dva parametre typu Double
, prvý je
základ mocniny a druhý exponent. Opäť máme aj ďalšie varianty. Ak by sme
teda chceli spočítať napr. 2 3, kód by bol nasledujúci:
{SWIFT}
print(pow(2.0, 3.0))
{/SWIFT}
sqrt()
je skratka zo SQ uare R
oo T a vráti teda druhú odmocninu z daného čísla typu
Double
. Obe funkcie vracia výsledok ako Double
. Pre
typ Float
máme funkciu sqrtf()
.
exp()
, log()
,
log10()
exp()
vracia Eulerovo Číslo, umocnené na daný exponent.
log()
vracia prirodzený logaritmus daného čísla.
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 poskytovaných matematických funkcií.
Vieme, že platí: 3. odm. z 8 = 8 ^ (1/3). Môžeme teda napísať:
{SWIFT}
print(pow(8, (1.0/3.0)))
{/SWIFT}
Je veľmi dôležité, aby sme pri delení napísali aspoň jedno číslo s desatinnou bodkou, inak bude Swift predpokladať celočíselné delenie a výsledkom by v tomto prípade bolo 8 0 = 1.
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:
{SWIFT}
let a : Int = 5 / 2
let b : Double = 5 / 2
let c : Double = 5.0 / 2
let d : Double = 5 / 2.0
let e : Double = 5.0 / 2.0
// let f : Int = 5 / 2.0
print("\(a)\n\(b)\n\(c)\n\(d)\n\(e)")
{/SWIFT}
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 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 položky celého (Int
). Výstup
programu je potom nasledovné:
2 2.5 2.5 2.5 2.5
Vidíme, že výsledok delenie je v prvom prípade celočíselný a inak
reálny. Záleží na tom, do akého typu ukladáme. Hoci je v druhom prípade
delenia rovnaké ako v tom prvom, pretože ukladáme do Double
, tak
máme desatinný výsledok. Ak delíme dve celé čísla a výsledok ukladáme
do Int
, tak dostaneme opäť celé číslo. Posledná možnosť (s
premennou f
) nebude fungovať, pretože delíme 2.0
a
Swift sa snažia do celočíselné premenné uložiť Double
.
Napr. v jazyku PHP je výsledok delenie vždy desatinný. Až budete deliť v inom programovacom jazyku ako je Swift, 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.
Vo Swift a všeobecne tiež v céčkových jazykoch zapíšeme modulo ako
%
:
{SWIFT}
print(5 % 2) // Vypíše 1
{/SWIFT}
Tak to by sme mali. Kurz bude pokračovať v sekcii Základy objektovo orientovaného programovania vo Swift. 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 i cvičenie.
V nasledujúcom cvičení, Riešené úlohy k 10.-11. lekciu Swift, 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é 18x (32.08 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Swift