From 9376a096e0e615a26226912e667229e4ebd4938e Mon Sep 17 00:00:00 2001 From: ioana Date: Sun, 6 Oct 2024 12:32:13 +0200 Subject: [PATCH] Verbesserungen + Kommentare --- QualifierTeil2/Main.java | 1 + QualifierTeil2/PKW.java | 4 +- QualifierTeil2/Parkhaus.java | 79 +++++++++++++++++++++--------------- QualifierTeil2/UI.java | 31 ++++++++++---- 4 files changed, 70 insertions(+), 45 deletions(-) diff --git a/QualifierTeil2/Main.java b/QualifierTeil2/Main.java index 0ad74dd..c4a4e78 100644 --- a/QualifierTeil2/Main.java +++ b/QualifierTeil2/Main.java @@ -46,6 +46,7 @@ public class Main { case 5: System.out.println("Programm beendet."); + scanner.close(); return; default: diff --git a/QualifierTeil2/PKW.java b/QualifierTeil2/PKW.java index e97d9dd..9fa51f5 100644 --- a/QualifierTeil2/PKW.java +++ b/QualifierTeil2/PKW.java @@ -9,6 +9,7 @@ public class PKW { private Date einfahrt; double gebuehrenkonto; + public PKW(String kennzeichen) { this.kennzeichen = kennzeichen; this.einfahrt = new Date(); @@ -19,9 +20,6 @@ public class PKW { return kennzeichen; } - public void setKennzeichen(String kennzeichen) { - this.kennzeichen = kennzeichen; - } public Date getEinfahrt() { return einfahrt; diff --git a/QualifierTeil2/Parkhaus.java b/QualifierTeil2/Parkhaus.java index 446f7a2..f339287 100644 --- a/QualifierTeil2/Parkhaus.java +++ b/QualifierTeil2/Parkhaus.java @@ -1,46 +1,43 @@ package QualifierTeil2; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.*; public class Parkhaus { private List parkendePkws; - int kapazitaet; + int kapazitaetVerfuegbar; int belegt; + int maxKapazitaet; public Parkhaus() { this.parkendePkws = new ArrayList<>(); - this.kapazitaet = randomAnzahlParkplätze(); + this.maxKapazitaet = randomAnzahlParkplätze(); + this.kapazitaetVerfuegbar = maxKapazitaet; this.belegt = 0; } - public List getParkendePkws() { - return parkendePkws; - } // Methode zum Einfahren eines PKWs public void einfahren(String kennzeichen) { PKW existierenderPKW = null; - // Überprüfen, ob das Auto mit demselben Kennzeichen bereits existiert (Schulden hat) + // Überprüfen, ob das Auto mit demselben Kennzeichen bereits existiert for (PKW pkw : parkendePkws) { if (pkw.getKennzeichen().equals(kennzeichen)) { existierenderPKW = pkw; break; } } + + // Falls angegebenen PKW sich schon im Parkhaus befindet oder schonmal da war und Schulden hat if (existierenderPKW != null) { - System.out.println("Der PKW mit dem Kennzeichen " + kennzeichen + " hat noch Schulden von " + existierenderPKW.getGebuehrenkonto() + " Cent."); - this.kapazitaet--; - this.belegt++; + System.out.println("Der PKW mit dem Kennzeichen " + kennzeichen + " hat noch Schulden in Höhe von " + existierenderPKW.getGebuehrenkonto() + " Cent."); } else { // Neuen PKW erstellen und Schulden übernehmen, falls vorhanden PKW neuerPKW = new PKW(kennzeichen); double schulden = sucheSchulden(kennzeichen); // Funktion, die die alten Schulden findet (falls vorhanden) neuerPKW.setGebuehrenkonto(schulden); // Vorherige Schulden hinzufügen parkendePkws.add(neuerPKW); - this.kapazitaet--; + this.kapazitaetVerfuegbar--; this.belegt++; System.out.println("Neuer PKW mit Kennzeichen " + kennzeichen + " eingefahren. Schulden: " + schulden + " Cent."); } @@ -51,7 +48,9 @@ public class Parkhaus { // Methode zum Ausfahren eines PKWs anhand des Kennzeichens public void ausfahren(String kennzeichen) { - PKW zuEntfernen = null; + PKW zuEntfernen = null; //PKW, der rausfahren will + + // Überprüfen, ob das Auto mit demselben Kennzeichen bereits existiert und setze das als zuEntfernen for (PKW pkw : parkendePkws) { if (pkw.getKennzeichen().equals(kennzeichen)) { zuEntfernen = pkw; @@ -59,6 +58,7 @@ public class Parkhaus { } } + // Falls Auto zum Entfernen gibt if (zuEntfernen != null) { // Berechnung der Gebühren double gebuehren = berechneGebuehren(kennzeichen, new Date()); // Nimmt die aktuelle Zeit an @@ -66,9 +66,10 @@ public class Parkhaus { // Gebührenkonto aktualisieren zuEntfernen.setGebuehrenkonto(gebuehren); // Schulden für unbezahlte Gebühren hinzufügen + // Falls Gebühren vorhanden sind if (gebuehren > 0) { - Date ausfahrt = new Date(); + Date ausfahrt = new Date(); //aktuelle Zeit für Ausfahrt System.out.println("Parkdauer in Minuten: " + berechneParkdauer(kennzeichen, ausfahrt)); System.out.println("Parkgebühren in Cent: " + zuEntfernen.getGebuehrenkonto()); @@ -96,9 +97,8 @@ public class Parkhaus { System.out.println("PKW mit Kennzeichen " + kennzeichen + " darf gebührenfrei ausfahren."); } - // PKW aus der Liste entfernen und Kapazität aktualisieren - //parkendePkws.remove(zuEntfernen); - this.kapazitaet++; + // PKW aus der Liste nicht entfernen und Kapazität aktualisieren + this.kapazitaetVerfuegbar++; this.belegt--; System.out.println("PKW mit Kennzeichen " + kennzeichen + " hat die Ausfahrt durchgeführt.\n"); @@ -111,6 +111,7 @@ public class Parkhaus { public long berechneParkdauer(String kennzeichen, Date ausfahrt) { long minDiff = 0; + // Berechnung der parkdauer des PKWs anhand des Kennzeichens for (PKW pkw : parkendePkws) { if (pkw.getKennzeichen().equals(kennzeichen)) { minDiff = (ausfahrt.getTime() - pkw.getEinfahrt().getTime()) / 60000; @@ -119,21 +120,18 @@ public class Parkhaus { return minDiff; //Debugging mit selbst ausgewählten Zeiten - /*var sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); - Date d1 = null; + /*SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); + Date einfahrtszeit = null; try { - d1 = sdf.parse("01.10.2024, 20:00"); + // Beispiel für manuelle Eingabe, kann angepasst werden + einfahrtszeit = sdf.parse("01.10.2024, 20:00"); + ausfahrt = sdf.parse("02.10.2024, 02:00"); } catch (ParseException e) { throw new RuntimeException(e); } - Date d2 = null; - try { - d2 = sdf.parse("02.10.2024, 02:00"); - } catch (ParseException e) { - throw new RuntimeException(e); - } - long minDiff = (d2.getTime() - d1.getTime()) / 60000; + + minDiff = (ausfahrt.getTime() - einfahrtszeit.getTime()) / 60000; return minDiff;*/ } @@ -180,6 +178,8 @@ public class Parkhaus { if (kreditkartenNummer.length() != 16 || !kreditkartenNummer.startsWith("4")) { return false; // Ungültige Karte } + + //Luhn-Algorithmus int sum = 0; boolean alternate = false; for (int i = kreditkartenNummer.length() - 1; i >= 0; i--) { @@ -198,13 +198,14 @@ public class Parkhaus { //-------------------------------Hilfsmethoden------------------------------------------- + // Methode zum Generieren einer zufälligen Zahl für die Anzahl der Parkplätze private static int randomAnzahlParkplätze() { return (int) (Math.random() * 200) + 1; } - + // Methode zum Durchsuchen der Liste nach alten Schulden private double sucheSchulden(String kennzeichen) { - // Durchsuche die Liste nach alten Schulden + // Beispiel: Wenn der PKW schon einmal ausgefahren ist, seine Schulden zurückgeben for (PKW pkw : parkendePkws) { if (pkw.getKennzeichen().equals(kennzeichen)) { @@ -217,15 +218,27 @@ public class Parkhaus { // Methode zum Prüfen, ob das Parkhaus voll ist public boolean istVoll() { - return parkendePkws.size() >= kapazitaet; + return parkendePkws.size() >= this.maxKapazitaet; } + // Methode zur Berechnung der Sonderregel für in der Nacht von 20 Uhr bis 6 Uhr private double berechneNachttarif(String kennzeichen, double gebuehr, Date ausfahrt) { Calendar cal = Calendar.getInstance(); cal.setTime(ausfahrt); + //Debugging + /*SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); + Date einfahrtszeit = null; + try { + // Beispiel für manuelle Eingabe, kann angepasst werden + einfahrtszeit = sdf.parse("01.10.2024, 20:00"); + ausfahrt = sdf.parse("02.10.2024, 02:00"); + } catch (ParseException e) { + throw new RuntimeException(e); + }*/ + // Bestimme die Einfahrtszeit des Fahrzeugs - Date einfahrt = findeEinfahrtZeit(kennzeichen); // Methode zum Finden der Einfahrtszeit + Date einfahrt = findeEinfahrtZeit(kennzeichen); // =einfahrt für Debugging // Methode zum Finden der Einfahrtszeit Calendar einfahrtsCal = Calendar.getInstance(); einfahrtsCal.setTime(einfahrt); @@ -242,10 +255,10 @@ public class Parkhaus { // Erhöhe die Zeit um eine Stunde, um jede Stunde zu prüfen einfahrtsCal.add(Calendar.HOUR_OF_DAY, 1); } - return gebuehr; } + // Methode zum Finden der Einfahrtszeit des PKWs nach Kennzeichen private Date findeEinfahrtZeit(String kennzeichen) { for (PKW pkw : parkendePkws) { if (pkw.getKennzeichen().equals(kennzeichen)) { @@ -256,7 +269,7 @@ public class Parkhaus { } - + // Methode zum Generieren eines zufälligen Kennzeichens public String generiereKennzeichen() { Random random = new Random(); diff --git a/QualifierTeil2/UI.java b/QualifierTeil2/UI.java index 2663a8b..860183d 100644 --- a/QualifierTeil2/UI.java +++ b/QualifierTeil2/UI.java @@ -12,6 +12,13 @@ public class UI { // Methode für die Einfahrt eines PKWs public void einfahrtPKW() { + // Überprüfen, ob das Parkhaus voll ist + if (parkhaus1.istVoll()) { + System.out.println("Das Parkhaus ist voll. Keine weiteren Einfahrten möglich."); + return; // Methode beenden, wenn keine Parkplätze mehr verfügbar sind + } + + // Eingabe von Kennzeichen; wenn leer, Kennzeichen wird automatisch generiert System.out.println("Bitte geben Sie das Kennzeichen ein (leer lassen, um ein Kennzeichen zu generieren):"); String kennzeichen = scan.nextLine(); if (kennzeichen.isEmpty()) { @@ -19,10 +26,14 @@ public class UI { System.out.println("Generiertes Kennzeichen: " + kennzeichen); } - System.out.println("Aktuell verfügbare Parkplätze: " + parkhaus1.kapazitaet); - parkhaus1.einfahren(kennzeichen); - System.out.println("weitere verfügbare Parkplätze: " + parkhaus1.kapazitaet); + System.out.println("Aktuell verfügbare Parkplätze: " + parkhaus1.kapazitaetVerfuegbar); + // Methodenaufruf vom Parkhaus für die Einfahrt + parkhaus1.einfahren(kennzeichen); + + System.out.println("weitere verfügbare Parkplätze: " + parkhaus1.kapazitaetVerfuegbar); + + // Ausgabe aktuelle Zeit als Einfahrtszeit var einfahrt = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); System.out.println("Einfahrt: " + einfahrt.format(new Date())); @@ -33,36 +44,38 @@ public class UI { // Methode für die Einfahrt von mehreren PKWs public void mehrereEinfahrten() { - while (true) { if (parkhaus1.istVoll()) { System.out.println("Das Parkhaus ist voll. Keine weiteren Einfahrten möglich."); break; } + // PKW einfahren + einfahrtPKW(); + + // Frage, ob der Benutzer weitere PKWs einfahren lassen möchte System.out.println("Möchten Sie einen weiteren PKW einfahren lassen? (j/n)"); String weiter = scan.nextLine(); + + // Wenn der Benutzer "n" eingibt, wird die Schleife beendet if (!weiter.equalsIgnoreCase("j")) { break; } - - // PKW einfahren - einfahrtPKW(); } } // Methode zum Anzeigen der verfügbaren Plätze public void zeigeVerfügbarePlätze() { - System.out.println("Verfügbare Plätze: " + parkhaus1.kapazitaet); + System.out.println("Verfügbare Plätze: " + parkhaus1.kapazitaetVerfuegbar); System.out.println(" "); } // Methode für die Ausfahrt und Bezahlung public void ausfahrtPKW() { - System.out.println("Geben Sie das Kennzeichen des ausfahrenden PKWs ein: "); String kennzeichen = scan.nextLine().toUpperCase(); + //Methodenaufruf vom Parkhaus für die Ausfahrt parkhaus1.ausfahren(kennzeichen);