using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace Übungen_LF6_WinFormanwendung { class Saal { //Member //Saalgröße ist auf 10 Reihen mit je 30 Sitzplätzen limitiert um Implementierung und Darstellung einfach zu halten //Nummer der Reihe : Programm wird auf 10 Reihen limitiert 0 - 9 d.h. 0XX - 9XX für die Platznummern public string nameSaal { get; set; } public int reihe { get; private set; } public int spalte { get; private set; } public int maxReihen { get; set; } public int maxSpalten { get; set; } //Array der Sitzplätze [Anzahl Reihen, Anzahl Sitze pro Reihe] || True = Belegt, False = verfügbar private bool[,] sitzPlatz; //Array der Markierten Sitzplätze private bool[,] markierteSitzplätze; //Basis Konstruktor: wird nur genutzt für Objekterstellung public Saal(){ } //Kopierkonstruktor public Saal(Saal newSaal) { //kopieren der Feldwerte des eingegebenen Saals nameSaal = newSaal.nameSaal; reihe = newSaal.reihe; spalte = newSaal.spalte; maxReihen = newSaal.maxReihen; maxSpalten = newSaal.maxSpalten; //Kopieren der Sitz-Belegung sitzPlatz = new bool[maxReihen + 1, maxSpalten + 1]; for (int reihe = 1; reihe <= maxReihen; reihe++) { for (int spalte = 1; spalte <= maxSpalten; spalte++) { sitzPlatz[reihe, spalte] = newSaal.sitzPlatz[reihe, spalte]; } } //Initialisieren des Markiererarrays markierteSitzplätze = new bool[maxReihen + 1, maxSpalten + 1]; for (int reihe = 1; reihe < maxReihen; reihe++) { for (int spalte = 1; spalte < maxSpalten; spalte++) { markierteSitzplätze[reihe, spalte] = false; } } } //Spezifischer Konstruktor für Initialisierung von Standart Saal: wird angenommen mit 2 Reihen und 30 Sitzen je Reihe public Saal(out int ErrorCode, string SaalName, int MaxReihen = 2, int MaxSpalten = 30 ) { //Saalname bestimmen - Name muss eindeutig sein weil dieser für Speicherung genutzt wird -> bereits vorhandener Name führt zu überschreibung vorhandener Daten!!! nameSaal = SaalName; //Füllen der Saalgröße maxReihen = MaxReihen; maxSpalten = MaxSpalten; //Initialisierung ErrorCode = 0; //Fehler falls zu viele oder zu wenige Reihen if (MaxReihen > 9 || MaxReihen < 1) { ErrorCode = 1; } else //Fehler falls zu viele oder zu wenige Sitze if (MaxSpalten > 30 || MaxSpalten < 1) { ErrorCode = 2; } //initialisierung des Saals wenn eingabe in Ordnung war if (ErrorCode == 0) { sitzPlatz = new bool[MaxReihen + 1, MaxSpalten + 1]; for (int i_reihen = 1; i_reihen < sitzPlatz.GetLength(0); i_reihen++) { for (int i_sitze = 1; i_sitze < sitzPlatz.GetLength(1); i_sitze++) { sitzPlatz[i_reihen, i_sitze] = false; } } } } //Methoden //überprüfung Platzbelegeung public bool istFrei(int Reihe, int Spalte) { //Rückgabe des Wertes True wenn sitzplatz "leer" (false) ist if (!sitzPlatz[Reihe, Spalte]) return true; else return false; } //Überprüfung Markierung public bool istMarkiert(int Reihe, int Spalte) { if (markierteSitzplätze[Reihe,Spalte]) return true; else return false; } //Berechnung der Platznummer zur Darstellung für den User bei "Buchungsbeleg" public int berechnePlatzNr(int Reihe, int Spalte) { int nr = 0; switch(Reihe) { case 0: nr = 000; break; case 1: nr = 100; break; case 2: nr = 200; break; case 3: nr = 300; break; case 4: nr = 400; break; case 5: nr = 500; break; case 6: nr = 600; break; case 7: nr = 700; break; case 8: nr = 800; break; case 9: nr = 900; break; } nr += Spalte; return nr; } //Buchungsmethode zum belegen eines Platzes (Platzwert erhält true) //aktuell gibt es keine "Entbuchungsmethode" d.h. gebuchte Plätze werden nie wieder befreit //Mögliche Lösungen:- Seperates Programm dass die gespeicherte Datei (an der Stelle der gespeicherten Sitzbelegung) anpasst // - "Buchung aufheben" funktion um buchungen rückgängig zu machen (Hier stellt sich die Frage soll // das so einfach von jedem x-beliebigen User möglich sein public void buchen(out int ErrorCode, int Reihe, int Spalte) { ErrorCode = 0; if (istFrei(Reihe,Spalte)) { sitzPlatz[Reihe, Spalte] = true; } else { ErrorCode = 3; } } //Markiere oder Entferne Markierung an Sitzplätze für User-Ansicht public void markiereSitz (int Reihe, int Spalte) { if (markierteSitzplätze[Reihe, Spalte]) markierteSitzplätze[Reihe, Spalte] = false; else markierteSitzplätze[Reihe, Spalte] = true; } //Speichern des Saals als .txt Datei (Aktuell wird der Standart-Pfad (Projektordner\bin\Debug\) gewählt) public void speichernSaal (out int ErrorCode) { ErrorCode = 0; try { //Daten werden anhand des Saalnamens gespeichert -> gleicher Saalname führt zu Überschreiben der alten Saaldaten TextWriter tw = new StreamWriter(nameSaal + ".txt"); // Schreibe Datei mit Feldern tw.WriteLine(nameSaal); tw.WriteLine(reihe); tw.WriteLine(spalte); tw.WriteLine(maxReihen); tw.WriteLine(maxSpalten); //Schreiben der Sitzplatzbelegung for (int reihe = 1; reihe <= maxReihen ; reihe++) { for (int spalte = 1; spalte <= maxSpalten ; spalte++) { tw.WriteLine(sitzPlatz[reihe, spalte]); } } // close the stream tw.Close(); //Consolenausgabe für erfolgreiches Speichern ErrorCode = 9; Console.WriteLine("Speichern Erfolgreich"); } catch (Exception e) { //Meldeausgabe dass Speichern nicht erfolgreich war ErrorCode = 8; Console.WriteLine("Fehler: {0}", e.ToString()); } } //Ladefunktion des Saals mittels Namen public void ladeSaal (out int ErrorCode, string SaalName) { //Fehlercode falls Ladenfehlschlägt ErrorCode = 0; try { //Saal wird anhand von Namen geladen if (File.Exists(SaalName + ".txt")) { //Dateileseroutine TextReader tr = new StreamReader(SaalName + ".txt"); // Name des Saals nameSaal = tr.ReadLine(); // Zeilen des Textes lesen um Variablen zu füllen string reiheString = tr.ReadLine(); string spalteString = tr.ReadLine(); string maxReiheString = tr.ReadLine(); string maxSpalteString = tr.ReadLine(); //Konvertiere geladene Strings zu Int-Werten reihe = Convert.ToInt32(reiheString); spalte = Convert.ToInt32(spalteString); maxReihen = Convert.ToInt32(maxReiheString); maxSpalten = Convert.ToInt32(maxSpalteString); //Lade sitzPlatzbelegung aus TextDokument string[,] temp_sitzPlatzText = new string[maxReihen + 1, maxSpalten + 1]; for (int reihe = 1; reihe <= maxReihen ; reihe++) { for (int spalte = 1; spalte <= maxSpalten ; spalte++) { temp_sitzPlatzText[reihe, spalte] = tr.ReadLine(); } } //Konvertieren des String-Arrays mit Sitzplatzbelegung in Bool werte sitzPlatz = new bool[maxReihen + 1 , maxSpalten + 1]; for (int reihe = 1; reihe <= maxReihen ; reihe++) { for (int spalte = 1; spalte <= maxSpalten ; spalte++) { sitzPlatz[reihe,spalte] = Convert.ToBoolean(temp_sitzPlatzText[reihe, spalte]); } } // close the stream tr.Close(); //Meldeausgabe dass Laden erfolgreich war ErrorCode = 6; Console.WriteLine("Laden Erfolgreich"); } else { //Meldeausgabe dass Laden wegen nicht vorhandenen Saalnamen fehlgeschlagen ist ErrorCode = 7; Console.WriteLine("Laden Fehlgeschlagen - Saal nicht gefunden"); } } catch (Exception e) { //Meldeausgabe dass Laden nicht erfolgreich war ErrorCode = 5; Console.WriteLine("Fehler: {0}", e.ToString()); } } } }