Autor Beitrag
steffl2000
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 30.09.11 14:55 
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?

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 397
Erhaltene Danke: 7

WIN 7
C#
BeitragVerfasst: Fr 30.09.11 14:58 

_________________
Der Pc ist nur so schlau, wie derjenige der in steuert!
"Don't Quit. Suffer now, and live the rest of your life as a champion"
steffl2000 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 30.09.11 15:04 
ok, werds mir gleich mal ansehen
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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?)

_________________
Delphi: XE - OS: Windows 7 Professional x64
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 30.09.11 15:39 
Hallo zusammen,

ja dafür gibt es die statische TryParse-Methode.
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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:

_________________
Delphi: XE - OS: Windows 7 Professional x64
pdelvo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 55
Erhaltene Danke: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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 ;-)

_________________
Delphi: XE - OS: Windows 7 Professional x64