Lekce 14 - Matematické funkce v C# a knihovna Math
V předchozím kvízu, Kvíz - Pokročilé podmínky a cykly v C# .NET, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V dnešním tutoriálu se budeme věnovat knihovně
Math
, která v .NET poskytuje pro C# matematické
funkce jako zaokrouhlení, goniometrické funkce, mocniny, odmocniny a
podobně.
Základní matematické funkce jsou v .NET obsaženy ve třídě
Math
. Třída nám poskytuje dvě základní konstanty:
PI
a E
. PI
je pochopitelně číslo pí
(3.1415
…) a E
je Eulerovo číslo, tedy základ
přirozeného logaritmu (2.7182
…). Asi je zřejmé, jak se s
třídou pracuje, ale pro jistotu si na ukázku konstanty vypišme do
konzole:
{CSHARP_CONSOLE}
Console.WriteLine("pí: {0} \ne: {1}", Math.PI, Math.E);
Console.ReadKey();
{/CSHARP_CONSOLE}
Vidíme, že vše voláme na třídě Math
. V kódu se
neobjevuje nic moc zajímavého, pouze to, že jsme v textovém řetězci
použili speciální znak \n
, který způsobí odřádkování.
Konzolová aplikace
pí: 3.14159265358979
e: 2.71828182845905
Pojďme si nyní popsat metody, které třída poskytuje:
Metody na třídě Math
Min()
, Max()
Začněme tím jednodušším Obě funkce jako parametr berou dvě čísla libovolného datového
typu. Funkce
Min()
vrátí menší číslo, funkce
Max()
to větší z nich.
Round()
,
Ceiling()
, Floor()
a Truncate()
Všechny tři funkce se týkají zaokrouhlování. Round()
bere
jako parametr desetinné číslo a vrací zaokrouhlené číslo typu
double
tak, jak to známe ze školy (od 0.5
zaokrouhleno nahoru, jinak dolů). Ceiling()
zaokrouhlí vždy
nahoru a Floor()
vždy dolů. Truncate()
nezaokrouhluje, pouze odtrhne desetinnou část.
Round()
budeme jistě potřebovat často. Další funkce lze
prakticky použít např. při zjišťování počtu stránek při výpisu
komentářů v knize návštěv. Když máme 33 příspěvků a na každé
stránce jich je vypsáno 10, budou tedy zabírat 3,3 stránky. Výsledek
musíme zaokrouhlit nahoru, protože v reálu příspěvky samozřejmě zaberou
4 stránky.
Možná vás napadlo, že Floor()
a Truncate()
dělají totéž, avšak obě funkce se chovají jinak u záporných čísel.
Tehdy Floor()
zaokrouhlí číslo více do minusu,
Truncate()
zaokrouhlí vždy k nule.
Zaokrouhlení desetinného čísla a jeho uložení do proměnné typu
int
tedy provedeme následujícím způsobem:
double d = 2.72; int a = (int)Math.Round(d);
Přetypování na int
je nutné, jelikož Round()
sice vrací celé číslo, ale stále uložené v typu double
, a to
kvůli tomu, aby všechny matematické funkce pracovaly s typem
double
.
Abs()
a Sign()
Obě metody berou jako parametr číslo libovolného typu. Abs()
vrátí jeho absolutní hodnotu a Sign()
vrátí pro záporné
číslo -1
, pro nulu 0
a pro kladné číslo
1
.
Sin()
, Cos()
,
Tan()
Klasické goniometrické funkce, které jako parametr očekávají hodnotu
typu double
, jež vyjadřuje úhel v radiánech, nikoli stupních.
Pro konverzi stupňů na radiány stupně vynásobíme
* (Math.PI/180)
. Výstupem z funkce je opět
double
.
Acos()
, Asin()
,
Atan()
Opět klasické cyklometrické funkce (arkus funkce), které podle hodnoty
goniometrické funkce vrátí daný úhel. Parametrem je hodnota v
double
, výstupem úhel v radiánech (také double
).
Pokud si přejeme mít úhel ve stupních, radiány vydělíme
/ (180 / Math.PI)
.
Pow()
a Sqrt()
Pow()
bere dva parametry typu double
, přičemž
prvním parametrem je základ mocniny a druhým exponent. Pokud bychom tedy
chtěli spočítat např. 23, kód by byl následující:
{CSHARP_CONSOLE}
Console.WriteLine(Math.Pow(2, 3));
{/CSHARP_CONSOLE}
Sqrt()
je zkratka odvozená ze slov SQuare RooT, funkce tedy
vrátí druhou odmocninu z daného čísla typu double
. Obě funkce
vrací výsledek jako double
.
Exp()
, Log()
,
Log10()
Exp()
vrací Eulerovo číslo umocněné na daný exponent.
Log()
vrací přirozený logaritmus daného čísla.
Log10()
potom vrací dekadický logaritmus daného čísla.
V seznamu metod nápadně chybí libovolná odmocnina. My ji však dokážeme
spočítat i na základě funkcí, které Math
poskytuje.
Jestliže víme, že platí: 3. odmocnina z 8 = 8^(1/3), můžeme pak do kódu napsat:
{CSHARP_CONSOLE}
Console.WriteLine(Math.Pow(8, (1.0/3.0)));
{/CSHARP_CONSOLE}
Je velmi důležité, abychom při dělení napsali alespoň jedno číslo s desetinnou tečkou, jinak bude C# předpokládat celočíselné dělení a výsledkem by v tomto případě bylo 80 = 1.
Dělení
Programovací jazyky se často odlišují tím, jak v nich funguje dělení čísel. Tuto problematiku je nutné dobře znát, abychom poté nebyli (nepříjemně) překvapeni. Napiš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ódu několikrát dělíme 5 / 2
, což je matematicky 2.5.
Jistě ale tušíme, že výsledek nebude ve všech případech stejný.
Troufneme si tipnout, co kdy vyjde? Zkusme to
Kód by se nepřeložil kvůli řádku s proměnnou f
, proto
jsme ho zakomentovali. Problém je v tom, že v tomto případě vyjde
desetinné číslo, které se snažíme uložit do čísla celého
(int
). Výstup programu je poté následující:
Konzolová aplikace
2
2
2.5
2.5
2.5
Vidíme, že výsledek dělení je někdy celočíselný a někdy reálný. Přitom vůbec nezáleží na datovém typu proměnné, do které výsledek ukládáme, ale na datovém typu čísel, které dělíme. Pokud je jedno z čísel desetinné, je výsledek vždy desetinné číslo. Dvě celá čísla vrátí vždy zase celé číslo. Musíme si dát pozor na to, když budeme počítat např. průměr. Pro desetinný výsledek je nutné alespoň jednu proměnnou přetypovat na desetinné číslo.
int soucet = 10; int pocet = 4; double prumer = (double)soucet / pocet;
Např. v jazyce PHP je výsledek dělení vždy desetinný. Až budete dělit v jiném programovacím jazyce, než je C# .NET, vždy si zjistěte, jak dělení funguje, než jej použijete.
Zbytek po celočíselném dělení
V našich aplikacích můžeme často potřebovat zbytek po celočíselném
dělení (tzv. modulo). U našeho příkladu 5 / 2
je
celočíselný výsledek 2 a modulo 1 (zbytek). Modulo se často používá pro
zjištění, zda je číslo sudé (zbytek po dělení 2 je 0), když chceme
např. vybarvit šachovnici, zjistit odchylku naší pozice od nějaké
čtvercové sítě a podobně.
V C# .NET a obecně v céčkových jazycích zapíšeme modulo jako
%
:
{CSHARP_CONSOLE}
Console.WriteLine(5 % 2); // Vypíše 1
{/CSHARP_CONSOLE}
Pro ty, kteří nemohou klávesu % najít, na české klávesnici se nachází zde (nezapomeňte na Shift):

V další lekci, K čemu jsou algoritmy?, probereme úvod do světa algoritmů a řekneme si, co to algoritmus vlastně je a proč by nás něco takového mělo vůbec zajímat.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 1119x (22.28 kB)
Aplikace je včetně zdrojových kódů v jazyce C#