====== 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;
}