IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

14. 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ále 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:

Console.WriteLine("pi: {0} \ne: {1}", Math.PI, Math.E);
Console.ReadKey();

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

Poďme si teraz 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()

První 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é hore, inak dole). Ceiling() zaokrúhli vždy hore a Floor() vždy dole. Truncate() nezaokrúhľuje, iba odtrhne 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 stránky. Výsledok musíme zaokrúhliť nahor, pretože v reáli 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. Pre 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áti daný uhol. Parametrom je hodnota v double, výstupom uhol v radiánoch (tiež double). Ak si prajeme 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. Pokiaľ by sme teda chceli spočítať napr. 23, kód by bol nasledujúci:

Console.WriteLine(Math.Pow(2, 3));

Sqrt() je skratka odvodená zo slov SQuare RooT, funkcia teda vráti druhú odmocninu z daného čísla typu double. Obe funkcie vracia 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), môžeme potom do kódu napísať:

Console.WriteLine(Math.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 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:

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();

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 kedy vyjde? Skúsme 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 (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é, je výsledok vždy desatinné číslo. Dve celé čísla vráti vždy zase celé číslo. Musíme si dať pozor na to, keď budeme počítať napr. priemer. Pre desatinný výsledok je nutné aspoň jednu premennú pretypovať na desatinné číslo.

int sum = 10;
int count = 4;
double average = (double)sum / count;

Napr. v jazyku PHP je výsledok delenia vždy desatinný. Až budete deliť v inom programovacom jazyku, než je C# .NET, vždy si zistite, 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). 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 %:

Console.WriteLine(5 % 2); // prints 1

Pre tých, ktorí nemôžu kláves % nájsť, na slovenskej klávesnici sa nachádza tu (nezabudnite na Shift):

Percento na slovenskej klávesnici - Základná konštrukcia jazyka C# .NET

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é 2x (45.42 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Kvíz - Pokročilé podmienky a cykly v C# .NET
Všetky články v sekcii
Základná konštrukcia jazyka C# .NET
Preskočiť článok
(neodporúčame)
Na čo sú algoritmy?
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
2 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity