diff --git a/Qualifier/src/ParkhausSystem.java b/Qualifier/src/ParkhausSystem.java new file mode 100644 index 0000000..6f9598b --- /dev/null +++ b/Qualifier/src/ParkhausSystem.java @@ -0,0 +1,229 @@ + + import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Random; +import java.util.Scanner; + +public class ParkhausSystem { + private String[] kennzeichenArray; // Array zur Speicherung der Kennzeichen + private Date[] parkzeitArray; // Array zur Speicherung der Parkzeiten + private int maxPlatz = 180; // Maximale Anzahl der Parkplätze + private int aktuellerPlatz = 0; // Aktuell belegte Plätze + private HashMap schuldenMap; // Map zur Speicherung der Schulden + + Scanner scanner = new Scanner(System.in); + SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); //Z.101 + + public static void main(String[] args) { + ParkhausSystem parkhausSystem = new ParkhausSystem(); // objekt erstellung + parkhausSystem.showMenu(); + } + + public ParkhausSystem() { + kennzeichenArray = new String[maxPlatz]; // Array für Kennzeichen + parkzeitArray = new Date[maxPlatz]; // Array für Parkzeiten + schuldenMap = new HashMap<>(); // die Map für Schulden + } + + public void showMenu() { //Benutzeroberfläche + while (true) { + System.out.println("Hauptmenü:"); + System.out.println("1. Einfahrt"); + System.out.println("2. Ausfahrt"); + System.out.println("3. Zahlung"); + System.out.println("4. Beenden"); + System.out.println("Aktuell verfügbare Plätze: " + (maxPlatz - aktuellerPlatz)); + System.out.print("Bitte Auswahl treffen: "); + int auswahl = scanner.nextInt(); + scanner.nextLine(); // Zeilenumbruch konsumieren + + switch (auswahl) { // Auswahl des benutzers an die switch-Anwesoung übergeben + case 1: + einfahrt(); + break; + + case 2: + ausfahrt(); + break; + + case 3: + zahlung(); + break; + + case 4: + System.out.println("Programm beendet."); + return; // Beende die Methode und somit das Programm + + default: + System.out.println("Ungültige Auswahl."); + } + } + } + + public void einfahrt() { + if (aktuellerPlatz < maxPlatz) { + System.out.println("Bitte geben Sie Ihr Kennzeichen ein (oder leer lassen für zufällig generiert):"); + String kennzeichen = scanner.nextLine().toUpperCase().trim(); // toUpperCase - Konvertierung der Eing in Großbuch. unabhängig vom bennutzer + // trim - um versehentlich eingegebene Leerzeichen zu entfernen und so sicherzustellen, dass nur der eigentliche Inhalt der Benutzereingabe verarbeitet wird + + // Zufälliges Kennzeichen generieren, wenn Benutzer kein Kennzeichen eingibt + if (kennzeichen.isEmpty()) { // Prüft, ob die Eingabe des Kennzeichens leer ist + kennzeichen = generiereKennzeichen(); + + } else { + // Validierung des Kennzeichens + if (!istKennzeichenGueltig(kennzeichen)) { //Methode überprüft, ob das Kennzeichen dem geforderten Format entspricht. + System.out.println("Ungültiges Kennzeichen. Bitte überprüfen Sie das Format."); + return; + } + } + + // Überprüfen, ob das Fahrzeug Schulden hat + + + if (schuldenMap.containsKey(kennzeichen)) { //prüft, ob das Fahrzeugkennzeichen in der schuldenMap vorhanden + System.out.println("Achtung: Das Fahrzeug mit Kennzeichen " + kennzeichen + " hat noch offene Schulden in Höhe von " + + schuldenMap.get(kennzeichen) + " Euro. Diese werden zur neuen Rechnung hinzugefügt."); + } + + // Aktueller Zeitstempel + System.out.print( + "Bitte geben Sie die Parkzeit ein (Format: dd.MM.yyyy, HH:mm) oder leer lassen für aktuelle Zeit: "); + String zeitEingabe = scanner.nextLine(); + //Überprüfung der Eingabe + + Date parkzeit; //parkzeit als Date objekt festgelegt + try { + if (zeitEingabe.isEmpty()) { + parkzeit = new Date(); // setzt die Parkzeit des Fahrzeugs auf den aktuellen Zeitstempel, + } else { + parkzeit = sdf.parse(zeitEingabe); //Wenn der Benutzer eine gültige Zeit im richtigen Format eingegeben hat, wird die Eingabe mithilfe von SimpleDateFormat.parse()Z.17 in ein Date-Objekt umgewandelt. + } + } catch (ParseException e) { // stellt sicher, dass das Programm nicht abstürzt, wenn ein Fehler beim Parsen(String in ein Datum Date) eines Datums auftritt. + System.out.println("Ungültiges Zeitformat. Verwenden Sie das Format dd.MM.yyyy, HH:mm."); + return; //Prozess wird abgebrochen + } + + // Speichere das Kennzeichen und die Parkzeit im Array + kennzeichenArray[aktuellerPlatz] = kennzeichen; + parkzeitArray[aktuellerPlatz] = parkzeit; + aktuellerPlatz++; // Erhöhe den belegten Platz + System.out.println( + "Fahrzeug mit Kennzeichen " + kennzeichen + " eingeparkt um " + sdf.format(parkzeit) + "."); + } else { + System.out.println("Das Parkhaus ist voll."); + } + } + + public void ausfahrt() { + System.out.print("Bitte geben Sie das Kennzeichen zur Ausfahrt ein: "); + String kennzeichen = scanner.nextLine().toUpperCase().trim(); + + // Suche das Kennzeichen im Array + for (int i = 0; i < aktuellerPlatz; i++) { + if (kennzeichenArray[i] != null && kennzeichenArray[i].equals(kennzeichen)) { + // Berechnung der Parkdauer + Date parkzeit = parkzeitArray[i]; + Date ausfahrtszeit = new Date(); // Aktuelle Zeit + long secDiff = (ausfahrtszeit.getTime() - parkzeit.getTime()) / 1000; // Zeitdifferenz in Sekunden + long stunden = secDiff / 3600; + System.out.println("Fahrzeug mit Kennzeichen " + kennzeichen + " hat das Parkhaus verlassen."); + System.out.println("Parkdauer: " + stunden + " Stunden."); + + double gebuehren = berechneGebuehren(parkzeit, ausfahrtszeit); + System.out.println("Die Parkgebühren betragen: " + gebuehren + " Euro."); + + // Prüfen, ob die Zahlung erfolgt ist + if (!schuldenMap.containsKey(kennzeichen)) { + System.out.println("Das Fahrzeug hat nicht bezahlt. Schulden werden gespeichert."); + schuldenMap.put(kennzeichen, gebuehren); + } else { + System.out.println("Das Fahrzeug hat offene Schulden von " + schuldenMap.get(kennzeichen) + " Euro."); + } + + // Wenn das Kennzeichen gefunden wird, setze den Platz auf null + kennzeichenArray[i] = null; + parkzeitArray[i] = null; // Setze die Parkzeit auf null + aktuellerPlatz--; // Optional: Reduziere den aktuellen Platz um 1 + return; + } + } + System.out.println("Fahrzeug mit Kennzeichen " + kennzeichen + " nicht gefunden."); + } + + public void zahlung() { + System.out.print("Bitte geben Sie das Kennzeichen zur Zahlung ein: "); + String kennzeichen = scanner.nextLine().toUpperCase().trim(); + + // Suche das Kennzeichen im Array + for (int i = 0; i < aktuellerPlatz; i++) { + if (kennzeichenArray[i] != null && kennzeichenArray[i].equals(kennzeichen)) { + // Berechne die Gebühren + Date parkzeit = parkzeitArray[i]; + Date ausfahrtszeit = new Date(); // Aktuelle Zeit als Ausfahrtszeit + double gebuehren = berechneGebuehren(parkzeit, ausfahrtszeit); + + // Hinzufügen der vorherigen Schulden zur neuen Gebühr, falls vorhanden + if (schuldenMap.containsKey(kennzeichen)) { + double offeneSchulden = schuldenMap.get(kennzeichen); + System.out.println("Offene Schulden von " + offeneSchulden + " Euro werden zur Gebühr hinzugefügt."); + gebuehren += offeneSchulden; + schuldenMap.remove(kennzeichen); // Schulden löschen, da sie bezahlt werden + } + + System.out.printf("Das Fahrzeug mit Kennzeichen %s hat %,.2f Euro zu zahlen.%n", kennzeichen, gebuehren); + + // Abfrage, ob es sich um ein E-Auto handelt + System.out.print("Ist das Fahrzeug ein E-Auto? (ja/nein): "); + String istEAuto = scanner.nextLine().trim().toLowerCase(); + boolean eAuto = istEAuto.equals("ja"); + + // Rabatt für E-Auto anwenden + if (eAuto) { + gebuehren *= 0.8; // 20 % Rabatt + System.out.printf("20%% Rabatt für E-Autos angewendet. Neue Gebühr: %,.2f Euro.%n", gebuehren); + } + + // Hier Kreditkartenzahlung verarbeiten + if (kreditkartenZahlung(gebuehren)) { + System.out.println("Zahlung erfolgreich. Vielen Dank!"); + } else { + System.out.println("Zahlung fehlgeschlagen. Bitte versuchen Sie es erneut."); + } + + return; // Zahlung bearbeitet, frühzeitig zurückkehren + } + } + System.out.println("Fahrzeug mit Kennzeichen " + kennzeichen + " nicht gefunden."); + } + + public boolean kreditkartenZahlung(double betrag) { + // Hier kann die Implementierung der Kreditkarten-Zahlung erfolgen + System.out.printf("Bitte bezahlen Sie %,.2f Euro mit Ihrer Kreditkarte.%n", betrag); + return true; // Simuliere eine erfolgreiche Zahlung + } + + public double berechneGebuehren(Date parkzeit, Date ausfahrtszeit) { + long diffInHours = (ausfahrtszeit.getTime() - parkzeit.getTime()) / (1000 * 60 * 60); + double gebuehren = diffInHours * 2.0; // Beispiel: 2 Euro pro Stunde + return gebuehren; + } + + // Einfache Methode zur Generierung eines zufälligen Kennzeichens + public String generiereKennzeichen() { + String[] buchstaben = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"}; + Random rand = new Random(); + String kennzeichen = buchstaben[rand.nextInt(buchstaben.length)] + + buchstaben[rand.nextInt(buchstaben.length)] + + buchstaben[rand.nextInt(buchstaben.length)] + "-" + + (rand.nextInt(900) + 100); // Zahl zwischen 100 und 999 + return kennzeichen; + } + + // Einfache Methode zur Validierung eines Kennzeichens (Format: AAA-123) + public boolean istKennzeichenGueltig(String kennzeichen) { + return kennzeichen.matches( "[A-Z]{2,3}-[A-Z]{2,3} \\d{3,4}(E)?"); + } +}