12. diel - Matematické funkcie v C # a knižnica Math
V minulej lekcii, Cykly v C # .NET druhýkrát - do-while, break a continue , sme ucelili naše znalosti cyklov ďalšími konštrukciami a kľúčovými slovami, na ktoré môžeme naraziť v cudzích zdrojových kódoch.
V minulej lekcii, Cykly v C # .NET druhýkrát - do-while, break a continue , sme si predstavili viacrozmerné pole. Naša výučba C # .NET teraz vlastne len začína, avšak tento on-line kurz tých najzákladnejších konštrukciách jazyka už dokončujeme. Som rád, že sme sa úspešne dostali až sem, ďalšie on-line kurz sa totiž bude venovať objektovo orientovanému programovania . Budeme tam vytvárať naozaj zaujímavé aplikácie a aj jednu hru. Kurz zakončíme odľahčujúcim článkom s prehľadom matematických funkcií, ktoré sa nám v našich programoch iste budú v budúcnosti hodiť.
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 jasné, ako sa s
triedou pracuje, ale pre istotu si na ukážku konštanty Vypíšme do
konzoly:
{CSHARP_CONSOLE}
Console.WriteLine("Pí: {0} \ne: {1}", Math.PI, Math.E);
Console.ReadKey();
{/CSHARP_CONSOLE}
Vidíme, že všetko voláme na triede Math
. Na kódu nie je
nič moc zaujímavého okrem toho, že sme v textovom reťazci použili
špeciálny znak \n
, ktorý spôsobí odriadkovanie.
Konzolová aplikácia
Pí: 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 s tým jednoduchším Obe funkcie berú ako parameter dve čísla ľubovoľného dátového
typu. Funkcia Min()
vráti to menšie, funkcia Max()
to väčší z nich.
Round (), Ceiling (), Floor () a Truncate ()
Všetky 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
nahor, inak dole). Ceiling()
zaokrúhli vždy hore a
Floor()
vždy dolu. Truncate()
nezaokrúhľujú, iba
odtrhne desatinnú časť.
Round()
budeme určite potrebovať často, ďalšie funkcie som
prakticky často použil 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 stránke ich je
vypísané 10, budú teda zaberať 3.3 stránok. Výsledok musíme zaokrúhliť
nahor, pretože v reále stránky budú samozrejme 4.
Ak vás napadlo, že Floor()
a Truncate()
robia to
isté, správajú sa inak u záporných čísel. Vtedy Floor()
zaokrúhli na čí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()
vracia síce 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
podľa znamienka -1
, 0
alebo 1
(pre
záporné číslo, nulu a kladné číslo).
Sin (), Cos (), Tan ()
Klasické goniometrické funkcie, ako parameter berú uhol typu double,
ktorý považujú v radiánoch, nie v stupňoch. Pre konverziu stupňov na
radiány stupňa vynásobíme * (Math.PI/180)
. Výstupom je opäť
double
.
ACOS (), Asin (), Atan ()
Opäť klasické cyklometrické funkcie (arkus funkcie), ktoré podľa
hodnoty goniometrické funkcie vráti daný uhol. Parametrom je hodnota v
double
, výstupom uhol v radiánoch (tiež double
).
Pokiaľ si prajeme mať uhol v stupňoch, vydelíme radiány
/ (180 / Math.PI)
.
Pow () a sqrt ()
Pow()
berie dva parametre typu double
, prvý je
základ mocniny a druhý exponent. Ak by sme teda chceli spočítať napr. 2
3, kód by bol nasledujúci:
{CSHARP_CONSOLE}
Console.WriteLine(Math.Pow(2, 3));
{/CSHARP_CONSOLE}
Sqrt()
je skratka zo Square root a vráti teda 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()
vracia potom 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.
Vieme, že platí: 3. odm. z 8 = 8 ^ (1/3). Môžeme teda 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 8 0 = 1.
Delenie
Programovacie jazyky sa často odlišujú tým, ako v nich funguje delení čísel. Túto problematiku je nutné dobre poznať, aby ste neboli potom (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šíte, že výsledok nebude vo všetkých prípadoch rovnaký. Trúfnete si tipnúť si čo kedy vyjde? Skúste 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 položky celého ( int
).
Výstup programu je potom nasledovné:
Konzolová aplikácia
2
2
2.5
2.5
2.5
Vidíme, že výsledok delenie je niekedy celočíselný a niekedy reálny. Pritom vôbec nezáleží na dátovom type premenné, do ktorej výsledok ukladáme, ale na dátovom type čísel, ktoré delíme. Ak je jedno z čísel desatinné, je výsledok vždy desatinné číslo. 2 celé čísla vráti vždy zas celé číslo. Dajte si na to pozor, napr. Keď budete počítať priemer, pre desatinný výsledok je nutné aspoň jednu premennú pretypovať na desatinné číslo.
int soucet = 10; int pocet = 4; double prumer = (double)soucet / pocet;
Napr. v jazyku PHP je výsledok delenie vždy desatinný. Až budete deliť v inom programovacom jazyku ako je C # .NET, zistite si ako delenie funguje ako ho použijete.
Zvyšok po delení
V našich aplikáciách môžeme často potrebovať zvyšok po delení (tzv. Modulo). U nášho príkladu 5/2 je celočíselný výsledok 2 a modulo 1 (zvyšok). Modulo sa často používa pre zistenie či je číslo párne (zvyšok po delení 2 je 0), keď chcete napr. Vyfarbiť šachovnicu, zistiť odchýlku vašej pozície od nejakej štvorcovej siete a podobne.
VC # .NET a všeobecne v céčkových jazykoch zapíšeme modulo ako
%
:
{CSHARP_CONSOLE}
Console.WriteLine(5 % 2); // Vypíše 1
{/CSHARP_CONSOLE}
Tak to by sme mali. V kurze Základná konštrukcia jazyka C # záujemcovia nájdu ešte niekoľko ďalších článkov a príkladov na precvičenie. Kurz teraz pokračuje v sekcii Základy objektovo orientovaného programovania v C # . Nabudúce si teda predstavíme objektový svet a pochopíme veľa vecí, ktoré nám až doteraz boli utajované Určite si skúste cvičenie, obsahuje nejaké veci s konzolou, čo sme si neukazovali a zaujímavé projekty.
V nasledujúcom cvičení, Riešené úlohy k 11.-12. lekciu C # .NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.
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é 1092x (22.28 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#