Programování v C# prakticky - 2.díl - Rozhodovací struktury

24. 6. 2012 Milan Suk C# 3 komentáře 1121

V tomto díle seriálu programování v C# prakticky si napíšeme aplikace na procvičení rozhodovacích struktur. U aplikací se budu opět držet matematického zaměření. První aplikace bude na výpočet kořenů kvadratické rovnice, přičemž budeme kontrolovat kolik řešení má a druhá bude na výpočet hodnoty funkce tangens a budeme přitom hlídat, jestli uživatel nezadal hodnotu 90°, pro kterých není tato funkce definovaná

Kvadratická rovnice

Začneme jemnou teorií, aby se zájemci o programování z nižších ročníků základních škol nestráceli.

Kvadratická rovnice je taková rovnice, která obsahuje proměnnou povýšenou na exponent 2 (x2). Obecný zápis této rovnice je potom ax2 + bx + c = 0. Pro výpočet se používat tzv. diskriminant. Ten má vzorec D = b2 - 4ac. Potom na základě toho, jakou hodnotu má diskriminant se zjišťuje, kolik bude mít rovnice řešení. 

  • Pokud D = 0, potom má rovnice jedno dvojnásobné řešení (protože kvadratická rovnice musí mít buď dvě, nebo žádné řešení),
  • Pokud D > 0, má rovnice dvě řešení,
  • Pokud D < 0, nemá rovnice v množině R žádné řešení (v množině komplexních čísel ano, ale to nyní nebudeme uvažovat)

Řešení rovnice získáme pomocí následující ho vztahu :

x_{1,2}=frac{-b plusmn sqrt{D}}{2a}

Setavení algorytmu

Po uživateli budeme potřebovat pouze koeficienty a, b a c, přičemž koeficient a nesmí být roven nule, jinak by byl kvadratické člen roven nule a nejednalo by se již o kvadratickou rovnici, ale o rovnici lineární. Další samozřejmostí je, že v textových polích musí něco být napsaného, takže string zadaný pro koeficienty b a c nesmí být null.

Pokud budou tyto podmínky splněny přejdeme k samotnému výpočetu diskriminantu. To nebude, vhledem k tomu, že se v něm nachází pou mocnina druhého stupně a tu můžeme vyjádřit jakou součin, žádný problém. 

V posledním kroku musíme zjistit, jstli se hodnota proměnné, do které jsme uložili výsledek diskriminantu, rovná nula, je větší než nula a nebo jestli je menší než nula. Na základě toho potom vypočítáme hodnotu. (pozn.) V případě jednoho kořenu si samozřejmě výraz upravíme na - b / 2a, protože pokud se hodnota diskriminantu rovná nule, potom i jeho odmocnina je samozřejmě nula, proto ho není třeba uvažovat.

Musíme si ještě uvědomit, že hodnoty, s kterými budeme pracovat budou s velkou pravděpodobností desetinná, proto využijeme datového typu Double (popř. float apod.). Na základě těchto poznatků můžeme snadno sestavit odpovídající zdrojový kód :

// Počítáme s tím, že textová pole mají označení textBox1, textBox2 a textBox3
if (string.IsNullOrEmpty(textBox1.Text) || string.IsNullOrEmpty(textBox2.Text) 
    || string.IsNullOrEmpty(textBox3.Text) || textBox1.text == 0) // Kontrola vstupu od uživatele
{
 MessageBox.Show("Chybně zadané potřebné údaje", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Warning); // vypsat chybovou hlášku
}
else
{
 double a = Convert.ToDouble(textBox1.Text); // Koeficient a
 double b = Convert.ToDouble(textBox2.Text); // Koeficient b
 double c = Convert.ToDouble(textBox3.Text); // Koeficient c
  
 double diskriminant = b * b - (4 * a * c); 
 if (diskriminant == 0) // jedno řešení
 {
  double x = -b / 2 * a;
  MessageBox.Show("Rovnice má jeden reálný kořen : x = " + x + ".", "Výsledek");
 }
 else if (diskriminant > 0) // dvě různá řešení
 {
  double x1 = (-b - Math.Sqrt(diskriminant)) / 2 * a;
  double x2 = (-b + Math.Sqrt(diskriminant)) / 2 * a;
  MessageBox.Show("Rovnice má dva reálné kořeny : x1 = " + x1 + "; x2 = " + x2 + ".", "Výsledek");
 }
 else if (diskriminant < 0) // žádné reálné řešení
 {
  MessageBox.Show("Rovnice nemá žádný reálný kořen !", "Výsledek");
 }
}

Výsledná fungující aplikace vipadá asi jako na obrázku níže.

Výpočet funkce tangens

Další příklad bude velice jednoduchý. Vypočteme hodnotu funkce tangens a budeme muset hlídat pouze to, jestli je hodnota různá od 90°. Funkce tangens totiž není pro tuto hodnotu definovaná. Proč lze docela pěkně vidět z obrázku níže. Protože funkční hodnota pro cos(90°) = 0, tak by se tato nula objevila ve jmenovateli zlomku, což samozřejmě nelze. 

V našem algorytmu nejdříve zjistíme, jestli je hodnota získaná od uživatele rovna nula, nebo jestli je null a pokud ne vypočítáme hodnotu funkce tangens a vypíšeme ji do komponenty Label. Pro samotný výpočet můžeme použít buď přmo funkci tangens a nebo vzorec nahoře. Goniometrické funkce jsou k nalezení ve třídě Math (Math.Sin, Math.Cos, Math.Tan), ovšem pozor tyto funkce neočekávají úhel ve stupních, nýbrž v radiánech, proto musíme ještě řed použití funkce převést vstup uživatele na radiány.

if (string.IsNullOrEmpty(textBox1.Text) || Convert.ToDouble(textBox1.Text) == 90) // Je prázdný nebo hodnoty 90
{
 MessageBox.Show("Byl zadán chybný vstup", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Vypsat chybovou hlášku
}
else
{
 double x = Convert.ToDouble(textBox1.Text) / (180 / Math.PI); // Uložit do proměnné x a rovnou převést radiány
 double vysledek = Math.Sin(x) / Math.Cos(x); // Dopočítání hodnoty funkce tangens
 label.Text = "y = " + vysledek; // Zapsání výsledku
}

Výslednou aplikace můžete vidět na obrázku níže.

Závěr

To je k tomuto dílu opět vše. V dalším dílu budeme pokračovat aplikacemi na procvičení cyklů. Můžete se těšit např. na aplikace jako třeba výpočet přesné hodnoty faktoriálu.



Aktuálně

  • 3. 6. 2013 - Nový vzhled webu

Code Snippety

Komentáře

Statistiky

  • TOPlist