====== Kvadratická rovnice ===== Naprogramujeme řešení kvadratické rovnice. \\ Vysvětlení //include// , //using namespace// a //main// naleznete v prvním příkladu. #include using namespace std; int main() { cout << "Zadejte koeficienty kvadraticke rovnice ax^2 + bx + c = 0" << endl; double a, b, c; cout << "Zadejte a : "; cin >> a; cout << "Zadejte b : "; cin >> b; cout << "Zadejte c : "; cin >> c; cout << endl; cout << "Kvadraticka rovnice " << a << " * x^2 + " << b << " * x + " << c << " = 0" << endl; double D = b * b - 4 * a * c; double d = sqrt (D); double x1, x2; x1 = (-b + d) / (2 * a); x2 = (-b - d) / 2 / a; cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << endl; // system ("pause"); } Jednoduché příkazy se zapisují pomocí __výrazu__ a __středníku__. \\ Výrazů postupně uvidíme mnoho druhů. \\ ==== Výstup ==== Již známe výraz pro výstup na obrazovku. cout << "Zadejte koeficienty kvadraticke rovnice ax^2 + bx + c = 0" << endl; Text, který se má vytisknout na obrazoovce zadáváme v __dvojitých uvozovkách__. \\ Uvnitř textu je zápis x^2 a násobení není nijak vyznačeno, není to výraz v jazyce C++, překladač obsah uvozovek nijak nezpracovává. Znak **<<** můžeme použít několikrát. \\ Později uvidíme, že **<<** označuje svého druhu aritmetickou operaci a to __bitový posuv doleva__. \\ Pro __výstupní proud__ (output stream) **cout** je bitový posuv doleva předefinován na odeslání hodnoty do proudu. Místo **cout** později budeme používat i textový soubor na disku. \\ **endl** způsobí přechod na nový řádek. ==== Deklarace proměnné ==== Vytvoříme tři proměnné **a**, **b** a **c** typu **double**. double a, b, c; Mezi identifikátory jsou čárky na konci je středník. Identifikátor je posloupnost písmen, číslic a znaků podtržení **_**. \\ Identifikátor musí začínát písmenem nebo podtržením. \\ Malá a velká písmena překladač rozlišuje, například **D** a **d** jsou různé identifikátory. Jako identifikátor nelze použít __klíčová slova__ jako **if**, **while**, ... \\ Překladač nedovolí v jednom místě použít stejný identifikátor dvakrát. (Jak je to v různých místech uvidíme později.) \\ Snažme se nepředefinovat standardní identifikátory jako např. cout, endl, sqrt. Zatím budeme používat typy: * **int** - celá čísla (přesneji podmnožina celých čísel, v dnešních překladačích asi od minus dvou miliard do přibližně plus dvou miliard) * **double** - reálná čísla (přesněji podmnožina racionálních čísel, v současných překladačích uložené jako 8 bytů) * **float** - reálná čísla s menší přesností (v současnosti 4 byty) * **bool** - logické hodnoty **true** a **false** * **char** - ascii znaky zapisované v __jednoduchých uvozovkách__, např. **'a'**, **'Z'**, **'1'** nebo mezera **' '**. V jazyce C musí být deklarace před jinými příkazy na začátku bloku tvořeného složenými závorkami **{ }**. \\ V C++ mohou být umístěny i dále v programu, vždy před použitím deklarovaného identifikátoru. \\ V C++ může následovat inicializace nové proměnné na nějakou počáteční hodnotu double D = b*b - 4*a*c; Pozor u více proměnných, deklarace double a, b, c = 0; uloží do **c** nulu, \\ **a** a **b** zůstanou nedefinována, jsou v nich hodnoty, které se zrovna v paměti nacházejí a při příštím spuštení programu tam mohou být jiné hodnoty ==== Vstup ==== cin >> a; **cin** představuje klávesnici, **>>** označuje vstup \\ Při načtení číselné proměnné program čeká až vložíte číslo a stisknente Enter. \\ Případné mezery a prázdné řádky jsou ignorovány. ==== Přiřazovací příkaz ==== Znak **=** označuje přiřazení hodnoty na pravé straně do proměnné na levé straně. x1 = (-b + d) / (2 * a); x2 = (-b - d) / 2 / a; Výraz na pravé straně může obsahovat jmána proměnných **a**, konstanty **2**. \\ Aritmetické operace násobení ***** a dělení **/** mají větší prioritu než **+** a **-**. \\ Při stejné prioritě se aritmetické operace provádějí zleva doprava. \\ Podívejte se na dělení, buď dělíme dvěma **a** nebo dělíme dvěma a potom to celé dělíme **a**. \\ Prioritu můžeme ovlivňovat kulatými závorkami **( )**. Pokud jsou oba operandy aritmetické operace celočíselného typu (**int**), provede se celočíselná operace a výsledkem je opět **int**. \\ V případě dělení je výsledkem celá část. \\ Pokud je dělitel i dělenec kladný, zaokrouhluje se směrem dolů. \\ Zbytek po dělení získáme pomocí znaku **%**. * 7/2 je 3 * 7%2 je 1 Pokud je alespoň jeden operand **double** je výsledek **double**. * 7.0/2 je 3.5 ==== Komentáře v programu ==== Od dvou lomítek **/****/** do konce řádky je komentář, který překladač nezpracovává. \\ Nebo můžeme komentáře psát mezi znaky ** /* ** a ** */ **. Občas si do komentáře "schováme" kousek programu, který se může hodit. // system ("pause"); ===== Komplexní čísla ===== Zde končí standardní příklad z cvičení, ale pokud se Vám příklad zdá nedokonalý, tak následují varianty, které zatím nebudou detailně vysvětleny. Jsou jen pro ilustraci. C++ dovoluje práci s komplexními čísly, uloženými jako dvě čísla typu double #include using namespace std; complex < double > d = sqrt (D); #include #include using namespace std; int main() { double a, b, c; const bool cti = false; if (cti) { cout << "Zadejte koeficienty kvadraticke rovnice ax^2 + bx + c = 0" << endl; cout << "Zadejte a : "; cin >> a; cout << "Zadejte b : "; cin >> b; cout << "Zadejte c : "; cin >> c; cout << endl; } else { a = 1; b = 0; c = 4; } cout << "Kvadraticka rovnice " << a << " * x^2 + " << b << " * x + " << c << " = 0" << endl; complex D = b*b - 4*a*c; // trik: jiz D deklarujeme jako komplexni cislo complex d = sqrt (D); complex x1, x2; x1 = (-b + d) / (2 * a); x2 = (-b - d) / 2.0 / a; cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << endl; // system ("pause"); } Abych nemusel neustále zadávat vstupní hodnoty, zavedu si logickou proměnnou (po dobu běhu našem programu konstantu) **cti** const bool cti = false; if (cti) { cin >> a; ... } else { a = 1; b = 0; c = 4; } ===== Bez komplexních čísel ===== #include using namespace std; int main() { double a, b, c; const bool cti = false; if (cti) { cout << "Zadejte koeficienty kvadraticke rovnice ax^2 + bx + c = 0" << endl; cout << "Zadejte a : "; cin >> a; cout << "Zadejte b : "; cin >> b; cout << "Zadejte c : "; cin >> c; cout << endl; } else { a = 1; b = 0; c = 4; } cout << "Kvadraticka rovnice " << a << " * x^2 + " << b << " * x + " << c << " = 0" << endl; double D = b*b - 4*a*c; double x1re, x1im; double x2re, x2im; if (D >= 0) { double d = sqrt (D); x1re = (-b + d) / (2 * a); x2re = (-b - d) / (2 * a); x1im = 0; x2im = 0; } else { x1re = -b / (2 * a); x2re = x1re; double d = sqrt (-D); x1im = d / (2 * a); x2im = -x1im; } cout << "x1 = " << x1re << " + " << x1im << "i" << endl; cout << "x2 = " << x2re << " + " << x2im << "i" << endl; // system ("pause"); } ===== Nulový koeficient a ===== Bylo vhodné otestovat, zda **a** není nulové. Také nenulové **a**, ale v absolutní hodnotě velmi malé, může způsobit při dělení přeteční. Můžete zkusit a = 1e-300; b = 1e300; c = 4; Typ **double** má formální hodnotu **inf** (infinity) označující přetečení \\ a **nan** (not a number) - výsledek nedovolené operace např. dělení nulou if (isnan (x1re) || isinf (x1re)) { cout << "Neco se nepovedlo, neni a nulove nebo prilis male v absoutni hodnote ?" << endl; } else { cout << "x1 = " << x1re << " + " << x1im << "i" << endl; cout << "x2 = " << x2re << " + " << x2im << "i" << endl; }