Lekce 14 - Matematické funkce ve VB.NET a knihovna Math
V předchozím kvízu, Kvíz - Pokročilé podmínky a cykly ve VB.NET, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V dnešním Visual Basic .NET tutoriálu se podíváme na matematické funkce, které se nám v našich programech jistě budou v budoucnu hodit.
Základní matematické funkce jsou v .NET obsaženy v třídě
Math
. Třída nám poskytuje dvě základní konstanty:
PI
a E
. PI
je pochopitělně číslo Pí
(3.1415...
) a E
je Eulerovo číslo, tedy základ
přirozeného logaritmu (2.7182...
). Asi je jasné, jak se s
třídou pracuje, ale pro jistotu si na ukázku konstanty vypišme do
konzole:
{VBNET_CONSOLE}
Console.WriteLine("Pí: {0}", Math.PI)
Console.WriteLine("e: {0}", Math.E)
Console.ReadKey()
{/VBNET_CONSOLE}
Vidíme, že vše voláme na třídě Math
. Na kódu není nic
moc zajímavého kromě toho, že jsme v textovém řetězci použili
speciální konstantu vbCrLf
, 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 s tím jednodušším . Obě funkce berou jako parametr dvě čísla libovolného datového
typu. Funkce Min()
vrátí to menší, 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
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 jsem
prakticky často použil 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 stránce jich
je vypsáno 10, budou tedy zabírat 3.3 stránek. Výsledek musíme zaokrouhlit
nahoru, protože v reálu stránky budou samozřejmě 4.
Pokud vás napadlo, že Floor()
a Truncate()
dělají to samé, chovají se jinak u záporných čísel. Tehdy
Floor()
zaokrouhlí na číslo více do mínusu,
Truncate()
zaokrouhlí vždy k nule.
Zaokrouhlení desetinného čísla a jeho uložení do proměnné typu
Integer
tedy provedeme následujícím způsobem:
Dim d As Double = 2.72 Dim a As Integer = Math.Round(d)
Přetypování na Integer
je nutné, jelikož
Round()
vrací sice celé číslo, ale stále uložené v typu
Double
. Důvodem je, 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í podle znaménka
-1,
0
nebo 1
(pro záporné číslo, nulu
a kladné číslo).
Sin()
, Cos()
,
Tan()
Klasické goniometrické funkce, jako parametr berou úhel typu
Double
, který považují v radiánech, nikoli ve stupních. Pro
konverzi stupňů na radiány stupně vynásobíme
* (Math.PI / 180)
. Výstupem 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, vydělíme radiány
/ (180 / Math.PI)
.
Pow()
a Sqrt()
Pow()
bere dva parametry typu Double
, první je
základ mocniny a druhý exponent. Pokud bychom tedy chtěli spočíst např.
2^3
, kód by byl následující:
{VBNET_CONSOLE}
Console.WriteLine(Math.Pow(2, 3))
{/VBNET_CONSOLE}
VB.NET má pro mocnění i operátor, to samé můžeme zapsat jako:
{VBNET_CONSOLE}
Console.WriteLine(2^3)
{/VBNET_CONSOLE}
Sqrt()
je zkratka ze square root a vrátí tedy 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()
vrací potom 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.
Víme, že platí: 3. odm. z 8 = 8^(1/3)
. Můžeme tedy
napsat:
{VBNET_CONSOLE}
Console.WriteLine(Math.Pow(8, (1.0/3.0)))
{/VBNET_CONSOLE}
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 nebyli poté (nepříjemně) překvapeni. Napišme si jednoduchý program:
{VBNET_CONSOLE}
Dim a As Integer = 5 / 2
Dim b As Double = 5 / 2
Dim c As Double = 5.0 / 2
Dim d As Double = 5 / 2.0
Dim e As Double = 5.0 / 2.0
Dim f As Integer = 5 / 2.0
Console.WriteLine("{0}" & vbCrLf & "{1}" & vbCrLf & "{2}" & vbCrLf & "{3}" & vbCrLf & "{4}"& vbCrLf & "{5}", a, b, c, d, e, f)
Console.ReadKey()
{/VBNET_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ý.
Výstup programu je následující:
Konzolová aplikace
2
2.5
2.5
2.5
2.5
2
Vidíme, že výsledek dělení je někdy celočíselný a
někdy reálný. Je to dáno datovým typem proměnné, do
které výsledek ukládáme. Při použití proměnné typu Integer
je výsledek vždy zaokrouhlený na celé číslo.
Například když budeme počítat průměr, pak pro
desetinný výsledek je nutné použít proměnnou typu
Single
nebo Double
:
Dim soucet As Integer = 10 Dim pocet As Integer = 4 Dim prumer As 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 Visual Basic .NET, zjistěte si, 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ě.
Ve Visual Basic .NET zapíšeme modulo jako Mod
:
{VBNET_CONSOLE}
Console.WriteLine(5 Mod 2) ' Vypíše 1
{/VBNET_CONSOLE}
Tak to bychom měli. Výuka nyní pokračuje navazujícím kurzem Základy objektově orientovaného programování ve Visual Basic .NET. Příště si tedy představíme objektový svět a pochopíme mnoho věcí, které nám až doteď byly utajovány
V další lekci, K čemu jsou algoritmy?, si uděláme úvod do světa algoritmů, řekneme si, co to algoritmus vlastně je, a proč by nás něco takového mělo vůbec zajímat.