Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

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

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:

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

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ť:

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 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:

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ší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 % :

Console.WriteLine(5 % 2); // Vypíše 1

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#

 

Predchádzajúci článok
Cykly v C # .NET druhýkrát - do-while, break a continue
Všetky články v sekcii
Základné konštrukcie jazyka C # .NET
Preskočiť článok
(neodporúčame)
Riešené úlohy k 11.-12. lekciu C # .NET
Č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