Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

12. diel - Matematické funkcie v Dart a knižnica dart: math

V minulej lekcii, Vnorené zoznamy v Dart , sme si predstavili vnorené zoznamy. Tento Dart tutoriál venujeme prehľadu matematických metód, ktoré sa nám v našich programoch iste budú v budúcnosti hodiť.

Základné matematické metódy sú v Dart v knižnici dart: math. Trieda nám poskytuje základné konštanty: E, PI, ďalej i druhú odmocninu z čísla 2 (SQRT2) az 1/2 (SQRT1_2) a niekoľko předpočítaných logaritmov LN10, LN2, LOG2E a LOG10E. 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 konštantami tejto knižnice pracuje, ale pre istotu si na ukážku konštanty Vypíšme do konzoly:

print('Pí: $PI');
print('e: $E');
print('2. odmocnina ze 2: $SQRT2');
print('2. odmocnina z 1/2: $SQRT1_2');
print('Logaritmus čísla 10 o základu e: $LN10');
print('Logaritmus čísla 2 o základu e: $LN2');
print('Logaritmus čísla e o základu 2: $LOG2E');
print('Logaritmus čísla e o základu 10: $LOG10E');

Výstup programu:

Konzolová aplikácia
Pí: 3.141592653589793
e: 2.718281828459045
2. odmocnina ze 2: 1.4142135623730951
2. odmocnina z 1/2: 0.7071067811865476
Logaritmus čísla 10 o základu e: 2.302585092994046
Logaritmus čísla 2 o základu e: 0.6931471805599453
Logaritmus čísla e o základu 2: 1.4426950408889634
Logaritmus čísla e o základu 10: 0.4342944819032518

Poďme si teraz popísať metódy, ktoré trieda poskytuje:

Metódy knižnice dart: math

Min () a 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.

Sin (), cos (), tan ()

Klasické goniometrické funkcie, ako parameter berú uhol v radiánoch typu num (tj. int alebo double). Pre konverziu stupňov na radiány stupňa vynásobíme * (PI / 180). Výstupom je double.

ACOS (), asin (), atan (), ATAN2 ()

Opäť klasické cyklometrické funkcie (arkus funkcie), ktoré podľa hodnoty goniometrické funkcie vráti daný uhol. Parametrom je opäť hodnota typu num, výstupom je uhol v radiánoch (double). Pokiaľ si prajeme mať uhol v stupňoch, vydelíme radiány / (180 / PI).

Funkcia atan2() je štvorkvadrantové variant funkcia atan(), ako parameter berie 2 čísla a, b a ak je b kladné, výsledok je rovnaký ako atan(b / a). Funkcia atan2() je teda vhodná pre prevod z kartézských súradníc do súradníc polárnych.

Pow () a sqrt ()

Funkcia pow() berie dva parametre typu (num), prvý je základ mocniny a druhý exponent. Vracia výsledok ako int, alebo, ak aspoň jeden parameter bol typu double, vracia výsledok ako double. Ak by sme teda chceli spočítať napr. 2 3, kód by bol nasledujúci:

print(pow(2, 3));

sqrt() je skratka zo square root a vráti teda druhú odmocninu z daného čísla typu num. Výsledok vracia ako double.

Exp (), log ()

Funkcia exp() vracia Eulerovo Číslo, umocnené na daný exponent. Funkcia log() vracia prirodzený 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é dart:math poskytuje.

Vieme, že platí: 3. odm. z 8 = 8 ^ (1/3). Môžeme teda napísať:

print(pow(8, 1/3));

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:

//int a = 5 / 2;
int a2 = (5 / 2).toInt();
int a3 = 5 ~/ 2;

double b = 5 / 2;
double c = 5.0 / 2;
double d = 5 / 2.0;
double e = 5.0 / 2.0;

print('$a2\n$a3\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 nespustil kvôli riadku s premennou a, preto sme ho zakomentovali. Problém je v tom, že v tomto prípade vyjde desatinné číslo (kvôli delenie), ktoré sa snažíme uložiť do položky celého (int). Výstup programu je potom nasledovné:

Konzolová aplikácia
2
2
2.5
2.5
2.5
2.5

Vidíme, že výsledok sa zhoduje s tým, čo by sme očakávali v matematike. Celočíselný je vtedy, keď výsledok po delení prevedieme na int metódou toInt(), alebo ak použijeme celočíselné delenie ~ /. Naopak, výsledok každého delenie je vždy desatinný.

V Dart nemožno priradiť celočíselný literál (napr. 4) do typu double a naopak i trebárs "pekný" desatinný literal do typu int (napr. 4.0).

// double x = 4;
double x = 4.toDouble();

// int y = 4.0;
int y = 4.0.toInt();

Pozn .: V iných programovacích jazykoch toto nemusí byť pravidlom a správanie sa môže líšiť. Dávajte si na túto problematiku pozor.

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í dvojkou je 0), keď chcete napr. Vyfarbiť šachovnicu, zistiť odchýlku vašej pozície od nejakej štvorcovej siete a podobne.

V Dart a všeobecne v céčkových jazykoch zapíšeme modulo ako %:

print(5 % 2);

print('Výsledek 5 / 2 je ${5 ~/ 2} a zbytek je ${5 % 2}.');

Metódy na type num

Ako sme si už spomínali skôr, priamo dátový typ num (z ktorého vychádza int i double) má veľa ďalších metód. Povieme si niečo teda io nich.

Round (), roundDouble (), floor (), floorToDouble (), ceil (), ceilToDouble ()

Všetky funkcie zaokrúhľujú číslo. Funkcia round() sa chová ako klasické zaokrúhľovania v matematike, floor() naopak zaokrúhľuje iba bane, ceil() zas len nahor (). Všetky 3 funkcie vracia typ int a majú aj varianty (s Postfix ... toDouble()), ktoré vracajú typ double.

print('round: ${k.round()}, ${l.round()}, ${m.round()}');
print('floor: ${k.floor()}, ${l.floor()}, ${m.floor()}');
print('ceil: ${k.ceil()}, ${l.ceil()}, ${m.ceil()}');

Výstup programu:

Konzolová aplikácia
round: 4, 4, 5
floor: 4, 4, 4
ceil: 4, 5, 5

ToInt (), toDouble (), toString ()

Všetky čísla sa môžu presúvať medzi celočíselnú a desatinnú reprezentáciou, prípadne previesť aj do reťazca.

Abs () a sign ()

Funkcia abs() vracia absolútnu hodnotu, sign() vracia podľa znamienka -1, 0 alebo 1 (pre záporné, nulu a kladné číslo).

IsFinite, isInfinite, isNegative

Čísla majú tiež vlastnosti, ktoré nám pomôžu určiť, či je číslo konečné, nekonečné alebo záporné.

Tak to by sme mali prácu s matematickými funkciami. V budúcom lekcii, Riešené úlohy k 11.-12. lekciu Dart , si niečo povieme o hodnote null a ako s ňou pracovať. Blížime sa ku koncu:-)

V nasledujúcom cvičení, Riešené úlohy k 11.-12. lekciu Dart, 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é 6x (1.8 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Dart

 

Predchádzajúci článok
Vnorené zoznamy v Dart
Všetky články v sekcii
Základné konštrukcie jazyka Dart
Preskočiť článok
(neodporúčame)
Riešené úlohy k 11.-12. lekciu Dart
Článok pre vás napísal Honza Bittner
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Aktivity