IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

12. diel - Matematické funkcie v C ++

V minulej lekcii, Podmienky v C ++ druhýkrát - ternárne výraz a propadávací switch , sme sa venovali ďalšie syntax podmienok.

V minulej lekcii, Podmienky v C ++ druhýkrát - ternárne výraz a propadávací switch , sme sa naučili používať viacrozmerné polia. V dnešnom tutoriále kurze základov jazyka C ++ sa pozrieme na štandardné knižnicu cmath. Tá poskytuje veľké množstvo funkcií pre riešenie obvyklých matematických problémov, tie najdôležitejšie z nich si uvedieme.

Fmin (), fmax (), fdim ()

Začnime s tým jednoduchším :) Všetky funkcie prijímajú ako parameter dve čísla typu double. Funkcia fmin() vráti to menšie, funkcia fmax() to väčší z nich. Funkcia fdim() vráti xy, ak je x > y. V ostatných prípadoch vracia 0.

Round (), ceil (), floor () a TRUNC ()

Všetky funkcie sa týkajú zaokrúhľovania a prijímajú parametre typu double. Návratová hodnota pre všetky funkcie takisto typu double. Funkcia round() vracia zaokrúhlené číslo tak, ako to poznáme zo školy (od 0.5 nahor, inak dole). Funkcia ceil() zaokrúhli vždy hore a floor() vždy dolu. A funkcie trunc() nezaokrúhľujú, iba odtrhne desatinnú časť.

Funkciu round() budeme určite potrebovať často, ďalšie funkcie som často použil napríklad keď som zisťoval počet položiek na stránke (napr. Nejaké tabuľky v konzole). Ak máme 33 položiek a na stránke ich je vypísané 10, budú matematicky 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 trunc() robia to isté, správajú sa inak u záporných čísel. Vtedy floor() zaokrúhli na číslo viac do mínusu, trunc() 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)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 mali rovnaké rozhranie. Preto si už nebudeme u zvyšných funkcií typy uvádzať - vždy to bude double.

Abs () a signbit ()

Funkcia abs() vráti absolútnu hodnotu parametra a signbit() vráti 1, ak je číslo záporné, vo zvyšných prípadoch vracia 0. Funkcia signbit() nie je podporovaná vo všetkých kompilerech, preto je možné, že ju nemusíte mať dostupnú.

Sin (), cos (), tan ()

Klasické goniometrické funkcie prijímajú ako parameter uhol v radiánoch, nie v stupňoch. Pre konverziu stupňov na radiány stupňa vynásobíme hodnotou (M_PI / 180).

ACOS (), asin (), atan ()

Opäť klasické cyklometrické funkcie (arkus funkcie), ktoré podľa hodnoty goniometrické funkcie vráti daný uhol. Jedná sa o inverzné funkcie k sin(), cos() a tan(). Parametrom je hodnota uhla, výstupom uhol v radiánoch. Pokiaľ si prajeme mať uhol v stupňoch, vynásobíme radiány hodnotou (180 / M_PI).

Pow () a sqrt ()

Funkcia pow() prijíma dva parametre, prvý je základ mocniny a druhý exponent. Ak by sme teda chceli vypočítať napr. 2 3, kód by bol nasledujúci:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    double vysledek = pow(2, 3);
    cout << vysledek;
    return 0;
}

Sqrt je skratka zo square root a vracia druhú odmocninu z daného čísla.

Exp (), log (), log10 ()

Funkcia exp() vracia Eulerovo Číslo, umocnené na daný exponent. Funkcia log() vracia prirodzený logaritmus daného čísla. A funkcie log10() 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é knižnica poskytuje.

Vieme, že platí: 3. odm. z 8 = 8^(1/3). Môžeme teda napísať:

double vysledek = pow(8, (1.0/3.0));
cout << vysledek;

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 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;
cout << "a=" << a << " b=" << b << " c=" << c << " d=" << d << " e=" << e << " f=" << f << endl;

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úť, čo kedy vyjde? Skúste to :)

Konzolová aplikácia
a=2 b=2 c=2.5 d=2.5 e=2.5 f=2

Vidíme, že výsledok delenie je niekedy celočíselný a niekedy reálny. Pritom nezáleží iba 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. Dve celé čísla vždy vráti 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 / (double)pocet;

Pozn .: Napr. v jazyku PHP je výsledok delenie vždy desatinný. Až budete deliť v inom programovacom jazyku ako je C ++, zistite si, ako delenie funguje, než 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) alebo keď chcete zistiť odchýlku vašej pozície od nejakej štvorcovej siete.

V C ++ a všeobecne v céčkových jazykoch (tzv. C-like jazyky) zapíšeme modulo ako %:

cout << "Zvyšok po delení 5/2 je " << 5 % 2 << endl;

Tak to by sme mali. V budúcej lekcii, Riešené úlohy k 11.-12. lekciu C ++ , si uvedieme funkcie, ktoré sú veľmi dôležité - pomôžu nám rozdeliť program do viacerých logických celkov.

V nasledujúcom cvičení, Riešené úlohy k 11.-12. lekciu C ++, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Predchádzajúci článok
Podmienky v C ++ druhýkrát - ternárne výraz a propadávací switch
Všetky články v sekcii
Základné konštrukcie jazyka C ++
Preskočiť článok
(neodporúčame)
Riešené úlohy k 11.-12. lekciu C ++
Článok pre vás napísal Patrik Valkovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity