• Zadání: Zkuste navrhnout hlavní statickou metodu programu KalkulackaVyvolaniVyjimky, která řeší základní aritmetické operace podle zadaného číselného kódu (1 … sčítání, 2 … odečítání, 3 … násobení a 4 … dělení) u dvou uživatelem zadaných čísel a a b. Rozhodování o provedení aritmetické operaci bude provedeno pomocí vícenásobného větvení proměnné kod. Výsledek aritmetické operace vypište v hlavním programu. Vytvořte následující metody:
    • KodOperace – metoda s návratem, která definuje zvolený validní číselný kód operace

    • ValidaceKoduOperace - metoda pro validaci formálního parametru kodOperace. Pokud není kód validní, je vyvolána výjimka typu ArgumentOutOfRangeException

    • Operand – metoda se formálním parametrem text datového typu string a výstupním parametrem cislo, který představuje reálné číslo typu double operandu (čísla) aritmetické operace. Pokud zadané číslo nelze konvertovat pomocí příkazu TryParse bude vyvolána výjimka typu FormatException 

    • AritmetickaOperace – metoda bez návratu, která provede zvolenou příslušnou operaci na základě zvoleného kódu aritmetické operace pomocí vícenásobného větvení a vypíše výsledek aritmetické operace

  • Řešení: 
    • Hlavní program - Main:
static void Main(string[] args)
{
    //Deklarace lokálních proměnných
    int kod;
    double a, b;
    //Potenciálně nebezpečný kód, který může způsobit výjimku
    try
    {
        //Načtení validního kódu operace
        kod = KodOperace();
        //Načtení validního reálného čísla prvního operandu
        Operand("Zadejte A: ", out a);
        //Načtení validního reálného čísla druhého operandu
        Operand("Zadejte B: ", out b);
        //Volání metody provádějící požadovanou aritmetickou operaci
        AritmetickaOperace(kod, a, b);
        //Čekání na stisk klávesy -> ukončení programu
        Console.ReadKey();
    }
    //Handler chyby při konverzi s parametrem handleru
    catch (FormatException exFormat)
    {
        //Výpis parametru handleru
        Console.WriteLine("Chyba při konverzi: {0}", exFormat.ToString());
    }
    //Handler pro kontrolu rozsahu platných hodnot argumentu s parametrem handleru
    catch (ArgumentOutOfRangeException exArgument)
    {
        //Výpis parametru handleru
        Console.WriteLine("Kód operace: {0}", exArgument.ToString());
    }
    //Obecná výjimka typu Exception (nemusíme specifikovat typ výjimky)
    catch (Exception ex)
    {
        Console.WriteLine("Nastala jiná výjimka: {0}", ex.ToString());
    }
}

    • Podprogramy:
      •  KodOperace:
//Metoda s návratem načteného validního kódu operace od uživatele
static int KodOperace()
{
    //Výpis výzvy k zadání operace
    Console.Write("Zadejte kód operace (1 ... sčítání, 2 ... odečítání, " +
        "3 ... násobení, 4 ... dělení): ");
    //Načtení kódu operace včetně jeho validace
    return ValidaceKoduOperace(int.Parse(Console.ReadLine()));
}
      • ValidaceKoduOperace:
//Metoda pro validaci načteného kódu operace od uživatele
static int ValidaceKoduOperace(int kodOperace)
{
    //Pokud je kód operace větší nebo rovno 1 a zároveň menší nebo rovno 4
    if ((kodOperace >= 1) && (kodOperace <= 4))
        return kodOperace;
    else
        //Vyvolání výjimky typu argument je mimo rozsah hodnot
        throw new ArgumentOutOfRangeException("Neplaný číselný kód operace");
}

      • Operand:
//Metoda pro načtení validního operandu
static void Operand(string text, out double cislo)
{
    string cisloText;
    //Výpis výzvy se vstupním textem
    Console.Write(text);
    //Načtení prvního zadaného čísla
    cisloText = Console.ReadLine();
    /*Test zda dojde ke konverzi, pokud ano je výstupní parametr cislo, 
      pokud ne, je vyvolána výjimka*/ 
    if (double.TryParse(cisloText, out cislo) == false)
        //Vyvolání výjimky
        throw new FormatException("Špatně zadané reálné číslo");
}

      • AritmetickaOperace:
/*Metoda provádějící aritmetické operace na vstupních operandech podle 
   čísla kódu*/
 static void AritmetickaOperace(int kod, double a, double b)
 {
     //Deklarace lokální proměnné
     double c;
     //Potenciálně nebezpečný kód, který může způsobit výjimku
     switch (kod)
     {
         //Operace sečtení
         case 1:
             //Sečtení dvou zadaných čísel
             c = a + b;
             //Ukončení sekce pro kod == 1
             break;
         //Operace odečtení
         case 2:
             //Odečtení dvou zadaných čísel
             c = a - b;
             break;
         //Operace násobení
         case 3:
             //Násobení dvou zadaných čísel
             c = a * b;
             break;
         //Operace dělení
         default:
             //Podíl dvou zadaných čísel
             c = a / b;
             break;
     }
     //Výpis textu s hodnotou výsledku
     Console.WriteLine("Výsledek C: {0}", c);
 }

  • Výstup programu 1: Ukázka výsledku podílu

Zadejte kód operace (1 ... sčítání, 2 ... odečítání, 3 ... násobení, 4 ... dělení): 4
Zadejte A: 5
Zadejte B: 2
Výsledek C: 2,5

  • Výstup programu 2: Ukázka výsledku při chybné konverzi včetně parametru handleru

Zadejte kód operace (1 ... sčítání, 2 ... odečítání, 3 ... násobení, 4 ... dělení): bflm
Chyba při konverzi: System.FormatException: Input string was not in a correct format.
   at System.Number.StringToNumber(ReadOnlySpan`1 str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(ReadOnlySpan`1 s, NumberStyles style, NumberFormatInfo info)
   at System.Int32.Parse(String s)
   at KalkulackaVyvolaniVyjimky.Program.KodOperace() in C:\Users\...\Programy\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\Program.cs:line 52
   at KalkulackaVyvolaniVyjimky.Program.Main(String[] args) in C:\Users\fox\...\Programy\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\Program.cs:line 16

  • Výstup programu 3: Ukázka výsledku při porušení rozsahu platných hodnot argumentu

Zadejte kód operace (1 ... sčítání, 2 ... odečítání, 3 ... násobení, 4 ... dělení): 5
Kód operace: System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: Neplaný číselný kód operace
   at KalkulackaVyvolaniVyjimky.Program.ValidaceKoduOperace(Int32 kodOperace) in C:\Users\fox\OneDrive\TI\TI_Nove\Prednasky\Podklady\Programy\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\Program.cs:line 64
   at KalkulackaVyvolaniVyjimky.Program.KodOperace() in C:\Users\fox\...\Programy\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\Program.cs:line 52
   at KalkulackaVyvolaniVyjimky.Program.Main(String[] args) in C:\Users\fox\...\Podklady\Programy\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\Program.cs:line 16

  • Výstup programu 4: Ukázka výsledku při načtení špatné hodnoty operandu
Zadejte kód operace (1 ... sčítání, 2 ... odečítání, 3 ... násobení, 4 ... dělení): 3
Zadejte A: bflm
Chyba při konverzi: System.FormatException: Špatně zadané reálné číslo
   at KalkulackaVyvolaniVyjimky.Program.Operand(String text, Double& cislo) in C:\Users\...\Podklady\Programy\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\Program.cs:line 79
   at KalkulackaVyvolaniVyjimky.Program.Main(String[] args) in C:\Users\...\Podklady\Programy\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\KalkulackaVyvolaniVyjimky\Program.cs:line 18
Última modificación: domingo, 2 de febrero de 2020, 17:02