You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

280 lines
11 KiB
C#

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());
}
}
}
}