import java.time.LocalDateTime; import java.time.Duration; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Scanner; import java.util.regex.Pattern; import java.util.regex.Matcher; public class Main { static int aktuelleAutoAnzahl = 0; // Zählt die aktuelle Anzahl der Autos im Parkhaus static final int MAX_PLATZANZAHL = 180; // Maximale Anzahl an Plätzen im Parkhaus static ArrayList fahrzeugListe = new ArrayList<>(); // Liste der Fahrzeuge im Parkhaus static ArrayList fahrzeugSchulden = new ArrayList<>(); // Liste der Fahrzeuge mit Schulden public static void Parkhaus(String[] args) { Scanner scanner = new Scanner(System.in); String kennzeichenRegex = "^[A-ZÄÖÜ]{1,3}-[A-Z]{1,2} \\d{1,4}E?$"; // Regex für deutsches Kennzeichen mit optionalem 'E' Pattern kennzeichenPattern = Pattern.compile(kennzeichenRegex); String kreditkartenRegex = "^\\d{16}$"; // Regex für eine 16-stellige Kreditkartennummer Pattern kreditkartenPattern = Pattern.compile(kreditkartenRegex); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); System.out.println("Willkommen im Parkhaus!"); while (true) { System.out.println("\nWählen Sie eine Option:"); System.out.println("1: Einfahrt"); System.out.println("2: Ausfahrt"); System.out.println("3: Liste der geparkten Fahrzeuge"); System.out.println("4: Programm beenden"); String auswahl = scanner.nextLine(); switch (auswahl) { case "1": if (aktuelleAutoAnzahl < MAX_PLATZANZAHL) { LocalDateTime einfahrzeit = LocalDateTime.now(); // Standardmäßig aktuelle Zeit System.out.println("Geben Sie das Kennzeichen des Autos ein (z.B. MA-SH 4077):"); String kennzeichen = scanner.nextLine(); Matcher kennzeichenMatcher = kennzeichenPattern.matcher(kennzeichen); if (!kennzeichenMatcher.matches()) { System.out.println("Ungültiges Kennzeichenformat. Bitte versuchen Sie es erneut."); break; } // Schuldenprüfung boolean hatSchulden = fahrzeugSchulden.stream().anyMatch(p -> p.kennzeichen.equals(kennzeichen)); if (hatSchulden) { System.out.println("Achtung: Dieses Fahrzeug hat noch unbezahlte Schulden."); } Pkw neuesAuto = new Pkw(kennzeichen, einfahrzeit); fahrzeugListe.add(neuesAuto); aktuelleAutoAnzahl++; System.out.println("Fahrzeug erfolgreich eingetragen."); } else { System.out.println("Das Parkhaus ist voll. Einfahrt nicht möglich."); } break; case "2": System.out.println("Geben Sie Ihr Kennzeichen ein:"); String kennzeichenAus = scanner.nextLine(); Pkw gefundenesAuto = null; for (Pkw auto : fahrzeugListe) { if (auto.kennzeichen.equals(kennzeichenAus)) { gefundenesAuto = auto; break; } } if (gefundenesAuto != null) { System.out.println("Geben Sie das aktuelle Datum und die Uhrzeit ein (dd.MM.yyyy HH:mm), oder drücken Sie Enter für die aktuelle Zeit:"); String ausfahrzeitInput = scanner.nextLine(); LocalDateTime ausfahrzeit = ausfahrzeitInput.isEmpty() ? LocalDateTime.now() : LocalDateTime.parse(ausfahrzeitInput, formatter); float parkgebuehren = berechneParkgebuehren(gefundenesAuto.einfahrzeit, ausfahrzeit, gefundenesAuto.kennzeichen); System.out.println("Die Parkgebühren betragen: " + parkgebuehren + " Euro"); System.out.println("Bitte geben Sie Ihre 16-stellige Kreditkartennummer zur Bezahlung ein:"); String kreditkartennummer = scanner.nextLine(); Matcher kreditkartenMatcher = kreditkartenPattern.matcher(kreditkartennummer); if (kreditkartenMatcher.matches() && validierePruefziffer(kreditkartennummer)) { System.out.println("Bezahlung erfolgreich. Vielen Dank!"); fahrzeugListe.remove(gefundenesAuto); aktuelleAutoAnzahl--; } else { System.out.println("Ungültige Kreditkartennummer. Das Fahrzeug kann ohne Bezahlung ausfahren."); fahrzeugListe.remove(gefundenesAuto); fahrzeugSchulden.add(gefundenesAuto); // Fahrzeug mit Schulden markieren aktuelleAutoAnzahl--; } } else { System.out.println("Fahrzeug nicht im Parkhaus gefunden."); } break; case "3": System.out.println("Aktuell geparkte Fahrzeuge:"); for (Pkw auto : fahrzeugListe) { System.out.println("Kennzeichen: " + auto.kennzeichen + ", Eingefahren am: " + auto.einfahrzeit.format(formatter)); } break; case "4": System.out.println("Programm wird beendet. Auf Wiedersehen!"); scanner.close(); return; default: System.out.println("Ungültige Auswahl. Bitte versuchen Sie es erneut."); } } } // Methode zur Berechnung der Parkgebühren static float berechneParkgebuehren(LocalDateTime einfahrzeit, LocalDateTime ausfahrzeit, String kennzeichen) { Duration parkdauer = Duration.between(einfahrzeit, ausfahrzeit); long minuten = parkdauer.toMinutes(); // Berechnung der Gebühren if (minuten <= 15) { return 0; // Erste 15 Minuten sind kostenlos } boolean istNachttarif = einfahrzeit.getHour() >= 20 || ausfahrzeit.getHour() < 6; if (istNachttarif) { return 5; // Nachttarif maximal 5 Euro } long stunden = (minuten - 15) / 60 + 1; // Jede angefangene Stunde kostet 1 Euro float kosten = Math.min(stunden, 15); // Maximal 15 Euro pro Tag if (kennzeichen.endsWith("E")) { kosten *= 0.8; // 20% Rabatt für E-Autos } return kosten; } // Validierung der Prüfziffer für eine 16-stellige Kreditkartennummer (Luhn-Algorithmus) static boolean validierePruefziffer(String kartennummer) { int summe = 0; boolean verdoppeln = false; for (int i = kartennummer.length() - 1; i >= 0; i--) { int ziffer = Character.getNumericValue(kartennummer.charAt(i)); if (verdoppeln) { ziffer *= 2; if (ziffer > 9) { ziffer -= 9; } } summe += ziffer; verdoppeln = !verdoppeln; } return (summe % 10) == 0; } } // Pkw Klasse zur Speicherung von Kennzeichen und Einfahrzeit class Pkw { String kennzeichen; LocalDateTime einfahrzeit; Pkw(String kennzeichen, LocalDateTime einfahrzeit) { this.kennzeichen = kennzeichen; this.einfahrzeit = einfahrzeit; } }