diff --git a/Main.java b/Main.java new file mode 100644 index 0000000..6c09c1f --- /dev/null +++ b/Main.java @@ -0,0 +1,81 @@ +import java.util.Scanner; +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import java.time.LocalDateTime; + +public class Main { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + Parkhaus parkhaus = new Parkhaus(); + 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); + + 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": + 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; + } + + boolean erfolgreich = parkhaus.einfahrt(kennzeichen); + if (erfolgreich) { + 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(); + float parkgebuehren = parkhaus.ausfahrt(kennzeichenAus); + + if (parkgebuehren == -1) { + System.out.println("Fahrzeug nicht im Parkhaus gefunden."); + } else { + 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(); + + if (Zahlungsabwicklung.validiereKreditkarte(kreditkartennummer)) { + System.out.println("Bezahlung erfolgreich. Vielen Dank!"); + } else { + System.out.println("Ungültige Kreditkartennummer. Fahrzeug wird als schuldig markiert."); + parkhaus.addFahrzeugMitSchulden(new Pkw(kennzeichenAus, LocalDateTime.now())); // Fahrzeug mit Schulden markieren + } + } + break; + + case "3": + System.out.println("Aktuell geparkte Fahrzeuge:"); + for (Pkw auto : parkhaus.getFahrzeugListe()) { + System.out.println("Kennzeichen: " + auto.getKennzeichen() + ", Eingefahren am: " + auto.getEinfahrzeit()); + } + 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."); + } + } + } +} diff --git a/ParkgebuehrenBerechnung.java b/ParkgebuehrenBerechnung.java new file mode 100644 index 0000000..5fe00a0 --- /dev/null +++ b/ParkgebuehrenBerechnung.java @@ -0,0 +1,25 @@ +import java.time.Duration; +import java.time.LocalDateTime; + +class ParkgebuehrenBerechnung { + + // Methode zur Berechnung der Parkgebühren + public static float berechneGebuehren(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 + } + + 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; + } +} diff --git a/Parkhaus.java b/Parkhaus.java index fb57447..78d1297 100644 --- a/Parkhaus.java +++ b/Parkhaus.java @@ -1,177 +1,53 @@ -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; +import java.time.LocalDateTime; -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 +class Parkhaus { + private int aktuelleAutoAnzahl = 0; // Zählt die aktuelle Anzahl der Autos im Parkhaus + private static final int MAX_PLATZANZAHL = 180; // Maximale Anzahl an Plätzen im Parkhaus + private ArrayList fahrzeugListe = new ArrayList<>(); // Liste der Fahrzeuge im Parkhaus + private 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); + // Fahrzeug einfahren + public boolean einfahrt(String kennzeichen) { + if (aktuelleAutoAnzahl < MAX_PLATZANZAHL) { + Pkw neuesAuto = new Pkw(kennzeichen, LocalDateTime.now()); + fahrzeugListe.add(neuesAuto); + aktuelleAutoAnzahl++; + return true; // Erfolgreich eingetragen + } else { + return false; // Parkhaus voll + } + } - 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."); + // Fahrzeug ausfahren + public float ausfahrt(String kennzeichen) { + for (Pkw auto : fahrzeugListe) { + if (auto.getKennzeichen().equals(kennzeichen)) { + float parkgebuehren = ParkgebuehrenBerechnung.berechneGebuehren(auto.getEinfahrzeit(), LocalDateTime.now(), auto.getKennzeichen()); + fahrzeugListe.remove(auto); + aktuelleAutoAnzahl--; + return parkgebuehren; // Gebühren zurückgeben } } + return -1; // Fahrzeug nicht gefunden } - // 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; + // Aktuelle Anzahl der Fahrzeuge + public int getAktuelleAutoAnzahl() { + return aktuelleAutoAnzahl; } - // Validierung der Prüfziffer für eine 16-stellige Kreditkartennummer (Luhn-Algorithmus) - static boolean validierePruefziffer(String kartennummer) { - int summe = 0; - boolean verdoppeln = false; + // Liste der geparkten Fahrzeuge + public ArrayList getFahrzeugListe() { + return fahrzeugListe; + } - for (int i = kartennummer.length() - 1; i >= 0; i--) { - int ziffer = Character.getNumericValue(kartennummer.charAt(i)); + // Schuldenverwaltung + public void addFahrzeugMitSchulden(Pkw auto) { + fahrzeugSchulden.add(auto); + } - 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; + public ArrayList getFahrzeugSchulden() { + return fahrzeugSchulden; } } diff --git a/Pkw.java b/Pkw.java new file mode 100644 index 0000000..0240afb --- /dev/null +++ b/Pkw.java @@ -0,0 +1,20 @@ +import java.time.LocalDateTime; + +// Pkw-Klasse zur Speicherung von Kennzeichen und Einfahrzeit +class Pkw { + private String kennzeichen; + private LocalDateTime einfahrzeit; + + public Pkw(String kennzeichen, LocalDateTime einfahrzeit) { + this.kennzeichen = kennzeichen; + this.einfahrzeit = einfahrzeit; + } + + public String getKennzeichen() { + return kennzeichen; + } + + public LocalDateTime getEinfahrzeit() { + return einfahrzeit; + } +} diff --git a/Zahlungsabwicklung.java b/Zahlungsabwicklung.java new file mode 100644 index 0000000..33d79ab --- /dev/null +++ b/Zahlungsabwicklung.java @@ -0,0 +1,35 @@ +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +class Zahlungsabwicklung { + private static final String KREDITKARTEN_REGEX = "^\\d{16}$"; // Regex für eine 16-stellige Kreditkartennummer + private static final Pattern KREDITKARTEN_PATTERN = Pattern.compile(KREDITKARTEN_REGEX); + + // Kreditkartenvalidierung + public static boolean validiereKreditkarte(String kreditkartennummer) { + Matcher matcher = KREDITKARTEN_PATTERN.matcher(kreditkartennummer); + return matcher.matches() && validierePruefziffer(kreditkartennummer); + } + + // Validierung der Prüfziffer für eine 16-stellige Kreditkartennummer (Luhn-Algorithmus) + private 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; + } +}