Kvadratická rovnice

Sitio: Moodle ZČU
Curso: KPV/TI Technická informatika ve strojírenství - šablona
Libro: Kvadratická rovnice
Imprimido por: Nepřihlášený host
Día: lunes, 9 de noviembre de 2026, 00:03

Descripción


1. KvadratickaRovnice

Vytvořte aplikaci pro výpočet kořenů kvadratické rovnice. Koeficienty v rovnici jsou zadány uživatelem v konzolové aplikaci. 

    a \cdot x ^2+b \cdot x+c=0

Pro  a=0 se jedná o lineární rovnici.


Účel příkladu

  • Podmínka 
  • Výpočet s použitím podprogramu – metoda bez návratu (procedura)
  • Konverze textu na reálného číslo 
  • Konverze reálného čísla na text 
  • Výpis textu do konzole

Typ aplikace
  • Konzolová aplikace
Popis úkolu 

  • Výpočet kořenů kvadratické rovnice 

Funkčnosti

    • Po zadání koeficientů členů kvadratické rovnice se provede porovnání koeficientu kvadratického členu na rovnost nule. Pokud bude tento koeficient je roven nule je proveden výpočet lineární rovnice
    • Pokud není koeficient kvadratického členu roven nule, je vypočten diskriminant s následným výpočtem kořenů kvadratické rovnice na základě koeficientů pomocí tří podprogramů (procedur), ve kterých budou vypsány vypočtených hodnoty kořenů:
      • RealneKoreny (procedura pro výpočet reálných kořenů) pro  D > 0
      • KomplexniKoreny (procedura pro výpočet komplexních kořenů) pro  D < 0
      • DvojityKoren (procedura pro výpočet dvojitého kořenu kvadratické rovnice)   D = 0
    • Pokud je některý z koeficientů zadán špatně (nelze konvertovat na reálné číslo), je vypsána chybová hláška

      Výstup programu

      Ukázka výpisu reálných kořenů kvadratické rovnice v hlavní statické metodě programu KvadratickaRovnice

      Výstup programu: Ukázka výpisu reálných kořenů kvadratické rovnice programu KvadratickaRovnice

      1.1. Analýza a návrh řešení

      Obecný předpis kvadratické rovnice je: 

        a \cdot x ^2+b \cdot x+c=0

      Uživatel bude v průběhu programu zadávat jednotlivé koeficienty v kvadratické rovnici - viz Obrázek 1:

      • Koeficient  a , který představuje koeficient v kvadratickém členu
      • Koeficient  b , který představuje koeficient v lineárním členu
      • Konstanta  c , která představuje absolutní člen

      Ve vývojovém diagramu nejsou zaznamenány výjimky, které mohou být vyvolány chybnou konverzí zadaného textu na reálné číslo, představující jednotlivé koeficienty kvadratické rovnice. Konverzi na reálné číslo lze také ve Flowgorithm provést pomocí příkazu (zavolání funkce) ToReal (standardně však konverzi do příslušného datového typu provádí Flowgorithm sám). Tato funkce přijímá textový řetězec. Pokud nastane chyba při konverzi, aplikace sama vyvolá výjimku, ve které bude uživatele informovat o nastalém problému. 

      Pokud uživatel zadal  a=0 , pak se jedná o lineární rovnici:

        b \cdot x+c=0

      Bude tedy volán podprogram (procedura) LinearniRovnice, kterému budou předány parametry b a c. Pokud je  a \neq 0  , potom musí být vypočten diskriminant:

        d= b^2-4 \cdot a \cdot c  

      Na základě hodnoty diskriminantu se bude rozhodovat, který podprogram bude volán. Při splnění podmínky  D  0 jsou volány následující podprogramy:

      • Pokud  D > 0   je volána procedura pro výpočet reálných kořenů  RealneKoreny  
      • Pokud  D < 0   je volána procedura pro výpočet komplexních kořenů KomplexniKoreny

      V případu kdy  D = 0 je volána procedura pro výpočet dvojitého kořenu kvadratické rovnice DvojityKoren 

      Pokud uživatel zadá  a=0 , pak se jedná o lineární rovnici.  V tomto případě bude volán podprogram LinearniRovnice.

      Hlavní program KvadratickaRovnice pro výpočet kořenů kvadratické, nebo lineární rovnice

      Obrázek 1: Hlavní program KvadratickaRovnice pro výpočet kořenů kvadratické, nebo lineární rovnice

      Pokud koeficient kvadratického členu je roven nule  a = 0 , potom je volán podprogram (procedura) LinearniRovnice, který vypočítá kořeny na základě předaných parametrů. Formální parametry jsme pro přehlednost pojmenovali stejnými identifikátory, jakými jsou pojmenovány skutečné parametry v hlavním programu. Máme tedy tři možnosti při výpočtu kořenů lineární rovnice:

      • Pro  b  0 je řešením  x=-\frac{c}{b}
      • Pro  b = 0 a  c = 0 je řešením každé  x
      • Pro  b = 0   a  c  0 není řešením žádné  x

      Na základě předchozích výpočtů vidíme, že výpočet kořenu závisí na hodnotách obou parametrů, tj. zda jsou rovny nule. Použitím dvou bloků rozhodování můžeme sestavit vývojový diagram podprogramu LinearniRovnice - viz Obrázek 2. 

      Podprogram LinearniRovnice - výpočet kořenů lineární rovnice

      Obrázek 2: Podprogram LinearniRovnice - výpočet kořenů lineární rovnice

      Pokud platí, že  a  0 je vypočten diskriminant. Pokud diskriminant není roven nule a zároveň je větší než 0, je proveden výpočet reálných kořenů kvadratické rovnice na základě vzorce:

        x_1,_2 = \frac{-b \pm \sqrt{b^2 - 4 \cdot a \cdot c} }{2 \cdot a}

      Ve vzorci pod odmocninou je použit výpočet diskriminantu, ale poněvadž jsme si již diskriminant vypočítali v hlavním programu, je jednodušší diskriminant předat podprogramu, který jeho hodnotu ve svém výpočtu využije - viz Obrázek 3. 

      Podprogram RealneKoreny - výpočet reálných kořenů kvadratické rovnice

      Obrázek 3: Podprogram RealneKoreny - výpočet reálných kořenů kvadratické rovnice

      Pro případ, že je  D < 0 ,  je volána procedura pro výpočet komplexních kořenů KomplexniKoreny, které jsou předány stejné parametry jako v případě předchozí procedury RealneKoreny.  Komplexně sdružené kořeny se skládají z reálné a imaginární části:

        x_1,_2 = \frac{-b \pm i \sqrt[]{-D} }{2 \cdot a }

      Následující vývojový diagram popisuje podstatu výpočtu a zobrazení jednotlivých kořenů - viz Obrázek 4.

      Podprogram KomplexniKoreny - výpočet komplexně sdružených kořenů kvadratické rovnice

      Obrázek 4: Podprogram KomplexniKoreny - výpočet komplexně sdružených kořenů kvadratické rovnice

      Poslední volanou procedurou je podprogram DvojityKoren a to za podmínky, že  D = 0 . V tomto podprogramu je vypočten a vypsán dvojitý reálný kořen kvadratické rovnice:

       x = \frac{-b}{2 \cdot a }

      Následující vývojový diagram zachycuje podstatu řešení - viz Obrázek 5.

      Podprogram DvojityKoren - výpočet dvojitého kořene kvadratické rovnice

      Obrázek 5: Podprogram DvojityKoren - výpočet dvojitého kořene kvadratické rovnice

      1.2. C# kód

      Následující zdrojový kód hlavní statické metody v C# pro konzolovou aplikaci je transformací algoritmu KvadratickaRovnice - viz Kód 1.  V těle hlavní metody jsou deklarovány parametry ve formě reálných čísel (typ double - nemusíme uvádět literál), představující koeficient kvadratického, lineárního a absolutního členu a také diskriminantu. Po výzvě k zadání prvního koeficientu kvadratického členu a načtení číslic je proveden test konverze na reálné číslo. Pokud tento test je neúspěšný (návrat metody TryParse ve formě logické hodnoty je false), je proveden výpis o chybě. Metoda TryParse je však deklarována jako metoda s výstupním parametrem, tím je zajištěno, že i v případě neúspěchu při provádění konverze, bude výstupní parametr inicializován počáteční hodnotou, která pro typ double je 0.0d. Stejně je postupováno i o ostatních parametrů - lineárního a absolutního členu. Pokud je koeficient kvadratického členu roven 0, je volána metoda bez návratu s názvem LinearniRovnice se skutečnými parametry b a c. Pokud a není rovno nule, jedná se o výpočty kořenů kvadratické rovnice. U výpočtu diskriminantu d je použito umocnění na druhou pomocí metody Pow třídy Math. Tato metoda přijímá dva reálné parametry - první je reálné číslo, které má být umocněno (základ mocniny - mocněnec), a druhý reálný parametr vyjadřuje exponent (mocnitel). Pokud není diskriminant roven 0, je dále testován na hodnotu větší než 0. Pokud je d > 0, je volána metoda RealneKoreny pro výpočet reálných kořenů. Tato metoda přijímá hodnoty uložené v parametrech a, b a d. Pokud je diskriminant menší než nula, je volána metoda bez návratu s názvem KomplexniKoreny. Tato metoda přijímá taktéž parametry a, b a d. V případě, že je diskriminant nulový, je volána metoda DvojityKoren pro výpočet dvojitého kořenu kvadratické rovnice. Této metodě k výpočtu dvojitého kořene stačí pouze parametry a a b.

      static void Main(string[] args)
      {
          /* Deklarace: 'a' ... koeficient v kvadratickém členu;  'b' ... koeficient 
           * v lineárním členu; 'c' ... absolutní člen; * 'd' ... diskriminant */
          double a, b, c, d;
       
          // Informace o výpočtu kvadratické rovnice
          Console.WriteLine("Výpočet kořenů kvadratické rovnice ax^2 + bx + c = 0:");
       
          // Výzva pro zadání koeficientu v kvadratickém členu
          Console.Write("Zadejte a :");
          // Pokud nedojde ke konverzi textu na číslo
          if (!double.TryParse(Console.ReadLine(), out a))
              // Vypsání chybové hlášky v konzole
              Console.WriteLine("Špatně zadaná hodnota A, program počítá s 0");
       
          // Výzva pro zadání koeficientu v lineárním členu
          Console.Write("Zadejte b :");
          // Pokud nedojde ke konverzi textu na číslo
          if (!double.TryParse(Console.ReadLine(), out b))
              // Vypsání chybové hlášky v konzole
              Console.WriteLine("Špatně zadaná hodnota B, program počítá s 0");
       
          // Výzva pro zadání absolutního členu
          Console.Write("Zadejte c :");      
          // Pokud nedojde ke konverzi textu na číslo
          if (!double.TryParse(Console.ReadLine(), out c))
              // Vypsání chybové hlášky v konzole
              Console.WriteLine("Špatně zadaná hodnota C, program počítá s 0");
       
          // Pokud koeficient kvadratického členu je roven nule potom...
          if (a == 0)
              // Volání metody pro výpočet lineárni rovnice
              LinearniRovnice(b, c);
          // Jinak...                            
          else
          {
              // Výpočet diskriminantu
              d = Math.Pow(b, 2) - 4 * a * c;
              // Pokud diskriminant není roven nule, potom...
              if (d != 0)
                  // Pokud diskriminant je větší než nula, potom...
                  if (d > 0)
                      // Volání metody pro výpočet reálných kořenů kvadr. rovnice - předání parametrů
                      RealneKoreny(a, b, d);
                  // Jinak...
                  else
                      // Voláni metody pro výpočet komplexně sdružených kořenů kvadr. rovnice
                      KomplexniKoreny(a, b, d);
              // Jinak...
              else
                  // Zavoláni metody pro výpočet dvojitého kořenu
                  DvojityKoren(a, b);
          }
       
          // Čekání na stisk klávesy -> ukončení programu
          Console.ReadKey();
      }

      Kód 1: Program KvadratickaRovnice - deklarace hlavní statické metody Main 

      Metoda bez návratu LinearniRovnice využívá formálních parametrů b (koeficient v lineárním členu) a c (absolutní člen) pojmenovaných stejně, jako názvy skutečných parametrů předávaných z hlavní statické metody - viz Kód 2. Tyto parametry jsou předány hodnotou - fungují tedy jako vstupní parametry. V těle metody jsou dvě podmínky na nulovost obou parametrů b a c, na kterých je závislý způsob výpočtu kořene.

      //--- Specifikace metody bez návratu pro výpočet lineární rovnice 'bx + c = 0'
      /* Vstupní parametry (předány hodnotou): 'b' ... koeficient v lineárním
       * členu; 'c' ... absolutní člen */ 
      static void LinearniRovnice(double b, double c)
      {
          // Pokud první parametr je roven nule potom...
          if (b == 0)
              // Pokud druhý parametr je roven 0 potom...
              if (c == 0)
                  // Nekonečně mnoho řešení - vypsání textu v konzole
                  Console.WriteLine("Nekonečně mnoho řešení - každé x");
              // Jinak... 
              else
                  // Žádné řešení - vypsání textu v konzole
                  Console.WriteLine("Žádné řešení - žádné x");
          // Jinak...                                                                                                   
          else
              // Vypočtení hodnoty kořenu - vypsání textu v konzole
              Console.WriteLine("Lineární rovnice - kořen je: x = " + (-c / b));   
      }

      Kód 2: Deklarace statické metody bez návratu s názvem LinearniRovnice

      Další deklarovanou metodou bez návratu je metoda RealneKoreny určená pro výpočet reálných kořenů kvadratické rovnice. V metodě jsou deklarovány dvě lokální proměnné do nichž se uloží vypočtené hodnoty kořenů. Ve výpočtu je využit příkaz Sqrt (Square Root) pro výpočet druhé odmocniny diskriminantu, implementovaná ve třídě Math.  Tyto vypočtené hodnoty kořenů jsou následně využity ve výpisu. Ve výpisu je použito řádkování pomocí řídící posloupnosti \n - viz Kód 3. 

      //--- Specifikace metody bez návratu pro výpočet reálných kořenů kvadr. rovnice
      /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
       * 'b' ... koeficient v lineárním členu; 'd' ... diskriminant */
       
      static void RealneKoreny(double a, double b, double d)
      {
          /* Deklarace: 'x1' ... první reálný kořen kvadr. rovnice; 
           * 'x2' ... druhý reálný kořen kvadr. rovnice */
          double x1, x2;
          // Výpočet prvního kořenu
          x1 = (-b + Math.Sqrt(d)) / (2 * a);
          // Výpočet druhého kořenu
          x2 = (-b - Math.Sqrt(d)) / (2 * a);
          // Vypočtení hodnot kořenů - vypsání textu v konzole ('\n' - zařádkování)
          Console.WriteLine("Kořeny jsou:\n  x1 = " + x1.ToString() +
              "\n  x2 = " + x2.ToString()); 
      }

      Kód 3: Deklarace statické metody bez návratu s názvem RealneKoreny

      Další deklarovanou metodou bez návratu je metoda KomplexniKoreny. Metoda využívá dvě lokální reálné proměnné re představující reálnou složka kořenu kvadratické rovnice a im, která představuje imaginární složku kořenu kvadratické rovnice. Tyto složku jsou připojeny do výpisu hodnot kořenů - viz Kód 4.

      //--- Specifikace metody bez návratu pro výpočet komplexně sdružených kořenů kvadr. rovnice
      /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
       * 'b' ... koeficient v lineárním členu; 'd' ... diskriminant */
      static void KomplexniKoreny(double a, double b, double d)
      {
          /* Deklarace: 're' ... reálná složka kořenu kvadr. rovnice; 
           * 'im' ... imaginární složka kořenu kvadr. rovnice */
          double re, im;
          // Výpočet reálné složky kořenu kvadr. rovnice
          re = -b / (2 * a);
          // Výpočet imaginární složky kořenu kvadr. rovnice
          im = Math.Sqrt(Math.Abs(d)) / (2 * a);
          // Výpis hodnot komplexních kořenů - vypsání textu v konzole ('\n' - zařádkování)
          Console.WriteLine("Kořeny jsou komplexní: \n  x1 = " + re.ToString() + " + " + 
              im.ToString() + "i\n  x2 = " + re.ToString() + " - " + im.ToString() + "i");
      }

      Kód 4: Deklarace statické metody bez návratu s názvem KomplexniKoreny

      Poslední metodou bez návratu je metoda DvojityKoren. Tato metoda přijímá pouze dva parametry a a b, ze kterých je vypočten dvojitý reálný kořen - viz Kód 5. 

      //--- Specifikace metody bez návratu pro výpočet dvojitého reálné kořenu kvadr. rovnice
      /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
       * 'b' ... koeficient v lineárním členu */
      static void DvojityKoren(double a, double b)
      {
          /* Deklarace: 'x' ... dvojitý reálný kořen kvadr. rovnice */
          double x;
          // Výpočet dvojitého reálného kořenu
          x = -b / (2 * a);
          // Vypočtení hodnoty dvojitého reálného kořenu - vypsání textu v konzole
          Console.WriteLine("Dvojitý reálný kořen je:\n  x = " + x.ToString());
      }

      Kód 5: Deklarace statické metody bez návratu s názvem DvojityKoren

      1.3. Výsledný kód

      Následující zdrojový kód je kompletací předešlých kódů programu KvadratickaRovnice, který je umístěn v souboru Program.cs - viz Kód 1.

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
       
      namespace KvadratickaRovnice
      {
          class Program
          {
              static void Main(string[] args)
              {
                  /* Deklarace: 'a' ... koeficient v kvadratickém členu;  'b' ... koeficient 
                   * v lineárním členu; 'c' ... absolutní člen; * 'd' ... diskriminant */
                  double a, b, c, d;
       
                  // Informace o výpočtu kvadratické rovnice
                  Console.WriteLine("Výpočet kořenů kvadratické rovnice ax^2 + bx + c = 0:");
       
                  // Výzva pro zadání koeficientu v kvadratickém členu
                  Console.Write("Zadejte a :");
                  // Pokud nedojde ke konverzi textu na číslo
                  if (!double.TryParse(Console.ReadLine(), out a))
                      // Vypsání chybové hlášky v konzole
                      Console.WriteLine("Špatně zadaná hodnota A, program počítá s 0");
       
                  // Výzva pro zadání koeficientu v lineárním členu
                  Console.Write("Zadejte b :");
                  // Pokud nedojde ke konverzi textu na číslo
                  if (!double.TryParse(Console.ReadLine(), out b))
                      // Vypsání chybové hlášky v konzole
                      Console.WriteLine("Špatně zadaná hodnota B, program počítá s 0");
       
                  // Výzva pro zadání absolutního členu
                  Console.Write("Zadejte c :");
                  // Pokud nedojde ke konverzi textu na číslo
                  if (!double.TryParse(Console.ReadLine(), out c))
                      // Vypsání chybové hlášky v konzole
                      Console.WriteLine("Špatně zadaná hodnota C, program počítá s 0");
       
                  // Pokud koeficient kvadratického členu je roven nule potom...
                  if (a == 0)
                      // Volání metody pro výpočet lineárni rovnice
                      LinearniRovnice(b, c);
                  // Jinak...                            
                  else
                  {
                      // Výpočet diskriminantu
                      d = Math.Pow(b, 2) - 4 * a * c;
                      // Pokud diskriminant není roven nule, potom...
                      if (d != 0)
                          // Pokud diskriminant je větší než nula, potom...
                          if (d > 0)
                              // Volání metody pro výpočet reálných kořenů kvadr. rovnice - předání parametrů
                              RealneKoreny(a, b, d);
                          // Jinak...
                          else
                              // Voláni metody pro výpočet komplexně sdružených kořenů kvadr. rovnice
                              KomplexniKoreny(a, b, d);
                      // Jinak...
                      else
                          // Zavoláni metody pro výpočet dvojitého kořenu
                          DvojityKoren(a, b);
                  }
       
                  // Čekání na stisk klávesy -> ukončení programu
                  Console.ReadKey();
              }
       
              //--- Specifikace metody bez návratu pro výpočet lineární rovnice 'bx + c = 0'
              /* Vstupní parametry (předány hodnotou): 'b' ... koeficient v lineárním
               * členu; 'c' ... absolutní člen */
              static void LinearniRovnice(double b, double c)
              {
                  // Pokud první parametr je roven nule potom...
                  if (b == 0)
                      // Pokud druhý parametr je roven 0 potom...
                      if (c == 0)
                          // Nekonečně mnoho řešení - vypsání textu v konzole
                          Console.WriteLine("Nekonečně mnoho řešení - každé x");
                      // Jinak... 
                      else
                          // Žádné řešení - vypsání textu v konzole
                          Console.WriteLine("Žádné řešení - žádné x");
                  // Jinak...                                                                                                   
                  else
                      // Vypočtení hodnoty kořenu - vypsání textu v konzole
                      Console.WriteLine("Lineární rovnice - kořen je: x = " + (-c / b));   
              }
       
              //--- Specifikace metody bez návratu pro výpočet reálných kořenů kvadr. rovnice
              /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
               * 'b' ... koeficient v lineárním členu; 'd' ... diskriminant */
       
              static void RealneKoreny(double a, double b, double d)
              {
                  /* Deklarace: 'x1' ... první reálný kořen kvadr. rovnice; 
                   * 'x2' ... druhý reálný kořen kvadr. rovnice */
                  double x1, x2;
                  // Výpočet prvního kořenu
                  x1 = (-b + Math.Sqrt(d)) / (2 * a);
                  // Výpočet druhého kořenu
                  x2 = (-b - Math.Sqrt(d)) / (2 * a);
                  // Vypočtení hodnot kořenů - vypsání textu v konzole ('\n' - zařádkování)
                  Console.WriteLine("Kořeny jsou:\n  x1 = " + x1.ToString() +
                      "\n  x2 = " + x2.ToString()); 
              }
       
              //--- Specifikace metody bez návratu pro výpočet komplexně sdružených kořenů kvadr. rovnice
              /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
               * 'b' ... koeficient v lineárním členu; 'd' ... diskriminant */
              static void KomplexniKoreny(double a, double b, double d)
              {
                  /* Deklarace: 're' ... reálná složka kořenu kvadr. rovnice; 
                   * 'im' ... imaginární složka kořenu kvadr. rovnice */
                  double re, im;
                  // Výpočet reálné složky kořenu kvadr. rovnice
                  re = -b / (2 * a);
                  // Výpočet imaginární složky kořenu kvadr. rovnice
                  im = Math.Sqrt(Math.Abs(d)) / (2 * a);
                  // Výpis hodnot komplextních kořenů - vypsání textu v konzole ('\n' - zařádkování)
                  Console.WriteLine("Kořeny jsou komplexní: \n  x1 = " + re.ToString() + " + " + 
                      im.ToString() + "i\n  x2 = " + re.ToString() + " - " + im.ToString() + "i");
              }
       
              //--- Specifikace metody bez návratu pro výpočet dvojitého reálné kořenu kvadr. rovnice
              /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
               * 'b' ... koeficient v lineárním členu */
              static void DvojityKoren(double a, double b)
              {
                  /* Deklarace: 'x' ... dvojitý reálný kořen kvadr. rovnice */
                  double x;
                  // Výpočet dvojitého reálného kořenu
                  x = -b / (2 * a);
                  // Vypočtení hodnoty dvojitého reálného kořenu - vypsání textu v konzole
                  Console.WriteLine("Dvojitý reálný kořen je:\n  x = " + x.ToString());
              }
          }
      }
      

      Kód 1: Program KvadratickaRovnice - deklarace hlavní statické metody Main včetně deklarací dalších metod

      Výstup programu

      Na následujícím výstupu programu vidíme, že uživatel zadal hodnotu koeficientu v kvadratickém členu rovnu 0. Díky tomu byla zavolána metoda LinearniRovnice a uvnitř metody byla vypsána hodnota vypočteného kořene lineární rovnice - viz Výstup programu 1 - Kód 1.   

      Ukázka výpisu hodnoty kořene pomocí metody LinearniRovnice v programu KvadratickaRovnice

      Výstup programu 1 - Kód 1: Ukázka výpisu hodnoty kořene pomocí metody LinearniRovnice v programu KvadratickaRovnice

      V dalším printscreenu konzolové aplikace vidíme, že uživatel zadal hodnoty takovým způsobem, že diskriminant vyšel větší než nula. Znamená to tedy, že pro výpočet kořenů kvadratické rovnice bude zavolána metoda RealneKoreny - viz Výstup programu 2 - Kód 1.   

      Ukázka výpisu hodnoty kořene pomocí metody RealneKoreny v programu KvadratickaRovnice

      Výstup programu 2 - Kód 1: Ukázka výpisu hodnoty kořene pomocí metody RealneKoreny v programu KvadratickaRovnice

      Pokud byl vypočten ze zadaných hodnot záporný diskriminant, je volána metoda pro výpočet komplexních kořenů (metoda KomplexniKoreny) - viz Výstup programu 3 - Kód 1. 

      Ukázka výpisu hodnoty kořene pomocí metody KomplexniKoreny v programu KvadratickaRovnice

      Výstup programu 3 - Kód 1: Ukázka výpisu hodnoty kořene pomocí metody KomplexniKoreny v programu KvadratickaRovnice

      Posledním testovaným případem je výpočet dvojitého kořenu kvadratické rovnice pomocí metody DvojityKoren, kdy diskriminant byl vypočten ze zadaných hodnot jako nulový - viz Výstup programu 4 - Kód 1.   

      Ukázka výpisu hodnoty kořene pomocí metody DvojityKoren v programu KvadratickaRovnice

      Výstup programu 4 - Kód 1: Ukázka výpisu hodnoty kořene pomocí metody DvojityKoren v programu KvadratickaRovnice

      2. KvadratickaRovniceWPF

      Vytvořte aplikaci pro výpočet kořenů kvadratické rovnice. Koeficienty v rovnici jsou zadány uživatelem v konzolové aplikaci. 

         a \cdot x ^2+b \cdot x+c=0

      Pro  a=0 se jedná o lineární rovnici.


      Účel příkladu

      • Podmínka 
      • Výpočet s použitím podprogramu – metoda s návratem (funkce), metoda bez návratu (procedura)
      • Konverze textu na reálného číslo 
      • Konverze reálného čísla na text 
      • Výpis textu do pole na formuláři 
      • Zavření formuláře 
      • Vlastnosti objektu 
      • Metody objektu 

      Typ aplikace
      • WPF aplikace
      Popis úkolu 

      • Výpočet kořenů kvadratické rovnice 

      Funkčnosti

        • Při stisku tlačítka Vypočti se provede výpočet kořenů kvadratické rovnice na základě koeficientů specifikovaných na formuláři pomocí zavolané metody bez návratu. Pokud je některý z koeficientů zadán špatně (nelze konvertovat na reálné číslo), vypíše se v dialogovém okně výzva k zadání koeficientu a metoda přiřazená k tlačítku se opustí. Pokud je diskriminant větší nebo roven nule pak je zavolána metoda pro výpočet reálných kořenů kvadratické rovnice. V opačném případě je zavolána metoda pro výpočet komplexně sdružených kořenů kvadratické rovnice. Pokud uživatel zadá první kořen rovnice roven nule, spočtou se kořeny lineární rovnice 
        • Při stisku tlačítka Konec se provede zavření formuláře 

          Výstup programu


          Výstup programu 1: Ukázka GUI při počátečním spuštění programu KvadratickaRovniceWPF


          Výstup programu 2: Ukázka výpisu hodnot reálných kořenů kvadratické rovnice v programu KvadratickaRovniceWPF

          2.1. Analýza a návrh řešení

          V příkladu bude využit stejný princip výpočtu kořenů jako v případě příkladu KvadratickaRovnice, proto již není zapotřebí provádět detailní analýzu. 

          Formulář bude obsahovat následující prvky - viz Obrázek 1.


          Obrázek 1: Návrh GUI pro aplikaci KvadratickaRovniceWPF

          Pro rozložení jednotlivých prvků použijeme Grid, který rozdělíme na 4 řádky. Do prvního řádku Grid  (s indexem 0) umístíme objekt typu WrapPanel do něhož budeme vkládat 3 objekty typu TextBlock, ze kterých sestavíme předpis kvadratické rovnice. O řádek níže umístíme další WrapPanel, do kterého budeme vkládat jednotlivé objekty typu TextBox. Tyto objekty využijeme pro zadání koeficientů kvadratické rovnice. Za tyto objekty umístíme objekty typu TextBlock, aby uživatel věděl, který koeficient právě vyplňuje. Do třetího řádku řádku Grid umístíme StackPanel, do něhož vložíme objekt typu Label s popiskem "Výsledek". Pod tento objekt umístíme další objekt typu TextBox do něhož budeme vypisovat výsledný kořen, či kořeny. Do spodní části umístíme další StackPanel, do něhož umístíme dva prvky typu WrapPanel. Do prvního WrapPanel umístíme tlačítko pro výpočet kořenů zadané rovnice. Do druhého WrapPanel umístíme tlačítko pro ukončení aplikace.


          Obrázek 2: Návrh GUI - rozložení prvků v mřížce formuláře

          2.2. XAML

          Popis v této kapitole bude stručný, vzhledem k tomu, že jsme již několikrát použili stejné prvky. Po nastavení minimální šířky (MinWidth) a výšky (MinHeight) okna (Window), na kterou lze okno zmenšit, rozdělíme formulář na čtyři řádky, jejichž výšky jsou nastaveny následujícím způsobem - viz Kód 1. První, druhý a čtvrtý řádek se bude přizpůsobovat obsahu vložených prvků. Třetí řádek se bude přizpůsobovat roztažení okna.

          <Grid.RowDefinitions>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="Auto"/>
               <RowDefinition Height="*"/>
               <RowDefinition Height="Auto"/>
          </Grid.RowDefinitions>

          Kód 1: Rozdělení Grid na řádky

          Druhý řádek bude obsahovat předpis kvadratické rovnice. Ten bude zapsán pomocí 3 objektů typu TextBlock vložených do WrapPanel (aby byly vypsány za sebou). Horní index specifikujeme pomocí nastavení obtékání objektu (Margin) nahoře (druhé číslo) pomocí záporné hodnoty. Nastavíme také menší velikost písma - viz Kód 2.

          <WrapPanel Margin="5,20,5,5" HorizontalAlignment="Center">
              <TextBlock Text="A * x" FontSize="16"/>
              <TextBlock Margin="0,-3,0,0" FontSize="12">2</TextBlock>
              <TextBlock Text=" + B * x + C = 0" FontSize="16"/>
          </WrapPanel>

          Kód 2: Předpis kvadratické rovnice (horní index)

          Do dalšího řádku, který se nachází ve druhém řádku Grid (index řádku je tedy roven 1), umístíme další WrapPanel. Tento panel bude obsahovat objekty typu TextBox, které jsou určeny pro vložení hodnoty jednotlivých koeficientů členů rovnice. Za každý objekt typu TextBox umístíme objekt typu TextBlock pro vizuální určení členu jehož hodnotu koeficientu budeme specifikovat ve zmiňovaném TextBox. Všimněte si, že pro horní index jsme využili prvek Span, jehož vlastnost pro umístění ve vertikální ose vkládaných textových objektů (BaselineAlignment) nastavíme na horní hranici tohoto prvku Span. V kombinaci s malým písmem pak tento prvek vypadá jako horní index.

          <WrapPanel Grid.Row="1" Margin="10,5" HorizontalAlignment="Center">
              <TextBox Name="TxtA" Margin="0,6" TextWrapping="Wrap" Text="0" Width="30"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
              <TextBlock Text="x" Margin="3,6,0,3" />
              <TextBlock Margin="0,3,0,0">
                  <Span BaselineAlignment="Top" FontSize="8">2</Span>
              </TextBlock>
              <TextBlock Text=" + " Margin="3,6,0,3"/>
           
              <TextBox Name="TxtB" Margin="0,6" TextWrapping="Wrap" Text="0" Width="30"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
              <TextBlock Text="x + " Margin="3,6,0,3"/>
           
              <TextBox Name="TxtC" Margin="0,6" TextWrapping="Wrap" Text="0" Width="30"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
              <TextBlock Text="= 0" Margin="3,6,0,3"/>
          </WrapPanel>

          Kód 3: Prvky typu TextBox (pro vložení hodnoty koeficientů) TextBlock (pro vizuální kontrolu) umístěné v objektu WrapPanel

          Pro výpis kořene použijeme objekt typu TextBox určeného pouze pro čtení (vlastnost IsReadOnly, tzn. nelze do něj vkládat hodnoty), nad který umístíme popisek - objekt typu Label. Do podbarveného objektu typu TextBox umístíme "?" (vlastnost Text), aby při počátečním spuštění bylo zřejmé, že uživatel musí vyplnit hodnoty koeficientů - viz Kód 4. 

          <StackPanel Grid.Row="2">
              <Label Content="Výsledek:" FontSize="16"/>
              <TextBox Name="TxtVysledek" IsReadOnly="True" Background="AliceBlue" Text="?" TextWrapping="Wrap" Padding="5" Margin="20,0,5,0"/>
          </StackPanel>

          Kód 4: Řádek s výsledkem obsahující popisek (Label) a hodnotu vypočteného kořene (TextBox) vložených do StackPanel

          Poslední řádek Grid bude obsahovat StackPanel, který využijeme pro vložení dalších dvou objektů typu WrapPanel pro zarovnání vložených tlačítek do těchto objektů v horizontální ose. První WrapPanel umístíme na střed a druhý zarovnáme doprava - viz Kód 5. Pro tlačítka vygenerujeme obsluhu události stisknutí tlačítka (událost Click) pomocí nastavení vlastnosti Click a zvolení položky <New Event Handler>. 

          <StackPanel Grid.Row="3">
              <WrapPanel HorizontalAlignment="Center">
                  <Button Name="BtnVypocti" Content="Vypočti" Margin="5" Width="80" Padding="5" Click="BtnVypocti_Click"/>
              </WrapPanel>
              <WrapPanel HorizontalAlignment="Right">
                  <Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" Padding="5" Click="BtnKonec_Click"/>
              </WrapPanel>
          </StackPanel>

          Kód 5: Umístění tlačítek v objektech typu WrapPanel posledním řádku Grid

          Výsledný formulář

          Navržené rozložení prvků na formuláři, včetně formuláře samotného, je vidět na následujícím obrázku - viz Obrázek 1.


          Obrázek 1: Výsledný formulář WPF aplikace


          Objekty na formuláři:

          • Grid
          • StackPanel
          • WrapPanel
          • Label
          • TextBlock
          • TextBox
            • TxtA
            • TxtB
            • TxtC
            • TxtVysledek
          • Button
            • BtnVypocti
            • BtnKonec

          které jsou umístěny následujícím způsobem - viz Obrázek 2.

          Obrázek 2: VS - okno Document Outline - seznam objektů





          2.3. XAML - prvky formuláře

          Nastavení formuláře

          Následující XAML kód obsahuje nastavení formuláře - viz Kód 1. Pokud je zapotřebí zkopírujte XAML kód a vložte jej namísto řádky s nastavením vlastností okna (řádek začíná Title=....).

          Title="Kvadraticka rovnice" Height="300" Width="500" MinHeight="300" MinWidth="300">
          

          Kód 1: Nastavení vlastností formuláře

          Grid

          Následující zdrojový kód XAML obsahuje potřebné prvky na formuláři pro řešení úlohy, bez nastavení událostí - viz Kód 2. Pokud je zapotřebí, zkopírujte XAML kód a vložte jej mezi počáteční a koncovou značku prvku Grid.

          <Grid.RowDefinitions>
              <RowDefinition Height="Auto"/>
              <RowDefinition Height="Auto"/>
              <RowDefinition Height="*"/>
              <RowDefinition Height="Auto"/>
          </Grid.RowDefinitions>
          <WrapPanel Margin="5,20,5,5" HorizontalAlignment="Center">
              <TextBlock Text="A * x" FontSize="16"/>
              <TextBlock Margin="0,-3,0,0" FontSize="12">2</TextBlock>
              <TextBlock Text=" + B * x + C = 0" FontSize="16"/>
          </WrapPanel>
          <WrapPanel Grid.Row="1" Margin="10,5" HorizontalAlignment="Center">
              <TextBox Name="TxtA" Margin="0,6" TextWrapping="Wrap" Text="0" Width="30"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
              <TextBlock Text="x" Margin="3,6,0,3" />
              <TextBlock Margin="0,3,0,0">
                  <Span BaselineAlignment="Top" FontSize="8">2</Span>
              </TextBlock>
              <TextBlock Text=" + " Margin="3,6,0,3"/>
           
              <TextBox Name="TxtB" Margin="0,6" TextWrapping="Wrap" Text="0" Width="30"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
              <TextBlock Text="x + " Margin="3,6,0,3"/>
              <TextBox Name="TxtC" Margin="0,6" TextWrapping="Wrap" Text="0" Width="30"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
              <TextBlock Text="= 0" Margin="3,6,0,3"/>
          </WrapPanel>
          <StackPanel Grid.Row="2">
              <Label Content="Výsledek:" FontSize="16"/>
              <TextBox Name="TxtVysledek" IsReadOnly="True" Background="AliceBlue" Text="?" TextWrapping="Wrap" Padding="5" Margin="20,0,5,0"/>
          </StackPanel>
          <StackPanel Grid.Row="3">
              <WrapPanel HorizontalAlignment="Center">
                  <Button Name="BtnVypocti" Content="Vypočti" Margin="5" Width="80" Padding="5"/>
              </WrapPanel>
              <WrapPanel HorizontalAlignment="Right">
                  <Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" Padding="5"/>
              </WrapPanel>
          </StackPanel>

          Kód 2: Prvky v Grid

          2.4. C#

          V souboru MainWindow.xaml.cs obsahující kód na pozadí (Code Behind) byla vygenerována základní struktura našeho programu v C# s konstruktorem MainWindow stejnojmenné částečné třídy MainWindow. Tělo konstruktoru obsahuje pouze metodu InitializeComponent(). Dále byly vygenerovány soukromé (private) metody bez návratu:

          • BtnVypocti_Click
          • BtnKonec_Click
          Všechny tyto události začleníme do regionu Události, tzn. počáteční značku (#region Události) umístíme před první metodu obsluhy tlačítka a koncovou značku (#endregion) za poslední metodu obsluhy tlačítka. 

          Jako první vytvoříme zdrojový kód pro zavření formuláře v obsluze události Click u tlačítka BtnKonec - viz Kód 1.

          private void BtnKonec_Click(object sender, RoutedEventArgs e)
          {
              // Zavření formuláře
              this.Close();
          }

          Kód 1: Deklarace metody bez návratu pro zavření formuláře (BtnKonec_Click)

          Pokud uživatel stiskne tlačítko BtnVypocti, bude provedena konverze všech tří zadaných hodnot koeficientů. Pokud některá ze zadaných hodnot koeficientů na formuláři nemůže být konvertována na číslo, dojde k inicializaci proměnné, do níž má být hodnota koeficientu uložena na hodnotu nula. O této skutečnosti bude uživatel informován v dialogovém oknu.

          Pokud uživatel nastavil nulovou hodnotu koeficientu kvadratického členu, je spuštěna metoda bez návratu s názvem LinearniRovnice, které jsou předány hodnotou potřebné parametry koeficientů lineárního a absolutního členu. Pokud uživatel nastavil nenulovou hodnotu koeficientu kvadratického členu, je vypočten diskriminant d. Pokud je hodnota diskriminantu nenulová a větší než nula, je volána metoda pro výpočet reálných kořenů kvadratické rovnice s názvem RealneKoreny. Této metodě jsou předány hodnoty koeficientů a a b a také vypočtený diskriminant.  Pokud je diskriminant záporný, je volána metoda KomplexniKoreny pro výpočet komplexně sdružených kořenů kvadratické rovnice. Pokud je diskriminant nulový, je volána metoda DvojityKoren pro výpočet dvojitého kořenu - viz Kód 2.

          private void BtnVypocti_Click(object sender, RoutedEventArgs e)
          {
              /* Deklarace: 'a' ... koeficient v kvadratickém členu;  'b' ... koeficient 
               * v lineárním členu; 'c' ... absolutní člen; * 'd' ... diskriminant */
              double a, b, c, d;
           
              // Pokud nedojde ke konverzi textu na číslo
              if (!double.TryParse(this.TxtA.Text, out a))
                  // Vypsání chybové hlášky v dialogovém okně
                  MessageBox.Show("Špatně zadaná hodnota A, program počítá s 0");
           
              // Pokud nedojde ke konverzi textu na číslo
              if (!double.TryParse(this.TxtB.Text, out b))
                  // Vypsání chybové hlášky v dialogovém okně
                  MessageBox.Show("Špatně zadaná hodnota B, program počítá s 0");
           
              // Pokud nedojde ke konverzi textu na číslo
              if (!double.TryParse(this.TxtC.Text, out c))
                  // Vypsání chybové hlášky v dialogovém okně
                  MessageBox.Show("Špatně zadaná hodnota C, program počítá s 0");
           
              // Pokud koeficient kvadratického členu je roven nule potom...
              if (a == 0)
                  // Volání metody pro výpočet lineárni rovnice
                  LinearniRovnice(b, c);
              // Jinak...                            
              else
              {
                  // Výpočet diskriminantu
                  d = Math.Pow(b, 2) - 4 * a * c;
                  // Pokud diskriminant není roven nule, potom...
                  if (d != 0)
                      // Pokud diskriminant je větší než nula, potom...
                      if (d > 0)
                          // Volání metody pro výpočet reálných kořenů kvadr. rovnice - předání parametrů
                          RealneKoreny(a, b, d);
                      // Jinak...
                      else
                          // Voláni metody pro výpočet komplexně sdružených kořenů kvadr. rovnice
                          KomplexniKoreny(a, b, d);
                  // Jinak...
                  else
                      // Zavoláni metody pro výpočet dvojitého kořenu
                      DvojityKoren(a, b);
              }
          }

          Kód 2: Deklarace metody pro výpočet kořenů kvadratické rovnice (BtnVypocti_Click)

          Nad region pro obsluhu událostí stisknutí tlačítek umístíme další region s názvem Výpočty. Tento region bude obsahovat jednotlivé metody pro výpočet kořenů kvadratické, nebo lineární rovnice. 

          Vzhledem k tomu, že jsme již podstatu těchto metod vysvětlovali na příkladu konzolové aplikace, není zapotřebí detailně popisovat principy výpočtu jednotlivých metod. U metod zdůrazníme zejména rozdíly v zápisu oproti konzolové aplikaci. 

          Všechny následující metody jsou bez návratu a jsou soukromé (private), tzn., jsou tedy platné pouze pro třídu. Pokud byl zadán nulový koeficient kvadratického členu, je volána soukromá metoda třídy s názvem LinearniRovnice, které jsou předány potřebné hodnoty parametrů pro výpočet kořene. Vypočtený kořen, či text budeme vypisovat na formuláři do objektu TxtVysledek, který je typu TextBox - viz Kód 3.

          //--- Specifikace metody bez návratu pro výpočet lineární rovnice 'bx + c = 0'
          /* Vstupní parametry (předány hodnotou): 'b' ... koeficient v lineárním
           * členu; 'c' ... absolutní člen */
          private void LinearniRovnice(double b, double c)
          {
              // Pokud první parametr je roven nule potom...
              if (b == 0)
                  // Pokud druhý parametr je roven 0 potom...
                  if (c == 0)
                      // Nekonečně mnoho řešení - vypsání textu v konzole
                      this.TxtVysledek.Text = "Nekonečně mnoho řešení - každé x";
                  // Jinak... 
                  else
                      // Žádné řešení - vypsání textu v konzole
                      this.TxtVysledek.Text = "Žádné řešení - žádné x";
              // Jinak...                                                                                                   
              else
                  // Vypočtení hodnoty kořenu - vypsání textu v konzole
                  this.TxtVysledek.Text = "Lineární rovnice - kořen je: x = " + (-c / b);
          }

          Kód 3: Deklarace soukromé metody bez návratu pro výpočet kořene lineární rovnice (LinearniRovnice)

          Následující zdrojový kód obsahuje deklaraci metody RealneKoreny pro výpočet reálných kořenů kvadratické rovnice. Všimněte si, že u výpisu vypočtených kořenů do objektu TxtVysledek umístěného na formuláři jsou pomocí značky \n
          v textovém řetězci vloženy dva nové řádky - viz Kód 4.

          //--- Specifikace metody bez návratu pro výpočet reálných kořenů kvadr. rovnice
          /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
           * 'b' ... koeficient v lineárním členu; 'd' ... diskriminant */
           
          private void RealneKoreny(double a, double b, double d)
          {
              /* Deklarace: 'x1' ... první reálný kořen kvadr. rovnice; 
               * 'x2' ... druhý reálný kořen kvadr. rovnice */
              double x1, x2;
              // Výpočet prvního kořenu
              x1 = (-b + Math.Sqrt(d)) / (2 * a);
              // Výpočet druhého kořenu
              x2 = (-b - Math.Sqrt(d)) / (2 * a);
              // Vypočtení hodnot kořenů - vypsání textu v dialog. okně ('\n' - zařádkování)
              this.TxtVysledek.Text = "Kořeny jsou:\n  x1 = " + x1.ToString() +
                  "\n  x2 = " + x2.ToString();
          }

          Kód 4: Deklarace soukromé metody bez návratu pro výpočet reálných kořenů kvadratické rovnice (RealneKoreny)

          Další deklarovanou metodou bez návratu je metoda KomplexniKoreny. Metoda využívá dvě lokální reálné proměnné re představující reálnou složka kořenu kvadratické rovnice a im, která představuje imaginární složku kořenu kvadratické rovnice. Tyto složku jsou připojeny do výpisu hodnot kořenů - viz Kód 5.

          //--- Specifikace metody bez návratu pro výpočet komplexně sdružených kořenů kvadr. rovnice
          /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
           * 'b' ... koeficient v lineárním členu; 'd' ... diskriminant */
          private void KomplexniKoreny(double a, double b, double d)
          {
              /* Deklarace: 're' ... reálná složka kořenu kvadr. rovnice; 
               * 'im' ... imaginární složka kořenu kvadr. rovnice */
              double re, im;
              // Výpočet reálné složky kořenu kvadr. rovnice
              re = -b / (2 * a);
              // Výpočet imaginární složky kořenu kvadr. rovnice
              im = Math.Sqrt(Math.Abs(d)) / (2 * a);
              // Výpis hodnot komplextních kořenů - vypsání textu v konzole ('\n' - zařádkování)
              this.TxtVysledek.Text = "Kořeny jsou komplexní: \n  x1 = " + re.ToString() + " + " +
                  im.ToString() + "i\n  x2 = " + re.ToString() + " - " + im.ToString() + "i";
          }

          Kód 5: Deklarace soukromé metody bez návratu pro výpočet komplexně sdružených kořenů kvadratické rovnice (KomplexniKoreny)

          Poslední soukromou metodou bez návratu je metoda DvojityKoren. Tato metoda přijímá pouze dva parametry a a b, ze kterých je vypočten dvojitý reálný kořen - viz Kód 6. 

          //--- Specifikace metody bez návratu pro výpočet dvojitého reálného kořene kvadr. rovnice
          /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
           * 'b' ... koeficient v lineárním členu */
          private void DvojityKoren(double a, double b)
          {
              /* Deklarace: 'x' ... dvojitý reálný kořen kvadr. rovnice */
              double x;
              // Výpočet dvojitého reálného kořenu
              x = -b / (2 * a);
              // Vypočtení hodnoty dvojitého reálného kořenu - vypsání textu v konzole
              this.TxtVysledek.Text = "Dvojitý reálný kořen je:\n  x = " + x.ToString();
          }

          Kód 6: Deklarace soukromé metody bez návratu pro výpočet dvojitého reálného kořene kvadratické rovnice (DvojityKoren)


          2.5. Výsledný kód

          XAML kód

          Výsledný XAML kód formuláře (MainWindow.xaml) - viz Kód 1.

          <Window x:Class="KvadratickaRovniceWPF.MainWindow"
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                  xmlns:local="clr-namespace:KvadratickaRovniceWPF"
                  mc:Ignorable="d"
                  Title="Kvadratická rovnice" Height="300" Width="500" MinHeight="300" MinWidth="300">
              <Grid>
                  <Grid.RowDefinitions>
                      <RowDefinition Height="Auto"/>
                      <RowDefinition Height="Auto"/>
                      <RowDefinition Height="*"/>
                      <RowDefinition Height="Auto"/>
                  </Grid.RowDefinitions>
                  <WrapPanel Margin="5,20,5,5" HorizontalAlignment="Center">
                      <TextBlock Text="A * x" FontSize="16"/>
                      <TextBlock Margin="0,-3,0,0" FontSize="12">2</TextBlock>
                      <TextBlock Text=" + B * x + C = 0" FontSize="16"/>
                  </WrapPanel>
                  <WrapPanel Grid.Row="1" Margin="10,5" HorizontalAlignment="Center">
                      <TextBox Name="TxtA" Margin="0,6" TextWrapping="Wrap" Text="0" Width="30"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                      <TextBlock Text="x" Margin="3,6,0,3" />
                      <TextBlock Margin="0,3,0,0">
                          <Span BaselineAlignment="Top" FontSize="8">2</Span>
                      </TextBlock>
                      <TextBlock Text=" + " Margin="3,6,0,3"/>
           
                      <TextBox Name="TxtB" Margin="0,6" TextWrapping="Wrap" Text="0" Width="30"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                      <TextBlock Text="x + " Margin="3,6,0,3"/>
           
                      <TextBox Name="TxtC" Margin="0,6" TextWrapping="Wrap" Text="0" Width="30"  HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                      <TextBlock Text="= 0" Margin="3,6,0,3"/>
                  </WrapPanel>
                  <StackPanel Grid.Row="2">
                      <Label Content="Výsledek:" FontSize="16"/>
                      <TextBox Name="TxtVysledek" IsReadOnly="True" Background="AliceBlue" Text="?" TextWrapping="Wrap" Padding="5" Margin="20,0,5,0"/>
                  </StackPanel>
                  <StackPanel Grid.Row="3">
                      <WrapPanel HorizontalAlignment="Center">
                          <Button Name="BtnVypocti" Content="Vypočti" Margin="5" Width="80" Padding="5" Click="BtnVypocti_Click"/>
                      </WrapPanel>
                      <WrapPanel HorizontalAlignment="Right">
                          <Button Name="BtnKonec" Content="Konec" Margin="5" Width="80" Padding="5" Click="BtnKonec_Click"/>
                      </WrapPanel>
                  </StackPanel>
              </Grid>
          </Window>

          Kód 1: Výsledný XAML kód vytvořeného formuláře

          C# kód

          Code Behind - C# kód pro veškeré události vyvolané uživatelem při manipulaci s aplikací (MainWindow.xaml.cs) - viz Kód 2.

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          using System.Threading.Tasks;
          using System.Windows;
          using System.Windows.Controls;
          using System.Windows.Data;
          using System.Windows.Documents;
          using System.Windows.Input;
          using System.Windows.Media;
          using System.Windows.Media.Imaging;
          using System.Windows.Navigation;
          using System.Windows.Shapes;
           
          namespace KvadratickaRovniceWPF
          {
              /// <summary>
              /// Interaction logic for MainWindow.xaml
              /// </summary>
              public partial class MainWindow : Window
              {
                  public MainWindow()
                  {
                      InitializeComponent();
                  }
           
                  #region Výpočty
           
                  //--- Specifikace metody bez návratu pro výpočet lineární rovnice 'bx + c = 0'
                  /* Vstupní parametry (předány hodnotou): 'b' ... koeficient v lineárním
                   * členu; 'c' ... absolutní člen */
                  private void LinearniRovnice(double b, double c)
                  {
                      // Pokud první parametr je roven nule potom...
                      if (b == 0)
                          // Pokud druhý parametr je roven 0 potom...
                          if (c == 0)
                              // Nekonečně mnoho řešení - vypsání textu v konzole
                              this.TxtVysledek.Text = "Nekonečně mnoho řešení - každé x";
                          // Jinak... 
                          else
                              // Žádné řešení - vypsání textu v konzole
                              this.TxtVysledek.Text = "Žádné řešení - žádné x";
                      // Jinak...                                                                                                   
                      else
                          // Vypočtení hodnoty kořenu - vypsání textu v konzole
                          this.TxtVysledek.Text = "Lineární rovnice - kořen je: x = " + (-c / b);
                  }
           
                  //--- Specifikace metody bez návratu pro výpočet reálných kořenů kvadr. rovnice
                  /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
                   * 'b' ... koeficient v lineárním členu; 'd' ... diskriminant */
           
                  private void RealneKoreny(double a, double b, double d)
                  {
                      /* Deklarace: 'x1' ... první reálný kořen kvadr. rovnice; 
                       * 'x2' ... druhý reálný kořen kvadr. rovnice */
                      double x1, x2;
                      // Výpočet prvního kořenu
                      x1 = (-b + Math.Sqrt(d)) / (2 * a);
                      // Výpočet druhého kořenu
                      x2 = (-b - Math.Sqrt(d)) / (2 * a);
                      // Vypočtení hodnot kořenů - vypsání textu v dialog. okně ('\n' - zařádkování)
                      this.TxtVysledek.Text = "Kořeny jsou:\n  x1 = " + x1.ToString() +
                          "\n  x2 = " + x2.ToString();
                  }
           
                  //--- Specifikace metody bez návratu pro výpočet komplexně sdružených kořenů kvadr. rovnice
                  /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
                   * 'b' ... koeficient v lineárním členu; 'd' ... diskriminant */
                  private void KomplexniKoreny(double a, double b, double d)
                  {
                      /* Deklarace: 're' ... reálná složka kořenu kvadr. rovnice; 
                       * 'im' ... imaginární složka kořenu kvadr. rovnice */
                      double re, im;
                      // Výpočet reálné složky kořenu kvadr. rovnice
                      re = -b / (2 * a);
                      // Výpočet imaginární složky kořenu kvadr. rovnice
                      im = Math.Sqrt(Math.Abs(d)) / (2 * a);
                      // Výpis hodnot komplextních kořenů - vypsání textu v konzole ('\n' - zařádkování)
                      this.TxtVysledek.Text = "Kořeny jsou komplexní: \n  x1 = " + re.ToString() + " + " +
                          im.ToString() + "i\n  x2 = " + re.ToString() + " - " + im.ToString() + "i";
                  }
           
                  //--- Specifikace metody bez návratu pro výpočet dvojitého reálného kořenu kvadr. rovnice
                  /* Vstupní parametry (předány hodnotou): 'a' ... koeficient v kvadratickém členu;  
                   * 'b' ... koeficient v lineárním členu */
                  private void DvojityKoren(double a, double b)
                  {
                      /* Deklarace: 'x' ... dvojitý reálný kořen kvadr. rovnice */
                      double x;
                      // Výpočet dvojitého reálného kořenu
                      x = -b / (2 * a);
                      // Vypočtení hodnoty dvojitého reálného kořenu - vypsání textu v konzole
                      this.TxtVysledek.Text = "Dvojitý reálný kořen je:\n  x = " + x.ToString();
                  }
           
                  #endregion
           
                  #region Události
           
                  private void BtnVypocti_Click(object sender, RoutedEventArgs e)
                  {
                      /* Deklarace: 'a' ... koeficient v kvadratickém členu;  'b' ... koeficient 
                       * v lineárním členu; 'c' ... absolutní člen; * 'd' ... diskriminant */
                      double a, b, c, d;
           
                      // Pokud nedojde ke konverzi textu na číslo
                      if (!double.TryParse(this.TxtA.Text, out a))
                          // Vypsání chybové hlášky v dialogovém okně
                          MessageBox.Show("Špatně zadaná hodnota A, program počítá s 0");
           
                      // Pokud nedojde ke konverzi textu na číslo
                      if (!double.TryParse(this.TxtB.Text, out b))
                          // Vypsání chybové hlášky v dialogovém okně
                          MessageBox.Show("Špatně zadaná hodnota B, program počítá s 0");
           
                      // Pokud nedojde ke konverzi textu na číslo
                      if (!double.TryParse(this.TxtC.Text, out c))
                          // Vypsání chybové hlášky v dialogovém okně
                          MessageBox.Show("Špatně zadaná hodnota C, program počítá s 0");
           
                      // Pokud koeficient kvadratického členu je roven nule potom...
                      if (a == 0)
                          // Volání metody pro výpočet lineárni rovnice
                          LinearniRovnice(b, c);
                      // Jinak...                            
                      else
                      {
                          // Výpočet diskriminantu
                          d = Math.Pow(b, 2) - 4 * a * c;
                          // Pokud diskriminant není roven nule, potom...
                          if (d != 0)
                              // Pokud diskriminant je větší než nula, potom...
                              if (d > 0)
                                  // Volání metody pro výpočet reálných kořenů kvadr. rovnice - předání parametrů
                                  RealneKoreny(a, b, d);
                              // Jinak...
                              else
                                  // Voláni metody pro výpočet komplexně sdružených kořenů kvadr. rovnice
                                  KomplexniKoreny(a, b, d);
                          // Jinak...
                          else
                              // Zavoláni metody pro výpočet dvojitého kořenu
                              DvojityKoren(a, b);
                      }
                  }
           
                  private void BtnKonec_Click(object sender, RoutedEventArgs e)
                  {
                      // Zavření formuláře
                      this.Close();
                  }
           
                  #endregion
              }

          Kód 2: Výsledný C# kód vytvořeného formuláře a metod jeho prvků

          Výstup programu

          Na následujícím obrázku vidíme výpis vypočteného kořene lineární rovnice na formuláři aplikace v případu, že uživatel zadal hodnotu koeficientu v kvadratickém členu rovnu 0.  Pro výpočet kořene byla v obsluze události Click tlačítka Vypočti zavolána metoda LinearniRovnice pomocí níž byl vypočten kořen a následně vypsán na formulář - viz Výstup programu 1 - Kód 1 a 2.  


          Výstup programu 1 - Kód 1 a 2: Ukázka výpisu hodnoty kořene pomocí metody LinearniRovnice v programu KvadratickaRovniceWPF

          Na dalším obrázku konzolové aplikace vidíme, že uživatel zadal hodnoty koeficientů takovým způsobem, že diskriminant vyšel větší než nula. Znamená to tedy, že pro výpočet kořenů kvadratické rovnice bude v obsluze události stisknutí tlačítka zavolána metoda RealneKoreny - viz Výstup programu 2 - Kód 1 a 2.   


          Výstup programu 2 - Kód 1 a 2: Ukázka výpisu hodnoty kořenů pomocí metody RealneKoreny

          Pokud byl vypočten ze zadaných hodnot záporný diskriminant, je v obsluze události stisknutí tlačítka Vypočti volána metoda pro výpočet komplexních kořenů (metoda KomplexniKoreny) - viz Výstup programu 3 - Kód 1 a 2. 


          Výstup programu 3 - Kód 1 a 2: Ukázka výpisu hodnoty kořenů pomocí metody KomplexniKoreny

          Dalším testovaným případem je výpočet dvojitého kořenu kvadratické rovnice pomocí metody DvojityKoren, kdy diskriminant byl vypočten ze zadaných hodnot jako nulový - viz Výstup programu 4 - Kód 1 a 2.   


          Výstup programu 4 - Kód 1 a 2: Ukázka výpisu hodnoty kořene pomocí metody DvojityKoren

          Zkusme si ještě zadat nečíselné textové hodnoty "bflm" u některého z koeficientů, např. u koeficientu kvadratického členu. Nebyla provedena konverze číslic (TryParse) na číselnou hodnotu v obsluze události stisknutí tlačítka. Pokud neproběhla konverze, bude spuštěno dialogové okno s výpisem chyby - viz Výstup programu 5 - Kód 1 a 2.  


          Výstup programu 5 - Kód 1 a 2: Výpis chyby při zadání nevalidní hodnoty koeficientu kvadratického členu

          Znamená to, že koeficient A v tomto případu obsahuje nulu jako u lineární rovnice (přednastavená hodnota u typu double) a program provádí výpočet kořene pomocí volání metodu LinearniRovnice - viz Výstup programu 6 - Kód 1 a 2.


          Výstup programu 6 - Kód 1 a 2: Ukázka výstupu při zadání nevalidní hodnoty koeficientu kvadratického členu (volání metody LinearniRovnice pro výpočet kořene)

          Aplikaci lze ukončit pomocí tlačítka Konec, nebo pomocí zavíracího tlačítka umístěného v pravém rohu aplikace.