Entwickler-Ecke

Basistechnologien - Konsolenrechner


steffl2000 - Fr 30.09.11 14:55
Titel: Konsolenrechner
hallo zusammen, hab hier einen Rechner für die Konsole und noch ein Problem. Rechnen tut er schon mal ;) nur muss ich noch, wenn statt einer Zahl zb. ein Buchstabe eingegeben wird, eine Fehlermeldung ausgeben. Kann mir jemand vielleicht einen Denkanstoss geben? Kann ich das auch mit Switch bewerkstelligen? Wenn ja wie?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
Console.Write("Bitte geben Sie die erste Zahl ein: ");            
            Console.ForegroundColor = ConsoleColor.Yellow;
            string a = Console.ReadLine();
            Console.ForegroundColor = ConsoleColor.Black;
            
            Console.Write("Bitte geben Sie die zweite Zahl ein: ");
            Console.ForegroundColor = ConsoleColor.Yellow;
            string b = Console.ReadLine();
            Console.ForegroundColor = ConsoleColor.Black;

            Console.Write("Bitte geben Sie einen Operator an [+,-,*,/]: ");
            Console.ForegroundColor = ConsoleColor.Yellow;
            string rechenart = Console.ReadLine();
            Console.ForegroundColor = ConsoleColor.Black;


            double zahla = Convert.ToDouble(a);
            double zahlb = Convert.ToDouble(b);

            double ergebnis1 = zahla + zahlb;
            double ergebnis2 = zahla - zahlb;
            double ergebnis3 = zahla * zahlb;
            double ergebnis4 = zahla / zahlb;


            switch (a)
            {
                ????
            }


            switch (rechenart)
            {
                case "+":
                    Console.WriteLine("{0} + {1} = {2}", zahla, zahlb, ergebnis1);
                    break;

                case "-":
                    Console.WriteLine("{0} - {1} = {2}", zahla, zahlb, ergebnis2);
                    break;

                case "*":
                    Console.WriteLine("{0} * {1} = {2}", zahla, zahlb, ergebnis3);
                    break;

                case "/":
                    Console.WriteLine("{0} / {1} = {2}", zahla, zahlb, ergebnis4);
                    break;

                default:
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Sie haben keinen gültigen Operator eingegeben.");
                    Console.ForegroundColor = ConsoleColor.Black;
                    break;


            
            }
            

            Console.WriteLine("Drücken Sie eine beliebige Taste um das Programm zu beenden");
            Console.ReadKey();


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


storestore - Fr 30.09.11 14:58

Hi,
wie wäre es mit Exceptions?
Edit:
http://openbook.galileocomputing.de/csharp/kap04.htm
http://www.aspheute.com/artikel/20000724.htm
http://msdn.microsoft.com/en-us/library/ms173160.aspx


steffl2000 - Fr 30.09.11 15:04

ok, werds mir gleich mal ansehen


Horschdware - Fr 30.09.11 15:11

Nein, storestore. Das würde ich hier nicht tun.
Eine Exception ist ja eine "Ausnahme", quasi ein nicht vorhergesehenes Ereignis.
Die Eingabe eines falschen Zeichens ist aber vorhersehbar und lässt sich vorher abfangen.

Achtung Autovergleich:
Wenn ein Kind auf die Straße rennt, dann fährst du ja auch nicht einfach drüber und setzt dich dann nach Kuba ab (Exception) sondern leitest frühzeitig Gegenmaßnahmen ein (bremsen!!).

Bei der Programmierung läuft das genauso.
Vor der Typumwandlung prüft man, ob die Eingabe einen brauchbaren Wert hat.
Hier wären das Zahlen.

Man könnte jetzt entweder prüfen, ob die Eingabe ein Buchstabe ist und falls ja rausspringen. Da müsste man im schlimmsten Fall prüfen auf a, b, c, .... A,B,C,... /()=!? usw....
Oder man prüft, ob die Eingabe eine Zahl ist (0..9).
Wenn ja: Weitermachen. Wenn nein, raus.



(Ich bin kein Experte für C#, aber zumindest in anderen Sprachen gibt es gelegentlich Methoden Marke StrToIntDef(s, i), welche eine Umwandlung versucht und im Fehlerfall einen Standardwert setzt. Vllt gibt's so etwas auch in C#? Google / Forensuche?)


Th69 - Fr 30.09.11 15:39

Hallo zusammen,

ja dafür gibt es die statische TryParse-Methode [http://msdn.microsoft.com/de-de/library/994c0zb1%28v=VS.100%29.aspx].


Horschdware - Fr 30.09.11 16:25

Ach ja, ich bin mal eben fies :P

Was macht denn dein Programm, wenn du erst eine 1, dann ein "/" und dann eine 0 eingibst? :zwinker:


pdelvo - Fr 30.09.11 17:08

failen. für sowa s braucht man einen Formel Parser. Gibts schon ne Menge fertiges zeugs. Ich je nach Funktionsumfang richtig aufwendig


Horschdware - Fr 30.09.11 17:13

Mir ging es eigentlich nur um das Abfangen einer Division durch null. Im obigen Coding wird ja erst einmal jede mögliche Rechenoperation ausgeführt, dann aber nur die gewünschte Ausgegeben. Ich denke, das sollte machbar sein, nur die gewünschte Rechenoperation durchzuführen und im Fall einer Division den Null-Fall auszusondern.
Formelparser dürfte für so ein Einsteigerprojekt vielleicht ein kleines Bisschen überdimensioniert sein ;-)