Entwickler-Ecke

C# - Die Sprache - C# Consolen text abfrage


storestore - Do 01.09.11 23:18
Titel: C# Consolen text abfrage
Hallo,
neues Thema neues Glück!
Also,
ich will nun abfragen das wenn das was die Console rückgibt ein Buchstabe ist das dan Ein Text wie z.B Console.WriteLine("Bitte nur zahlen eingeben!!!");
Naja nur das Problem ist, mit was mache ich das am besten?
Mit einer if anweisung oder mit einer switch-case anweisung?
Ich habe es mal mit einer switch-case anweisung versucht

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
string text= Console.ReadLine();
switch(text)
{
case "A":
Console.WriteLine("Bitte nur zahlen eingeben!!!")
break;
case "B":
Console.WriteLine("Bitte nur zahlen eingeben!!!")
break;
case "C":
Console.WriteLine("Bitte nur zahlen eingeben!!!")
break;
// Weiter bis zu "Z"
}

Wenn ich jetzt z.B. A eingebe dann gibt er mir dieses: "Bitte nur zahlen eingeben!!!" aus.
Aber wenn ich jetzt ABC eingebe dann stürzt er ab. Aber wie kann ich das lösen? Ich kann ja nicht alle Wörter der Welt in meine switch-case anweisung einbauen?!

Mfg Storestore


Yogu - Do 01.09.11 23:32

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
Halloich will nun abfragen das wenn das was die Console rückgibt ein Buchstabe ist das dan Ein Text wie z.B Console.WriteLine("Bitte nur zahlen eingeben!!!");

Seltsam: Dem Benutzer sagst du, dass nur Zahlen eingegeben werden dürfen, dem Programm aber, dass keine Buchstaben erlaubt sind. Was trifft es wohl eher?

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
wenn ich jetzt ABC eingebe dann stürzt er ab.

Wenn du das Programm aus Visual Studio heraus aufrufst, stürzt es nicht ab. Es zeigt dir eine Exception angezeigt, beim Aufruf der int.Parse-Methode, oder? Und jetzt such mal nach einer Methode, die keine Exception wirft, wenn sie falsche Eingaben bekommt, sondern dir den Fehler anders mitteilt. Ist gar nicht so schwer.


storestore - Fr 02.09.11 00:46

Oder ich versuch es mit try and catch!


bakachan - Fr 02.09.11 08:22

Schau lieber mal ob dir int nicht noch andere Funktionen bereitstellt. Parse hast du ja schon gefunden aber es gibt da bessere Varianten die auch mit falschen Eingaben umgehen können.


storestore - Fr 02.09.11 11:08

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
Schau lieber mal ob dir int nicht noch andere Funktionen bereitstellt. Parse hast du ja schon gefunden aber es gibt da bessere Varianten die auch mit falschen Eingaben umgehen können.

Ok, was wäre den an try and catch so schlimm? Das ist doch eig. genau das was ich möchte.


dark-destination1988 - Fr 02.09.11 11:16

if(int.TryParse(source,target)==true)
//erfolgreich
else
//nicht erfolgreich


pdelvo - Fr 02.09.11 11:19

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
Schau lieber mal ob dir int nicht noch andere Funktionen bereitstellt. Parse hast du ja schon gefunden aber es gibt da bessere Varianten die auch mit falschen Eingaben umgehen können.

Ok, was wäre den an try and catch so schlimm? Das ist doch eig. genau das was ich möchte.


try-catch Böcke sind für sowas nicht gedacht. Es ist ganz schlechter Styl sie für solches zu missbrauchen.

dark-destination1988 hat die beste Lösung gepostet, bis auf zwei kleinigkeiten.


C#-Quelltext
1:
2:
3:
4:
5:
6:
int zahl;
string text = Console.ReadLine();
if(int.TryParse(text,out zahl)) // == true ist völlig unnötig. TryParse gibt schon einen Boolean zurück 
//erfolgreich. das ergebnis steht jetzt in 'zahl' 
else 
//nicht erfolgreich


dark-destination1988 - Fr 02.09.11 11:21

sorry das mit dem out hat ich auch gerade gemerkt ;) und das true schreib ich immer mit hin (klar ist es unnötig aber besser lesbar)


storestore - Fr 02.09.11 11:27

Ok, danke klappt super. Denoch würde ich gerne wissen wozu eig. try and catch dient!


pdelvo - Fr 02.09.11 11:32

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
Ok, danke klappt super. Denoch würde ich gerne wissen wozu eig. try and catch dient!


try-catch dient zum Abfangen von Exceptions(Ausnahmen). Wie der Name schon sagt sind Ausnahmen Dinge, die nicht zum festen Programmablauf gehören. Wenn es geht sollte man daher versuchen Eingaben vorher zu prüfen, und nicht die Exception zum prüfen von Eingaben missbrauchen.


bakachan - Fr 02.09.11 11:33

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
Ok, was wäre den an try and catch so schlimm? Das ist doch eig. genau das was ich möchte.


Nehmen wir mal ein Beispiel:
Du willst mit einem Auto fahren weisst aber nicht ob die Bremsen funktionieren.
Die TryParse Variante wäre zu probieren ob die Bremsen greifen, wenn nicht weisst du es vorher.
Die Try Catch Variante heisst du fährst einfach los und merkst während der Fahrt das die Bremsen nicht funktionieren also fährst du gegen einen Baum. Aber macht ja nichts, die Airbags (Catch) haben dich ja gerettet.

Try Catch ist für Sachen die du nicht kontrollieren kannst. Nehmen wir zum Beispiel mal an du willst eine Datei im Netzwerk lesen aber in dem Moment zieht der andere das LAN-Kabel raus. Anstatt nun das ganze Programm Abstürzt kannst du mit dem Catch den Fehler auswerten/behandeln.

Oder für Fehlerberichte:
Man kann im äußersten Bereich der Anwendung ein TryCatch verwenden um Fehlerberichte zu erstellen.
Quasi wenn irgendein unerwarteter Fehler auftritt wird es wenigstens noch protokolliert und kann an den Entwickler gesendet werden.


storestore - Fr 02.09.11 13:01

Naja, da das Prgramm das ich programmierer zu Übungszwecken dient will ich es auch mit try und catch versuchen


dark-destination1988 - Fr 02.09.11 13:14

viel spaß beim gegen baum fahren ;)


Yogu - Fr 02.09.11 13:18

user profile iconstorestore hat folgendes geschrieben Zum zitierten Posting springen:
will ich es auch mit try und catch versuchen

:zustimm:

Solange du die Ratschläge im Kopf behältst und in der fertigen Anwendung berücksichtigst.


storestore - Fr 02.09.11 13:26

Hallo,
ja natürlich werde ich die Ratschläge im Kopf behalten. Da es aber wirkch nur zu übungszwecken dient würde ich es mal gernen mit try und catch versuchen


storestore - Fr 02.09.11 21:27

Hier ist mal der neue Code:
Sorry für den dopple post aber sonst kommt man durcheinander *Rausreden*
Da ich es ja mit try and catch versuchen wollte bliebe mir eig. nix anders möglich als alles in eine Methode abzuwickeln, oder? Wenn ich in catch einfach wieder eine Schleife einbinde, bringt mir das nix. Wenn mir der user wieder ein Buchstabe eingibt dann habe ich den gleichen salat wie in der aller ersten Frage beschrieben. (Aber ein Salat ohne Dressing, frischen Gemüse und saftigen geilen Chrimps *Hmmmm*)
mfg storestore

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:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            Methode();
        }
        static void Methode()
        {


            try
            {
                string wiederholen;
                string darfnichtsein;

                do
                {




                    // Abfrage
                    Console.WriteLine("Hallo, geben sie bitte ihr aktuelles \"Vermögen\" ein!");
                    // Die Variable
                    darfnichtsein = Console.ReadLine();
                    double geld = Convert.ToDouble(darfnichtsein);

                    // Abfrage2
                    Console.WriteLine("Wollen sie was drauf zahlen oder abziehen?");
                    Console.WriteLine("D= draufzahlen, A=Abziehen!");
                    string text = Console.ReadLine();
                    if (text == "D" || text == "d")
                    {   // Was soll er machen
                        Console.WriteLine("Wie viel wollen sie drauf zahlen?");
                        double draufzahlen = Convert.ToDouble(Console.ReadLine());
                        geld = geld + draufzahlen;
                        Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro");
                        Console.ReadLine();
                    }
                    // Was wenn es nicht stimmt
                    else if (text == "A" || text == "a")
                    {
                        Console.WriteLine("Wie viel wollen sie abheben?");
                        double abheben = Convert.ToDouble(Console.ReadLine());
                        geld = geld - abheben;
                        Console.WriteLine("Ihr aktuelles Guthaben= " + geld + " Euro");
                        Console.ReadLine();
                    }
                    else
                    // Else again .,.
                    {
                        Console.WriteLine("Bitt nur zwischen 'A'oder 'a' und 'D'oder'd' auswählen");
                        Console.ReadLine();
                    }
                    Console.WriteLine("Nochmal? Dan drücker 'N'  oder'n'");
                    Console.WriteLine("Oder lieber raus ins Freie? ;) Dann einfach exit eingeben");
                    wiederholen = Console.ReadLine();



                    Console.Clear();




                } while (wiederholen == "N" || wiederholen == "n");
            }

            catch
            {
                Console.WriteLine("Bitte Nur zahlen angeben"
                    + " nächster versuch *Augen roll !!!* Bitte Enter drücken ");
                Console.ReadLine();
                Console.Clear();
            
               
               
                Methode();



            }
            }
        }
    }


Yogu - Sa 03.09.11 12:32

Schon wieder eine Rekursion, und jetzt auch noch parallel zur Schleife. Du bist einfach unverbesserlich... :roll:


storestore - Sa 03.09.11 12:36

Hi, ja aber wie soll ich das den sonst machen wenn ich try and catch verwenden will? Ich kann es ja wieder mit einer schleife machen aber wenn ich das zweite mal auch wieder Buchstaben eingebe dann stürtzt er ab! Aber alle machen viele Sachen mit Methoden wieso gibt es bei mir sofort eine rekursion?


Horschdware - Sa 03.09.11 13:14

Irgendwie wird hier am selben Programm in zwei unterschiedlichen Forenthreads gebastelt und die Erkenntnisse aus dem einen Thread gelangen nicht in den anderen.
Vgl. hier http://www.c-sharp-forum.de/viewtopic.php?p=649488#649488 - da ist das mit der Rekursion bereits gelöst.


storestore - So 04.09.11 10:06

Nene! Das eine war nur für die Methode. Das hier ist der versuch mit Try und catch! Aber ohne eine Methode bekomme ich das nicht hin!