188 lines
6.0 KiB
Java
188 lines
6.0 KiB
Java
package QualifierTeil2;
|
|
|
|
import java.text.ParseException;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.*;
|
|
|
|
public class Parkhaus {
|
|
private List<PKW> parkendePkws;
|
|
int kapazitaet;
|
|
int belegt;
|
|
|
|
public Parkhaus() {
|
|
this.parkendePkws = new ArrayList<>();
|
|
this.kapazitaet = randomAnzahlParkplätze();
|
|
this.belegt = 0;
|
|
}
|
|
|
|
public List<PKW> getParkendePkws() {
|
|
return parkendePkws;
|
|
}
|
|
|
|
public static int randomAnzahlParkplätze() {
|
|
return (int) (Math.random() * 200) + 1;
|
|
}
|
|
|
|
// Methode zum Einfahren eines PKWs
|
|
public void einfahren(PKW pkw) {
|
|
if (parkendePkws.size() < kapazitaet) {
|
|
parkendePkws.add(pkw);
|
|
this.kapazitaet--;
|
|
this.belegt++;
|
|
System.out.println("PKW mit Kennzeichen " + pkw.getKennzeichen() + " ist eingefahren.");
|
|
} else {
|
|
System.out.println("Parkhaus voll.");
|
|
}
|
|
}
|
|
|
|
|
|
// Methode zum Prüfen, ob das Parkhaus voll ist
|
|
public boolean istVoll() {
|
|
return parkendePkws.size() >= kapazitaet;
|
|
}
|
|
|
|
|
|
// Methode zum Ausfahren eines PKWs anhand des Kennzeichens
|
|
public void ausfahren(String kennzeichen) {
|
|
PKW zuEntfernen = null;
|
|
for (PKW pkw : parkendePkws) {
|
|
if (pkw.getKennzeichen().equals(kennzeichen)) {
|
|
zuEntfernen = pkw;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (zuEntfernen != null) {
|
|
// Berechnung der Gebühren
|
|
double gebuehren = berechneGebuehren(kennzeichen, new Date()); // Nimmt die aktuelle Zeit an
|
|
|
|
if (gebuehren > 0) {
|
|
// Kreditkartenvalidierung vor Ausfahrt
|
|
Scanner scanner = new Scanner(System.in);
|
|
System.out.println("Bitte geben Sie Ihre 16-stellige VISA-Kreditkartennummer ein:");
|
|
String kreditkartenNummer = scanner.nextLine();
|
|
|
|
if (pruefeKreditkarte(kreditkartenNummer)) {
|
|
System.out.println("Zahlung erfolgreich. Sie dürfen ausfahren.");
|
|
zuEntfernen.setGebuehrenkonto(0); // Gebühren auf 0 setzen
|
|
parkendePkws.remove(zuEntfernen);
|
|
this.kapazitaet++;
|
|
this.belegt--;
|
|
System.out.println("Gebührenkonto: " + zuEntfernen.getGebuehrenkonto());
|
|
System.out.println("PKW mit Kennzeichen " + kennzeichen + " hat die Gebühren bezahlt und darf rausfahren.\n");
|
|
} else {
|
|
System.out.println("Ungültige Kreditkartennummer. Zahlung fehlgeschlagen. Ausfahrt verweigert.");
|
|
zuEntfernen.setGebuehrenkonto(gebuehren);
|
|
System.out.println("Gebührenkonto: " + zuEntfernen.getGebuehrenkonto());
|
|
System.out.println(" ");
|
|
}
|
|
} else {
|
|
// Gebührenfrei (unter 15 Minuten oder andere Ausnahme)
|
|
parkendePkws.remove(zuEntfernen);
|
|
this.kapazitaet++;
|
|
this.belegt--;
|
|
System.out.println("PKW mit Kennzeichen " + kennzeichen + " darf gebührenfrei ausfahren.");
|
|
}
|
|
} else {
|
|
System.out.println("Kein PKW mit diesem Kennzeichen gefunden.");
|
|
}
|
|
}
|
|
|
|
|
|
public long berechneParkdauer(String kennzeichen, Date ausfahrt) {
|
|
//long minDiff = 0;
|
|
|
|
/*for (PKW pkw : parkendePkws) {
|
|
if (pkw.getKennzeichen().equals(kennzeichen) && !pkw.hatBezahlt()) {
|
|
minDiff = (ausfahrt.getTime() - pkw.einfahrt.getTime()) / 60000;
|
|
}
|
|
}
|
|
return minDiff;*/
|
|
|
|
//Debugging mit selbst ausgewählten Zeiten
|
|
var sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
|
|
|
|
Date d1 = null;
|
|
try {
|
|
d1 = sdf.parse("01.10.2024, 10:00");
|
|
} catch (ParseException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
Date d2 = null;
|
|
try {
|
|
d2 = sdf.parse("01.10.2024, 11:00");
|
|
} catch (ParseException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
|
|
long minDiff = (d2.getTime() - d1.getTime()) / 60000;
|
|
|
|
return minDiff;
|
|
}
|
|
|
|
public double berechneGebuehren(String kennzeichen, Date ausfahrt) {
|
|
long parkdauer = berechneParkdauer(kennzeichen, ausfahrt);
|
|
double gebuehr = 0;
|
|
|
|
// Falls die Parkdauer 15 Minuten oder weniger beträgt, ist das Parken kostenlos
|
|
if (parkdauer <= 15) {
|
|
parkdauer = 0;
|
|
gebuehr = 0;
|
|
|
|
}
|
|
|
|
// Parkdauer nach den 15 Minuten
|
|
long parkdauerOhneFreiminuten = parkdauer - 15;
|
|
|
|
// Tageslimit: Maximal 15 Euro pro Tag
|
|
if (parkdauerOhneFreiminuten == 1440) {
|
|
gebuehr = 1500;
|
|
parkdauerOhneFreiminuten = 0;
|
|
|
|
}
|
|
|
|
// 1 Euro pro angefangene Stunde
|
|
if (parkdauerOhneFreiminuten > 0 && parkdauerOhneFreiminuten < 1440) {
|
|
while (parkdauerOhneFreiminuten > 0) {
|
|
gebuehr += 100;
|
|
parkdauerOhneFreiminuten -= 60;
|
|
}
|
|
}
|
|
|
|
|
|
// Prüfe, ob es sich um ein E-Auto handelt (Kennzeichen endet mit "E")
|
|
if (kennzeichen.endsWith("E")) {
|
|
gebuehr *= 0.8; // 20% Rabatt für E-Autos
|
|
}
|
|
|
|
return gebuehr;
|
|
|
|
}
|
|
|
|
// Methode zur Überprüfung der Kreditkartennummer mit dem Luhn-Algorithmus
|
|
public boolean pruefeKreditkarte(String kreditkartenNummer) {
|
|
if (kreditkartenNummer.length() != 16 || !kreditkartenNummer.startsWith("4")) {
|
|
return false; // Ungültige Karte
|
|
}
|
|
|
|
int sum = 0;
|
|
boolean alternate = false;
|
|
for (int i = kreditkartenNummer.length() - 1; i >= 0; i--) {
|
|
int n = Integer.parseInt(kreditkartenNummer.substring(i, i + 1));
|
|
if (alternate) {
|
|
n *= 2;
|
|
if (n > 9) {
|
|
n = (n % 10) + 1;
|
|
}
|
|
}
|
|
sum += n;
|
|
alternate = !alternate;
|
|
}
|
|
return (sum % 10 == 0);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|