15. diel - Matematické funkcie v C# a knižnica Math
V predchádzajúcom kvíze, Kvíz - Pokročilé podmienky a cykly v C# .NET, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.
V dnešnom tutoriáli sa budeme venovať knižnici
Math, ktorá v .NET poskytuje pre C# matematické
funkcie ako zaokrúhlenie, goniometrické funkcie, mocniny, odmocniny a
podobne.
Základné matematické funkcie sú v .NET obsiahnuté v triede
Math. Trieda nám poskytuje dve základné 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...). Asi je zrejmé, ako sa s
triedou pracuje, ale pre istotu si na ukážku konštanty vypíšme do
konzoly:
{CSHARP_CONSOLE}
Console.WriteLine("pi: {0} \ne: {1}", Math.PI, Math.E);
Console.ReadKey();
{/CSHARP_CONSOLE}
Vidíme, že všetko voláme na triede Math. V kóde sa
neobjavuje nič zaujímavé, iba to, že sme v textovom reťazci použili
špeciálny znak \n, ktorý spôsobí odriadkovanie:
Konzolová aplikácia
pi: 3,14159265358979
e: 2,71828182845905
Teraz si poďme popísať metódy, ktoré trieda poskytuje:
Metódy na triede Math
Min(), Max()
Začnime tým jednoduchším
Obe funkcie ako parameter berú dve čísla ľubovoľného dátového
typu. Funkcia Min() vráti menšie číslo, funkcia
Max() to väčšie z nich.
Round(),
Ceiling(), Floor() a Truncate()
Prvé tri 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
zaokrúhlené nahor, inak nadol). Ceiling() zaokrúhli vždy nahor
a Floor() vždy nadol. Truncate() nezaokrúhľuje, iba
odstráni desatinnú časť.
Round() budeme určite potrebovať často. Ďalšie funkcie je
možné prakticky použiť 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 každej stránke
ich je vypísaných 10, budú teda zaberať 3,3 strany. Výsledok musíme
zaokrúhliť nahor, pretože v skutočnosti príspevky samozrejme zaberú 4
stránky.
Možno vás napadlo, že Floor() a Truncate() robia
to isté, avšak obe funkcie sa správajú inak pri záporných číslach. Vtedy
Floor() zaokrúhli čí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:
double d = 2.72; int a = (int)Math.Round(d);
Pretypovanie na int je nutné, pretože Round()
síce vracia 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() a Sign()
Obe metódy berú ako parameter číslo ľubovoľného typu.
Abs() vráti jeho absolútnu hodnotu a Sign() vráti
pre záporné číslo -1, pre nulu 0 a pre kladné
číslo 1.
Sin(), Cos(),
Tan()
Klasické goniometrické funkcie, ktoré ako parameter očakávajú hodnotu
typu double, ktorá vyjadruje uhol v radiánoch, nie stupňoch. Na
konverziu stupňov na radiány stupňa vynásobíme
* (Math.PI/180). Výstupom z funkcie je opäť
double.
Acos(), Asin(),
Atan()
Opäť klasické cyklometrické funkcie (arkus funkcie), ktoré podľa
hodnoty goniometrickej funkcie vrátia daný uhol. Parametrom je hodnota v
double, výstupom uhol v radiánoch (tiež double). Ak
chceme mať uhol v stupňoch, radiány vydelíme
/ (180 / Math.PI).
Pow() a Sqrt()
Pow() berie dva parametre typu double, pričom
prvým parametrom je základ mocniny a druhým exponent. Ak by sme teda chceli
spočítať napr. 23, kód by bol nasledujúci:
{CSHARP_CONSOLE}
Console.WriteLine(Math.Pow(2, 3));
{/CSHARP_CONSOLE}
Sqrt() je skratka odvodená zo slov SQuare RooT, funkcia teda
vráti druhú odmocninu z daného čísla typu double. Obe funkcie
vrátia výsledok ako double.
Exp(), Log(),
Log10()
Exp() vracia Eulerovo číslo umocnené na daný exponent.
Log() vracia prirodzený logaritmus daného čísla.
Log10() potom vracia 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.
Ak vieme, že platí: 3. odmocnina z 8 = 8^(1/3), potom môžeme do kódu napísať:
{CSHARP_CONSOLE}
Console.WriteLine(Math.Pow(8, (1.0/3.0)));
{/CSHARP_CONSOLE}
Je veľmi dôležité, aby sme pri delení napísali aspoň jedno číslo s desatinnou bodkou, inak bude C# 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 sme potom neboli (nepríjemne) prekvapení. Napíšme si jednoduchý program:
{CSHARP_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;
Console.WriteLine("{0}\n{1}\n{2}\n{3}\n{4}", a, b, c, d, e);
Console.ReadKey();
{/CSHARP_CONSOLE}
V kóde niekoľkokrát delíme 5 / 2, čo je matematicky 2,5.
Iste ale tušíme, že výsledok nebude vo všetkých prípadoch rovnaký.
Trúfneme si tipnúť, čo vyjde? Skúsme to 
Kód by sa nepreložil kvôli riadku s premennou f, preto sme ho
okomentovali. Problém je v tom, že v tomto prípade vyjde desatinné číslo,
ktoré sa snažíme uložiť do čísla celého (int). Výstup
programu je potom nasledujúci:
Konzolová aplikácia
2
2
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é, výsledok je vždy desatinné číslo. Dve celé čísla vrátia vždy zase celé číslo. Musíme si dať pozor na to, keď budeme počítať napr. priemer. Pre desatinný výsledok je nutné pretypovať na desatinné číslo aspoň jednu premennú.
int sum = 10; int count = 4; double average = (double)sum / count;
Napr. v jazyku PHP je výsledok delenia vždy desatinný. Keď budete deliť v inom programovacom jazyku, ako je C# .NET, vždy si zistite, ako delenie funguje predtým, ako 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). Pri 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ď chceme napr. vyfarbiť šachovnicu, zistiť odchýlku
našej pozície od nejakej štvorcovej siete a podobne.
V C# .NET a všeobecne v céčkových jazykoch zapíšeme modulo ako
%:
{CSHARP_CONSOLE}
Console.WriteLine(5 % 2); // prints 1
{/CSHARP_CONSOLE}
Pre tých, ktorí nemôžu kláves % nájsť, na slovenskej klávesnici sa nachádza tu (nezabudnite na Shift):

V ďalšej lekcii, Na čo sú algoritmy?, preberieme úvod do sveta algoritmov a povieme si, čo to algoritmus vlastne je a prečo by nás niečo také malo vôbec zaujímať.
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é 16x (45.91 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

David sa informačné technológie naučil na