Laden...

[gelöst] Ersatz für If-Abfrage --> Switch

Erstellt von CarnifeX vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.941 Views
C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren
[gelöst] Ersatz für If-Abfrage --> Switch

Hi Leute,

ich habe zur Übung einen kleinen Taschenrechner in C# geschrieben (Als Konsolenanwendung).
Da mir nichts anderes eingefallen ist habe ich die Überprüfung wie gerechnet werden soll (also +,- usw.) mit einer If-Anfrage Formuliert.
Ich bin mir sicher dass das keine gute Lösung ist und wollte daher fragen ob ihr eine leichtere/bessere Lösung für mich habt?

class Rechner
    {
        internal void Plus(ref decimal z1, ref decimal z2)
        {
            decimal ausgabe;
            ausgabe = z1 + z2;
            Console.WriteLine(ausgabe);
        }
        internal void Minus(ref decimal z1, ref decimal z2)
        {
            decimal ausgabe;
            ausgabe = z1 - z2;
            Console.WriteLine(ausgabe);
        }
        internal void Mal(ref decimal z1, ref decimal z2)
        {
            decimal ausgabe;
            ausgabe = z1 * z2;
            Console.WriteLine(ausgabe);
        }
        internal void Modulo(ref decimal z1, ref decimal z2)
        {
            decimal ausgabe;
            ausgabe = z1 % z2;
            Console.WriteLine(ausgabe);
        }
        internal void Geteil(ref decimal z1, ref decimal z2)
        {
            decimal ausgabe;
            ausgabe = z1 / z2;
            Console.WriteLine(ausgabe);
        }
    }
    class Program
    {
     static void Main(string[] args)
        {
            Anfang:
            Rechner ObjektRechner = new Rechner();
            decimal Zahl1, Zahl2;

            Console.WriteLine("Bitte geben Sie die erste Zahl ein:");
            Zahl1 = Convert.ToDecimal(Console.ReadLine());

            
            Console.WriteLine("Bitte geben Sie die gewünschte Rechenmethode ein: (+,-,+,%,/");
            rechenschritte:
            string eingabe = Console.ReadLine();
            

            Console.WriteLine("Bitte geben Sie die zweite Zahle ein:");
            Zahl2 = Convert.ToDecimal(Console.ReadLine());

            

            if (eingabe == "+")
            {
                ObjektRechner.Plus(ref Zahl1, ref Zahl2);
            }
            else if (eingabe == "-")
            {
                ObjektRechner.Minus(ref Zahl1, ref Zahl2);
            }
            else if (eingabe == "*")
            {
                ObjektRechner.Mal(ref Zahl1, ref Zahl2);
            }
            else if (eingabe == "/")
            {
                ObjektRechner.Geteil(ref Zahl1, ref Zahl2);
            }
            else if (eingabe == "%")
            {
                ObjektRechner.Modulo(ref Zahl1, ref Zahl2);
            }
            else
            { 
                Console.WriteLine("Ungültige Eingabe! Bitte geben Sie das Zeichen erneut ein");
                goto rechenschritte;
            }

            Console.ReadKey();
            goto Anfang;

            
        }
    }

Danke schonmal 😃

1.696 Beiträge seit 2006
vor 8 Jahren

Switch ist dein Freund

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren

Vielen Dank vbprogger, genau das habe ich gesucht! 😃

2.207 Beiträge seit 2011
vor 8 Jahren

Und vermeide "goto" am besten von Anfang an 😉

189 Beiträge seit 2014
vor 8 Jahren

Die Verwendung von goto lässt sich immer anders darstellen:*Verzweigungen (if, switch) *Schleifen (foreach, for, while, do-while) *Methoden

Goto ist böse. 😉
Genauseo wie wile(true), was auch so gut wie nicht verwendet werden sollte.

C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren

Danke für den Goto Tipp 😃
hab es jetzt folgendermaßen gelößt (kurzes Feedback wäre nett 😃)

class Rechner
    {
         internal void IfAbfrage(ref decimal z1, ref decimal z2, ref string eingabe)
        {
            decimal ergebnis;

            switch (eingabe)
            {
                case "+":
                    ergebnis = z1 + z2;
                    Console.WriteLine(ergebnis);
                    break;
                case "-":
                    ergebnis = z1 - z2;
                    Console.WriteLine(ergebnis);
                    break;
                case "*":
                    ergebnis = z1 * z2;
                    Console.WriteLine(ergebnis);
                    break;
                case "%":
                    ergebnis = z1 % z2;
                    Console.WriteLine(ergebnis);
                    break;
                case "/":
                    ergebnis = z1 / z2;
                    Console.WriteLine(ergebnis);
                    break;
                default:
                    Console.WriteLine("Ungültige Rechenmethode!");
                    break;
            }
        }
     }
    class Program
    {
        static void Main(string[] args)
        {        
            Rechner ObjektRechner = new Rechner();
            decimal Zahl1, Zahl2;

            Console.WriteLine("Bitte geben Sie die erste Zahl ein:");
            Zahl1 = Convert.ToDecimal(Console.ReadLine());
            
            Console.WriteLine("Bitte geben Sie die gewünschte Rechenmethode ein: + - + % /");
       
            string eingabe = Console.ReadLine();
            
            Console.WriteLine("Bitte geben Sie die zweite Zahle ein:");
            Zahl2 = Convert.ToDecimal(Console.ReadLine());

            ObjektRechner.IfAbfrage(ref Zahl1, ref Zahl2, ref eingabe);
                    
            Console.ReadKey();
         }
    }

189 Beiträge seit 2014
vor 8 Jahren

Hallo CarnifeX,

ich hätte die Rechenmethoden so gelassen und den switch in die Main-Methode gebaut.
Aber das kannst du auch so lassen ... .
Ich finde es nicht(!) gut, dass du das Ergebnis in der Methode schon auf die Konsole schreibst! -> Das gehört IMHO in die Main.
... Und wenn du die Zahlen oder den Operator in der Methode verändern willst, brauchst du kein ref.

771 Beiträge seit 2009
vor 8 Jahren

Und der Methodenname sollte auch angepasst werden 😉

Und wie Ezio schon geschrieben hat, möglichst Logik und UI voneinander trennen.

C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren

Alles klar, Danke euch beiden 😃

A
29 Beiträge seit 2012
vor 8 Jahren

Goto ist böse. 😉

Nein, ist es nicht. Für goto gibt es durchaus berechtigte Anwendungsfälle.

301 Beiträge seit 2009
vor 8 Jahren

Ich denke GOTO ist meistens der einfache Ausweg innerhalb eines schlechten Designs.