Kihagyás

2.14. A goto utasítás

A következő feladatban a program helytelen adatokkal való működését akadályozzuk meg egy hátultesztelő ciklus és a goto utasítás segítségével. A goto-val bárhová ugorhatunk, csak meg kell adni a címke nevét a goto után, és el kell helyezni a program megfelelő pontjára a cimkét (kettősponttal lezárva) oda, ahova a vezérlésnek ugrani kell.

21. feladat

Kérjük be a másodfokú egyenlet együtthatóit, és számítsuk ki a gyököket 2 tizedes pontossággal! Ha a diszkrimináns negatív, írjuk ki a képernyőre: "Nincs megoldás"! Ha az a értéke 0, figyelmeztessük a felhasználót, és kérjük be újra az adatot! Ha a felhasználó 3-nál többször hibázik lépjünk ki a programból! Név: Másodfokú.

Megoldás:

static void Main(string[] args)
{
    double a = 0, b = 0, c = 0, d = 0, x1 = 0, x2 = 0;
    int hiba = 0;

    Console.WriteLine(" Másodfokú egyenlet gyökeinek számítása:");
    Console.WriteLine();

    do
    {
        if (hiba == 4) goto vege;
        Console.Write(" a=");
        a = Convert.ToDouble(Console.ReadLine());

        if (a == 0) Console.WriteLine(" Az a nem lehet 0, mivel ekkor nem másodfokú az egyenlet!");
        hiba++;
    } while (a == 0);

    Console.Write(" b=");
    b = Convert.ToDouble(Console.ReadLine());
    Console.Write(" c=");
    c = Convert.ToDouble(Console.ReadLine());

    d = b * b - 4 * a * c;
    Console.WriteLine();

    if (d < 0)
    {
        Console.WriteLine(" Nincs megoldás");
    }
    else
    {
        x1 = (-b + Math.Sqrt(d)) / (2 * a);
        x2 = (-b - Math.Sqrt(d)) / (2 * a);
        Console.WriteLine(" x1={0:0.00} x2={1:0.00}", x1, x2);
    }

vege:
    Console.ReadKey();
}

A program matematikai része már a 10. feladatban látható volt. Most egy hátultesztelő ciklussal megakadályozzuk az a=0 érték bevitelét. A ciklusban a hiba változó értékét növeljük. Ha túllépi a 3-at, akkor a goto utasítással kilépünk a ciklusból a program végén lévő vege címkére.

Hasonló eredményt érnénk el, ha a goto vege helyett a return utasítást használnánk, mivel a return utasítással kiléphetünk egy utasításcsoportból úgy, hogy a return után álló utasítások nem lesznek végrehajtva. Ekkor természetesen a vege: címkére sincs szükség.