Autor Beitrag
Ogrus
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 18.10.10 08:17 
hallo zusammen,

hab erst vor kurzem begonnen Programmieren zulernen, und bin deswegen noch sehr unerfahren auf dem Gebiet. ich hoffe ihr könnt mir bei meinem Problem helfen.

Ich hab ein kleines KonsolenProgramm geschrieben, bei dem man über die tastatur Zahlen eingeben soll, und mit den Zahlen gerechnet werden sollen. Wie bekomm ich es aber hin, dass wenn man strings oder chars eingibt, die eingabe abgefangen wird, und man nochmal die Eingabe vornehmen kann ?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 18.10.10 08:27 
Hallo und :welcome:!

Wenn du Console.ReadLine verwendet, bekommst du immer einen String, also eine Reihe von Zeichen. Deine Aufgabe ist es nun, die Zeichen als eine Dezimalzahl zu behandeln und in einen Integer umzuwandeln, mit dem du dann weiterrechnen kannst. Diese Umwandlung funktioniert natürlich nicht immer - der Fehlerfall ist das, von dem du schreibst, dass der benutzer einen String eingibt.

Für die Konvertierung kannst du die Methode int.TryParse verwenden:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
int value;
if (int.TryParse(eingabeString, out value)) {
  /* Eingabe erfolgreich */
else {
  /* Eingabefehler */
}

Wenn der Benutzer aufgefordert werden soll, die Eingabe zu wiederholen, musst du den Code natürlich in eine Schleife packen. Es bietet sich an, ihn in eine eigene Methode auszulagern, die direkt den Integer zurückliefert.
sheroco
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 27.10.10 23:27 
Hallo, hab mich auch etwas mit dem Thema auseinandergesetzt, nur mein Problem ist nun das ich es nicht schaffe den Wert der Methode zurückzugeben.

ausblenden 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:
class Program
    {
        static void Main(string[] args)
        {

        ZahlEinlesen(int zahl);

        }


    public static int ZahlEinlesen(int zahl);
        {
            int zahl;
            Console.WriteLine("Zahl:");

            if (int.TryParse(Console.ReadLine(), out zahl))
            {
                Console.WriteLine("Eingabe erforgreich");
                return zahl;
                
            }
            else
            {
                Console.WriteLine("Eingabefehler");
            }
            
        }
}


Hoffe Ihr könnt mir da weiterhelfen..

Mfg sheroco

Moderiert von user profile iconKha: Code- durch C#-Tags ersetzt
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 28.10.10 00:31 
Da hats du ihn doch: ZahlEinlesen(int zahl);. Nur, da du nichts damit machst, ihn zum Beispiel ausgeben, siehst du natürlich nichts.

Für diesen Beitrag haben gedankt: sheroco
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 28.10.10 05:54 
Allerdings ist der Rückgabewert undefiniert, wenn keine gültige Zahl eingegeben wurde. Da fehlt (im else) noch ein return mit einem Defaultwert oder eine Schleife, die läuft, bis eine gültige Zahl eingegeben wurde.

Für diesen Beitrag haben gedankt: sheroco
sheroco
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 28.10.10 08:47 
@Luckie ja das ist mir schon klar, nur das Programm müsste trotzdem aufgerufen werden können, oder?
...auch wenn es dann sofort wieder geschlossen wird, sobald ich eine zahl: ___ eingebe.

@jaenicke Die Methode selbst kann ja nur einen Rückgabewert besitzen,oder kann ich im else Block eine 2.Rückgabe mit

return

"falsch" machen?

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:
class Program
    {
        static void Main(string[] args)
        {
       
        Console.WriteLine(ZahlEinlesen());
        Console.ReadLine();

        }

    
    public static int ZahlEinlesen(int zahl);
        {bool y;
    
         do
            {

            int zahl;
            Console.WriteLine("Zahl:");

            if (int.TryParse(Console.ReadLine(), out zahl))
            {
                //Console.WriteLine("Eingabe erforgreich");
                return zahl;
                
            }
            else
            {
                //Console.WriteLine("Eingabefehler");
                //return "falsch";
                y = true;
    
            }
            
        }
    while (y = true);


}


Bzw. kann ich das mit der Schleife so lösen?
Leider gefällt dem Compiler das nicht so ganz :(
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: Do 28.10.10 09:21 
du musst nach der Schleife auch noch einen Rückgabewert einbauen. Der Compiler erkennt nich, dass die Schleife wiederholt wird, bis ein gültiger Rückgabewert vorhanden ist.
Alternativ könntest du eine "Endlosschleife" bauen, indem du y rauswirfst und nur auf true abfragst (was dann ja immer true is :P). in diesem Fall wäre die "Endlosschleife" kein Problem, da das Programm bei return aus der Methode zurückspringt, also aus der "Endlosschleife" raus. Ob der Compiler das erkennt, müsstest du auspropieren.

Für diesen Beitrag haben gedankt: sheroco
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Do 28.10.10 09:33 
Hi,

also, wenn Du der Methode eh schon einen int-Wert übergibst, was soll die Methode dann überhaupt noch machen??
Ich dachte, sie soll versuchen, einen string in einen int zu konvertieren!?

Würde das ganze so schreiben:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
private static int ZahlEinlesen()
{
   int zahl = 0;
   while (!int.TryParse(Console.ReadLine(), out zahl))
      Console.WriteLine("Ungültige Eingabe! Bitte wiederholen!");
   return zahl;
}
Bloss mal so an Denkanstoß.

LG, Marko

Für diesen Beitrag haben gedankt: sheroco
sheroco
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 28.10.10 10:02 
ah, irgendwie denk ich viel zu kompliziert :(
das heißt also in deinem fall, falls er nicht parsen kann (!int.TryParse) dann gibt er die Meldung aus und beginnt wegen der while-Schleife von vorne...
ansonst gibt er halt mit return die zahl zurück?

hoffe ich hab das so richtig verstanden...
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 28.10.10 22:15 
user profile iconsheroco hat folgendes geschrieben Zum zitierten Posting springen:
hoffe ich hab das so richtig verstanden...

Stimmt genau, das macht der Code von user profile iconTrashkid2000 :zustimm:



user profile iconsheroco hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
 
12:
/* ... */
    public static int ZahlEinlesen(int zahl);

Zwischen den Klammern einer Funktionsdeklaration stehen immer die Parameter, die der Funktion übergeben werden. Sie müssen vom Aufrufer festgelegt und von der Methode selbst ausgelesen werden. zahl ist in deinem Fall aber kein Eingabeparameter, weil er ja dem Aufrufer zuerst nicht bekannt ist. Er soll ja von der Methode ermittelt werden, indem der Benutzer zu einer Eingabe aufgefordert wird. Das heißt, der Wert muss zurückgegeben werden. Man könnte ihn auch als einen Ausgabeparameter bezeichnen.