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 😃
Und vermeide "goto" am besten von Anfang an 😉
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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.
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();
}
}
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.
Und der Methodenname sollte auch angepasst werden 😉
Und wie Ezio schon geschrieben hat, möglichst Logik und UI voneinander trennen.
Ich denke GOTO ist meistens der einfache Ausweg innerhalb eines schlechten Designs.