Table of Contents
Kvadratická rovnice
Naprogramujeme řešení kvadratické rovnice.
Vysvětlení include , using namespace a main naleznete v prvním příkladu.
#include <iostream> 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 <complex> using namespace std; complex < double > d = sqrt (D);
#include <iostream> #include <complex> 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 <double> D = b*b - 4*a*c; // trik: jiz D deklarujeme jako komplexni cislo complex <double> d = sqrt (D); complex <double> 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 <iostream> 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; }