diff --git a/Parkhaus.java b/Parkhaus.java new file mode 100644 index 0000000..fb57447 --- /dev/null +++ b/Parkhaus.java @@ -0,0 +1,177 @@ +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; + } +}