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ů.
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.
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:
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
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.
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 %.
Pokud je alespoň jeden operand double je výsledek double.
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");
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; }
#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"); }
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; }