Benutzer mit den meisten Antworten
Aus einem catch-block an eine bestimmte Stelle im Programm springen?

Frage
-
Hallo! Ich schreibe gerade zur Übung ein Programm mit einem dreidimensionalen Array, welches die Sitzplätze eines Kinos mit 3 Sälen reserviert. Der Saal stellt hier die 3.Dimension dar.
Meine Frage bezieht sich hier auf das Abfangen einer ungültigen Eingabe der Sitzreihe, Sitzplatz- und Saalnummer mit einem try-catch-Block. Wird eine Exception abgefangen, möchte ich hier zurück auf den Anfang meiner do-while-Schleife springen. Ich habe das mit einem goto Sprungbefehl gelöst. Nur goto soll man ja nicht verwenden soweit ich weiß?
Da ich noch Anfänger bin möchte ich fragen ob es da nicht eine bessere Variante gibt?
Hier der Code:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication_kino { class Program { static void Main(string[] args) { int reihen = 10, platz = 15, saal = 3; int sitzreihe=0, sitzplatz=0, saalnummer=0; /* Erstmalige initialisierung des Arrays mit 0 */ int[, ,] mycinema = new int[reihen, platz, saal]; // Ein Array mit 3 Dimensionen for (int i = 0; i < saal; i++) // 3.) zum Schluß der Saal { for (int j = 0; j < reihen; j++) // 2.) dann die Sitzreihen { for (int k = 0; k < platz; k++) // 1.) Zuerst die Platznummer { mycinema[j, k, i] = 0; // Alle Sitzplätze mit 0 initialisieren } } } start: do { /* Ausgabe des Arrays */ for (int i = 0; i < saal; i++) // 3.) zum Schluß der Saal { for (int j = 0; j < reihen; j++) // 2.) dann die Sitzreihen { for (int k = 0; k < platz; k++) // 1.) Zuerst die Platznummer { Console.Write(" " + mycinema[j, k, i]); } Console.Write("\n"); // Zeilenumbruch bei Beginn einer neuen Sitzreihe } Console.Write("\n"); // Zeilenumbruch bei Beginn eines neuen Saales } Console.WriteLine("Reservieren Sie Ihren Sitzplatz!"); Console.WriteLine("================================"); Console.Write("Geben Sie die Saalnummer ein: "); try { saalnummer = Convert.ToInt32(Console.ReadLine()); } catch (Exception ex) { Console.WriteLine("Fehlerhafte Eingabe!"); Console.ReadLine(); Console.Clear(); goto start; } try { Console.Write("Geben Sie die Sitzreihe ein: "); sitzreihe = Convert.ToInt32(Console.ReadLine()); } catch (Exception ex) { Console.WriteLine("Fehlerhafte Eingabe!"); Console.ReadLine(); Console.Clear(); goto start; } try { Console.Write("Geben Sie den Sitzplatz ein: "); sitzplatz = Convert.ToInt32(Console.ReadLine()); } catch (Exception ex) { Console.WriteLine("Fehlerhafte Eingabe!"); Console.ReadLine(); Console.Clear(); goto start; } if ((sitzreihe >= reihen) || (sitzplatz >= platz) || (saalnummer >= saal)) // Prüfe auf fehlerhafte Eingabe { Console.WriteLine("Fehlerhafte Eingabe!"); Console.ReadLine(); Console.Clear(); } else if (mycinema[sitzreihe, sitzplatz, saalnummer] == 1) // Sitzplatz bereits vergeben { Console.Write("\nDieser Sitzplatz ist bereits vergeben! "); Console.ReadLine(); Console.Clear(); } else { mycinema[sitzreihe, sitzplatz, saalnummer] = 1; // Sitzplatz zuweisen Console.Clear(); } } while (true); // Endlosschleife ! } } }
- Bearbeitet Tom Lambert (Koopakiller)Moderator Dienstag, 2. September 2014 14:30 Code als Codeblock formatiert
Antworten
-
Hallo,
das einfachste wäre in deinem Fall eine Methode zu schreiben, die die Benutzereingabe entgegen nimmt. Auf diese Weiße kannst du die Eingabe als Dauerschlaife machen, bis ein gültiger Wert eingegeben wird.static int GetNumber(string message){ Console.WriteLine(message); var ln = Console.ReadLine();//Zeile einlesen int result; if(int.TryParse(ln, out result)){//Eingabe korrekt? return result;//Wert zurück geben } Console.WriteLine("Fehlerhafte Eingabe!"); return GetNumber(message); //Fehlerhafte Eingabe, Funktion rekursiv aufrufen }
Auf diesde Weiße kannst du dir den ganzen redundanten Code mit den try...catch-Blöcken sparen.
Des weiteren solltest du die Methode noch weiter aufspalten, damit es etwas übersichtlicher wird.
Außerdem musst du prüfen ob die eingegebenen Werte auch innerhalb des Arrays liegen. Dort kannst du u.A. einen try-Block verwenden, oder besser mit mycinema.GetLength(DIMENSION) die Größe einer Dimension abfragen und vergleichen. Deine Schleife kannst du dann mit der continue-Anweisung zum nächsten Schleifendurchgang springen lassen. Sprich direkt zum do-Block.
PS: Baue noch eine Möglichkeit ein das Programm zu beenden.
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Freitag, 26. September 2014 20:49
- Als Antwort markiert Tom Lambert (Koopakiller)Moderator Montag, 20. Oktober 2014 14:37