import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Parkhaus { // Variablen deklarieren static Scanner scanner = new Scanner(System.in); static double Gebuehren = 0; static Map geparkteAutos = new HashMap<>(); static int maximalePlaetze = 180; static String kennzeichenEingabe; public static void parkgebuehrenBerechnen(Date d1, Date d2, String kennzeichenEingabe) { if (d1.getTime() > d2.getTime()) { System.out.println("Die Ausfahrtszeit kann nicht vor der Einfahrtszeit liegen!"); return; } // Sekunden zwischen Einfahrtszeit und Ausfahrtszeit berechnen long secDiff = (d2.getTime() - d1.getTime()) / 1000; // Sekunden in Minuten umrechnen long minuten = secDiff / 60; // ersten 15 Minuten kostenfrei if (minuten <= 15) { System.out.println("Die Parkgebühr ist kostenlos :)"); System.out.println(); return; } // Ersten 15 Minuten kostenlos minuten -= 15; // Minuten in Stunden umrechnen // +59 damit angefangene Stunden auch zählen, d.h 61 Minuten = 2 Stunden long gesamtStunden = (minuten + 59) / 60; // calEin = Einfahrtszeit // getInstance setzt das Calendar Objekt auf die aktuelle Zeit Calendar calEinfahrtsZeit = Calendar.getInstance(); calEinfahrtsZeit.setTime(d1); // calAus = Ausfahrtszeit Calendar calAusfahrtsZeit = Calendar.getInstance(); calAusfahrtsZeit.setTime(d2); // Gebühren deklarieren double gebuehrenTag = 0; double gebuehrenNacht = 0; // Berechnung der Gebühren solange Einfahrszeit vor der Ausfahrtszeit liegt while (calEinfahrtsZeit.before(calAusfahrtsZeit) || calEinfahrtsZeit.equals(calAusfahrtsZeit)) { // aktuelleStunde ist gleich die Stunde der Einfahrtszeit int aktuelleStunde = calEinfahrtsZeit.get(Calendar.HOUR_OF_DAY); // Gebühren für die aktuelle Stunde berechnen (20:00-06:00) if (aktuelleStunde >= 20 || aktuelleStunde < 6) { // Nachtgebühren gebuehrenNacht += 1; } else { // Taggebühren gebuehrenTag += 1; } // Wenn die aktuelle Stunde 6:00 ist, dann Tag abschließen if (aktuelleStunde == 6) { // Maximal 5 Euro für Nachtgebühren if (gebuehrenNacht > 5) { gebuehrenNacht = 5; } // Maximal 15 Euro für Taggebühren if (gebuehrenTag > 15) { gebuehrenTag = 15; } // Gesamtgebühren für diesen Tag hinzufügen Gebuehren += gebuehrenTag + gebuehrenNacht; // Gebühren zurücksetzen für den nächsten Tag gebuehrenTag = 0; gebuehrenNacht = 0; } // Zur nächsten Stunde der Einfahrt (solange bis Einfahrtszeit größer // Ausfahrtszeit ist) calEinfahrtsZeit.add(Calendar.HOUR_OF_DAY, 1); } // Nach der Schleife die Gebühren für den letzten Tag berechnen if (gebuehrenNacht > 5) { gebuehrenNacht = 5; // Maximal 5 Euro für Nachtgebühren } if (gebuehrenTag > 15) { gebuehrenTag = 15; // Maximal 15 Euro für Taggebühren } // Letzte Gebühren hinzufügen Gebuehren += gebuehrenTag + gebuehrenNacht; // Wenn E-Auto, dann 20% Rabatt if (kennzeichenEingabe.endsWith("E")) { Gebuehren *= 0.8; } // Ausgabe der Parkgebühr System.out.println(); System.out.printf("Die Parkgebühr beträgt: %.2f Euro.", Gebuehren); System.out.println(); } public static void einfahrtParkhaus() throws ParseException { // Prüfen ob Parkhaus voll if (geparkteAutos.size() >= maximalePlaetze) { System.out.println("Tut uns Leid, das Parkhaus ist leider voll :"); return; } System.out.print("Geben Sie das Kennzeichen ein: "); String kennzeichenEingabe = scanner.nextLine(); // Falls Kennzeichen eingegeben, dann Wert in FahrzeugInfo speichern if (geparkteAutos.containsKey(kennzeichenEingabe)) { FahrzeugInfo info = geparkteAutos.get(kennzeichenEingabe); if (info.schulden > 0) { System.out.println("Dieses Auto hat noch Schulden von " + info.schulden + " Euros!"); } } System.out.print("Geben Sie ihre Einfahrtszeit ein (im Format: dd.MM.yyyy, HH:mm): "); String einfahrtZeit = scanner.nextLine(); // SimpleDateFormat um einen gewünschten String zu parsen SimpleDateFormat zeit = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); // Falls keine Eingabe, dann wird aktuelle Zeit genommen if (einfahrtZeit.isEmpty()) { einfahrtZeit = zeit.format(new Date()); } // String in Date parsen Date d1 = zeit.parse(einfahrtZeit); // alle relevanten Infos, in das Auto Objekt speichern geparkteAutos.put(kennzeichenEingabe, new FahrzeugInfo(d1, false, 0)); System.out.println("Einfahrtszeits des Autos: " + d1); System.out.println(); } public static void Zahlung() throws ParseException { System.out.println(); System.out.print("Bitte geben Sie das Kennzeichen ein: "); String kennzeichenEingabe = scanner.nextLine(); // prüfen ob Kennzeichen, im Parkhaus existiert if (!(geparkteAutos.containsKey(kennzeichenEingabe))) { System.out.println("Das Kennzeichen existiert leider nicht in unserem Parkhaus."); return; } // Informationen des gesuchten Autos FahrzeugInfo info = geparkteAutos.get(kennzeichenEingabe); System.out.print("Bitte geben Sie ihre Ausfahrtszeit ein: "); String ausfahrtZeit = scanner.nextLine(); // Klasse die es ermöglicht Datum oder Zeit in ein Date Format zu parsen SimpleDateFormat zeit = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); if (ausfahrtZeit.isEmpty()) { // new Date = aktuelle Zeit ausfahrtZeit = zeit.format(new Date()); } Date d2 = zeit.parse(ausfahrtZeit); // Parkgebühren berechnen mit den Informationen des FahrzeugObjekts parkgebuehrenBerechnen(info.d1, d2, kennzeichenEingabe); if (Gebuehren == 0) { return; } System.out.printf("Bitte zahlen Sie den Betrag von %.2f Euro.", Gebuehren); System.out.println(); System.out.print("Geben Sie ihre Kreditkartennummer ein: "); String VISA = scanner.nextLine(); // Prüfen ob Zahlung gültig ist if (zahlungsÜberprüfung(VISA) == true) { System.out.println("Zahlung hat funktioniert"); System.out.println(); info.hatBezahlt = true; } // Falls Zahlung fehlgeschlagen, Schulden addieren else { System.out.println("Zahlung hat nicht funktioniert"); System.out.println(); info.schulden += Gebuehren; } } public static void ausfahrtParkhaus() throws ParseException { System.out.println(); System.out.print("Bitte geben Sie das Kennzeichen ein: "); String kennzeichenEingabe = scanner.nextLine(); // prüfen ob Kennzeichen existiert if (!geparkteAutos.containsKey(kennzeichenEingabe)) { System.out.println("Das Kennzeichen existiert nicht in unserem Parkhaus."); return; } // Informationen des gesuchten Autos FahrzeugInfo info = geparkteAutos.get(kennzeichenEingabe); System.out.print("Bitte geben Sie ihre Ausfahrtszeit ein (im Format: dd.MM.yyyy, HH:mm): "); String ausfahrtZeit = scanner.nextLine(); // definiert wie Datum und Uhrzeit dargestellt werden SimpleDateFormat zeit = new SimpleDateFormat("dd.MM.yyyy, HH:mm"); if (ausfahrtZeit.isEmpty()) { ausfahrtZeit = zeit.format(new Date()); } // Prüfen ob Auto gezahlt hat if (!info.hatBezahlt) { System.out.println("Achtung: Das Fahrzeug hat nicht bezahlt und fährt nun aus."); } else { System.out.println("Das Fahrzeug hat bereits bezahlt."); } // Fahrzeug aus der Liste der geparkten Autos entfernen, auch ohne Zahlung geparkteAutos.remove(kennzeichenEingabe); System.out.println("Fahrzeug mit Kennzeichen " + kennzeichenEingabe + " hat das Parkhaus am " + ausfahrtZeit + " verlassen."); System.out.println(); } public static boolean zahlungsÜberprüfung(String VISA) { // Variablen deklarieren int zähler = VISA.length(); int summe = 0; // 15,14,13,12,11... rückwärts der Kreditkartennummer entlang for (int i = zähler - 1; i >= 0; i--) { // gibt jedes 2te vorletzte zurück int n = Integer.parseInt(VISA.substring(i, i + 1)); // jede zweite Ziffer von rechts wird verdoppelt if ((zähler - i) % 2 == 0) { // Ziffer wird verdoppelt n *= 2; // Falls Ziffer größer als 9, wird Ziffer -9 gerechnet if (n > 9) { n -= 9; } } summe += n; } // Prüfen ob durch 10 teilbar, eine der Hauptbedingungen return (summe % 10 == 0); } public static void ParkhausVerwaltung(FahrzeugInfo Info) { System.out.println("Verfügbare Plätze im Parkhaus: " + (maximalePlaetze - geparkteAutos.size())); System.out.println("Aktuelle Kennzeichen im Parkhaus: "); // keySet gibt ein Set der Schlüssel(Kennzeichen) zurück for (String Autos : geparkteAutos.keySet()) { System.out.println(Autos); } System.out.println(); } public static void main(String[] args) throws ParseException { while (true) { System.out.println("1. Einfahrt ins Parkhaus"); System.out.println("2. Zahlung der Parkgebühren"); System.out.println("3. Ausfahrt"); System.out.println("4. Parkhaus Verwaltung"); System.out.println("5. Verlassen"); int auswahl = scanner.nextInt(); scanner.nextLine(); switch (auswahl) { case 1: einfahrtParkhaus(); break; case 2: Zahlung(); break; case 3: ausfahrtParkhaus(); break; case 4: ParkhausVerwaltung(null); break; case 5: System.exit(0); } } } }