package QualifierTeil2; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class Parkhaus { private List parkendePkws; int kapazitaet; int belegt; public Parkhaus() { this.parkendePkws = new ArrayList<>(); this.kapazitaet = randomAnzahlParkplätze(); this.belegt = 0; } public List getParkendePkws() { return parkendePkws; } public static int randomAnzahlParkplätze() { return (int) (Math.random() * 200) + 1; } // Methode zum Einfahren eines PKWs public void einfahren(PKW pkw) { if (parkendePkws.size() < kapazitaet) { parkendePkws.add(pkw); this.kapazitaet--; this.belegt++; System.out.println("PKW mit Kennzeichen " + pkw.getKennzeichen() + " ist eingefahren."); } else { System.out.println("Parkhaus voll."); } } // Methode zum Prüfen, ob das Parkhaus voll ist public boolean istVoll() { return parkendePkws.size() >= kapazitaet; } // Methode zum Ausfahren eines PKWs anhand des Kennzeichens public void ausfahren(String kennzeichen) { PKW zuEntfernen = null; for (PKW pkw : parkendePkws) { if (pkw.getKennzeichen().equals(kennzeichen)) { zuEntfernen = pkw; break; } } if (zuEntfernen != null) { // Berechnung der Gebühren double gebuehren = berechneGebuehren(kennzeichen, new Date()); // Nimmt die aktuelle Zeit an if (gebuehren > 0) { // Kreditkartenvalidierung vor Ausfahrt Scanner scanner = new Scanner(System.in); System.out.println("Bitte geben Sie Ihre 16-stellige VISA-Kreditkartennummer ein:"); String kreditkartenNummer = scanner.nextLine(); if (pruefeKreditkarte(kreditkartenNummer)) { System.out.println("Zahlung erfolgreich. Sie dürfen ausfahren."); zuEntfernen.setGebuehrenkonto(0); // Gebühren auf 0 setzen parkendePkws.remove(zuEntfernen); this.kapazitaet++; this.belegt--; System.out.println("Gebührenkonto: " + zuEntfernen.getGebuehrenkonto()); System.out.println("PKW mit Kennzeichen " + kennzeichen + " hat die Gebühren bezahlt und darf rausfahren.\n"); } else { System.out.println("Ungültige Kreditkartennummer. Zahlung fehlgeschlagen. Ausfahrt verweigert."); zuEntfernen.setGebuehrenkonto(gebuehren); System.out.println("Gebührenkonto: " + zuEntfernen.getGebuehrenkonto()); System.out.println(" "); } } else { // Gebührenfrei (unter 15 Minuten oder andere Ausnahme) parkendePkws.remove(zuEntfernen); this.kapazitaet++; this.belegt--; System.out.println("PKW mit Kennzeichen " + kennzeichen + " darf gebührenfrei ausfahren."); } } else { System.out.println("Kein PKW mit diesem Kennzeichen gefunden."); } } public long berechneParkdauer(String kennzeichen, Date ausfahrt) { //long minDiff = 0; /*for (PKW pkw : parkendePkws) { if (pkw.getKennzeichen().equals(kennzeichen) && !pkw.hatBezahlt()) { minDiff = (ausfahrt.getTime() - pkw.einfahrt.getTime()) / 60000; } } return minDiff;*/ //Debugging mit selbst ausgewählten Zeiten var sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); Date d1 = null; try { d1 = sdf.parse("01.10.2024, 10:00"); } catch (ParseException e) { throw new RuntimeException(e); } Date d2 = null; try { d2 = sdf.parse("01.10.2024, 11:00"); } catch (ParseException e) { throw new RuntimeException(e); } long minDiff = (d2.getTime() - d1.getTime()) / 60000; return minDiff; } public double berechneGebuehren(String kennzeichen, Date ausfahrt) { long parkdauer = berechneParkdauer(kennzeichen, ausfahrt); double gebuehr = 0; // Falls die Parkdauer 15 Minuten oder weniger beträgt, ist das Parken kostenlos if (parkdauer <= 15) { parkdauer = 0; gebuehr = 0; } // Parkdauer nach den 15 Minuten long parkdauerOhneFreiminuten = parkdauer - 15; // Tageslimit: Maximal 15 Euro pro Tag if (parkdauerOhneFreiminuten == 1440) { gebuehr = 1500; parkdauerOhneFreiminuten = 0; } // 1 Euro pro angefangene Stunde if (parkdauerOhneFreiminuten > 0 && parkdauerOhneFreiminuten < 1440) { while (parkdauerOhneFreiminuten > 0) { gebuehr += 100; parkdauerOhneFreiminuten -= 60; } } // Prüfe, ob es sich um ein E-Auto handelt (Kennzeichen endet mit "E") if (kennzeichen.endsWith("E")) { gebuehr *= 0.8; // 20% Rabatt für E-Autos } return gebuehr; } // Methode zur Überprüfung der Kreditkartennummer mit dem Luhn-Algorithmus public boolean pruefeKreditkarte(String kreditkartenNummer) { if (kreditkartenNummer.length() != 16 || !kreditkartenNummer.startsWith("4")) { return false; // Ungültige Karte } int sum = 0; boolean alternate = false; for (int i = kreditkartenNummer.length() - 1; i >= 0; i--) { int n = Integer.parseInt(kreditkartenNummer.substring(i, i + 1)); if (alternate) { n *= 2; if (n > 9) { n = (n % 10) + 1; } } sum += n; alternate = !alternate; } return (sum % 10 == 0); } }