Autor |
Beitrag |
Ogrus
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 18.10.10 08:27
Hallo und  !
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:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| int value; if (int.TryParse(eingabeString, out value)) { } else { } |
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
|
Verfasst: 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.
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 Kha: Code- durch C#-Tags ersetzt
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
|
Verfasst: 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?
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)) { return zahl; } else { 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
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: 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  ). 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
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: 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:
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
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 28.10.10 22:15
sheroco hat folgendes geschrieben : | hoffe ich hab das so richtig verstanden... |
Stimmt genau, das macht der Code von Trashkid2000
sheroco hat folgendes geschrieben : | 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.
|
|