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;
    }
 
zpro/second.txt · Last modified: 2021/09/10 15:23 by 88.103.111.44
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki