331 lines
9.1 KiB
Plaintext
331 lines
9.1 KiB
Plaintext
|
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 ParkhausLogik {
|
||
|
|
||
|
// Variablen deklarieren
|
||
|
private static Scanner scanner = new Scanner(System.in);
|
||
|
private static double Gebuehren = 0;
|
||
|
private static Map<String, FahrzeugInfo> geparkteAutos = new HashMap<>();
|
||
|
private 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();
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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());
|
||
|
}
|
||
|
|
||
|
Date d2 = zeit.parse(ausfahrtZeit);
|
||
|
|
||
|
parkgebuehrenBerechnen(info.d1, d2, kennzeichenEingabe);
|
||
|
|
||
|
// Prüfen ob Auto gezahlt hat
|
||
|
if (!info.hatBezahlt) {
|
||
|
System.out.println("Achtung: Das Fahrzeug hat nicht bezahlt und fährt nun aus.");
|
||
|
info.schulden += Gebuehren;
|
||
|
|
||
|
} else {
|
||
|
System.out.println("Das Fahrzeug hat bereits bezahlt.");
|
||
|
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) {
|
||
|
|
||
|
// Länge der Kreditkartennummer
|
||
|
int zähler = VISA.length();
|
||
|
int summe = 0;
|
||
|
|
||
|
// Prüfziffer (letzte Ziffer) extrahieren
|
||
|
int pruefziffer = Integer.parseInt(VISA.substring(zähler - 1));
|
||
|
|
||
|
// Iteration über die zweitletzte Ziffer, ohne die Prüfziffer
|
||
|
for (int i = zähler - 2; i >= 0; i--) {
|
||
|
|
||
|
// Holen der Ziffer
|
||
|
int n = Integer.parseInt(VISA.substring(i, i + 1));
|
||
|
|
||
|
// nur jede zweite Ziffer
|
||
|
if ((zähler - i) % 2 == 0) {
|
||
|
n *= 2;
|
||
|
|
||
|
// Wenn das Ergebnis größer als 9 ist, subtrahiere 9
|
||
|
if (n > 9) {
|
||
|
n -= 9;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Zur Summe addieren
|
||
|
summe += n;
|
||
|
}
|
||
|
|
||
|
// Berechnung des erwarteten Prüfziffernwerts
|
||
|
int berechneterRest = summe % 10;
|
||
|
|
||
|
int berechnetePruefziffer;
|
||
|
|
||
|
// Prüfziffer herausfinden
|
||
|
if (berechneterRest == 0) {
|
||
|
|
||
|
// Wenn der Rest 0 ist, ist die Prüfziffer 0
|
||
|
berechnetePruefziffer = 0;
|
||
|
} else {
|
||
|
berechnetePruefziffer = 10 - berechneterRest; // Andernfalls ist es 10 minus dem Rest
|
||
|
}
|
||
|
|
||
|
// Prüfen, ob die berechnete Prüfziffer der letzten Ziffer entspricht
|
||
|
return pruefziffer == berechnetePruefziffer;
|
||
|
}
|
||
|
|
||
|
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();
|
||
|
|
||
|
}
|
||
|
}
|