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