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 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.

print("Pí: \(Double.pi) \ne: \(M_E)")

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:

print(pow(2.0, 3.0))

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ť:

print(pow(8, (1.0/3.0)))

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:

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)")

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 %:

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

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

 

Predchádzajúci článok
Viacrozmerné polia vo Swift
Všetky články v sekcii
Základné konštrukcie jazyka Swift
Preskočiť článok
(neodporúčame)
Riešené úlohy k 10.-11. lekciu Swift
Článok pre vás napísal Filip Němeček
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje vývoji iOS aplikací (občas macOS)
Aktivity