Compare commits

...

2 Commits

Author SHA1 Message Date
Leon Maximilian Löhle 7737315b18 Verbesserte SystemAusGaben,
verbesserte berechnungen,
ausfahrt und Schuldenspeicherung überarbeitet,
flow chart korrigiert;
KI Promts hinzugefügt
2024-10-08 09:55:51 +02:00
Leon Maximilian Löhle 423e6e33b0 Komplette überarbeitung der Kosten berechnung
Hinzufügen des Kreditkartenbezahlens
Veränderung um speicherung der Schulden zu garantieren
Vorbereitung für kommentation, fehler suche
2024-10-07 23:09:39 +02:00
9 changed files with 413 additions and 180 deletions

View File

@ -1,26 +1,35 @@
Benutzer startet Main Klasse Benutzer startet Main-Klasse:
System gibt Willkommens Nachricht aus und bittet um eingabe ob einfahrt oder ausfahrt Das Programm erstellt im Hintergrund ein Datumsformat und baut einen Parkplatz auf, um auf die Parkplatz-Klasse zugreifen zu können.
Benutzer gibt ein ob man ein-, ausfährt, bezahlen oder beenden möchte Das System gibt eine Willkommensnachricht aus und bittet um die Eingabe, ob Einfahrt oder Ausfahrt gewünscht ist.
System nimmt entscheidung auf und startet anhand der Entscheidung entweder der Park/Ausfahrt oder den Bezahlvorgang oder beendet das Programm Der Benutzer gibt ein, ob man ein- oder ausfahren, bezahlen oder das Programm beenden möchte.
Das System nimmt die Entscheidung auf und startet basierend auf der Entscheidung entweder den Park-/Ausfahrtvorgang, den Bezahlvorgang oder beendet das Programm.
1. Parkvorgang: 1. Parkvorgang:
Das Programm bittet um eingabe des Kennzeichens und des Datums mit Uhrzeit Das Programm bittet um die Eingabe des Kennzeichens und des Datums mit Uhrzeit.
Benutzer gibt die geforderten Daten ein Der Benutzer gibt die geforderten Daten ein.
Programm kreiert anhand der Daten ein neues Auto Objekt in der Parkhaus Klasse und speichert in einer Auto Liste um mehrere Autos managen zu können Das Programm sucht in der ArrayList der eingefahrenen und ausgefahrenen Autos nach dem Kennzeichen, um sicherzugehen, dass das Auto noch nicht eingefahren ist und ob es bereits einmal eingefahren war, um die Schulden zu übernehmen.
Wenn das Auto in den eingefahrenen Autos gefunden wird, gibt das System einen Fehler aus, da Autos nicht zwei Mal mit dem gleichen Kennzeichen eingefahren sein können.
Wenn das Auto in den ausgefahrenen Autos gefunden wird, werden die Schulden übernommen, und es wird eine Willkommensnachricht mit der Erklärung ausgegeben, dass die Schulden übernommen wurden.
Wenn das Auto nirgends vorhanden ist, wird ein neues Auto erstellt und eingefahren.
2. Ausfahrt: 2. Ausfahrt:
Eingabe des Kennzeichens und Datums mit Uhrzeit vom Ausfahren Das System fordert den Kunden auf, das Kennzeichen sowie die Uhrzeit einzugeben, zu der ausgefahren werden soll.
Preis berechnung im Hintergrund Nach der Eingabe des Kennzeichens und des Datums mit Uhrzeit für die Ausfahrt erfolgt die Preisberechnung im Hintergrund.
Platz im Parkhaus wird wieder größer (Wenn die Dauer des Parkaufenthalts kürzer als 15 Minuten ist, gilt "Kiss and Ride", und es entstehen keine Kosten.)
nicht gezahlter Betrag wird zu den Schulden gespeichert Das Ergebnis der Parkkostenberechnung wird ausgegeben, gefolgt von einer Abschiedsnachricht mit der Ankündigung, dass Schulden hinzugefügt wurden, da nicht bezahlt wurde.
Der Platz im Parkhaus wird wieder freigegeben.
Das Auto wird in der Liste der ausgefahrenen Autos gespeichert, um beim nächsten Einfahren auf die Schulden zugreifen zu können.
3. Bezahlen und Ausfahren 3. Bezahlen und Ausfahren:
Eingabe des Kennzeichens und Datums mit Uhrzeit vom Ausfahren Das System fordert den Kunden auf, das Kennzeichen sowie die Uhrzeit einzugeben, zu der bezahlt werden soll.
Preis berechnung im Hintergrund Nach der Eingabe des Kennzeichens und des Datums mit Uhrzeit erfolgt die Preisberechnung im Hintergrund.
Ausgabe des Preises Der zu zahlende Betrag wird ausgegeben.
Kunde wird aufgefordert seine Kreditkartennummer einzugeben Der Kunde wird aufgefordert, seine Kreditkartennummer einzugeben.
Prüfziffer wird berechnet Die Kreditkartennummer wird auf Plausibilität geprüft.
Platz im Parkhaus wird größer, keine Schulden da gezahlt wird Wenn plausibel, werden die einzelnen Ziffern der Kreditkartennummer aufaddiert und die Quersumme gebildet.
Die Quersumme wird mit Modulo 10 geprüft, ob sie mit der letzten Ziffer der Kreditkartennummer übereinstimmt.
Wenn ja, werden die Schulden beglichen, das Auto fährt aus, und der Platz im Parkhaus wird wieder freigegeben.
Wenn nein, werden die Schulden nicht getilgt, und der Kunde wird erneut aufgefordert, das Kennzeichen und die Bezahlzeit einzugeben.
4. beenden: 4. Beenden:
Programm verabschiedet sich und wird beendet Das Programm verabschiedet sich und wird beendet.

View File

@ -0,0 +1,97 @@
Ich:
java while schleife ist nicht immer true, wie kann ich eine andere Option anbieten. Beispiel: So lange die Eistüte nicht voll ist kann man hinzufügen, aber wenn die Eistüte voll ist soll man nur noch wegnehmen können
ChatGPT:
In deinem Beispiel möchtest du eine Schleife haben, die fortlaufend Eis in eine Eistüte füllt, solange sie nicht voll ist. Sobald die Eistüte voll ist, soll die Schleife nur noch das Entfernen von Eis erlauben. Du kannst dies mit einer Kombination aus einer `while`-Schleife und einer Bedingung realisieren, die entscheidet, ob du Eis hinzufügen oder wegnehmen kannst.
Hier ist eine einfache Möglichkeit, dies umzusetzen:
1. Verwende eine Schleife, um den aktuellen Zustand der Eistüte zu überprüfen.
2. Wenn die Eistüte voll ist, kann man nur noch Eis wegnehmen.
3. Wenn die Eistüte nicht voll ist, kann man Eis hinzufügen.
Ein Beispiel in Java:
```java
import java.util.Scanner;
public class Eisstand {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int maximaleKapazität = 5; // Maximale Anzahl der Eiskugeln, die die Tüte halten kann
int aktuelleKugeln = 0; // Aktuelle Anzahl der Eiskugeln in der Tüte
while (true) {
if (aktuelleKugeln < maximaleKapazität) {
System.out.println("Die Eistüte hat " + aktuelleKugeln + " Kugeln. Möchtest du eine Kugel hinzufügen? (ja/nein)");
String eingabe = scanner.nextLine();
if (eingabe.equalsIgnoreCase("ja")) {
aktuelleKugeln++;
System.out.println("Eine Kugel wurde hinzugefügt.");
} else {
System.out.println("Okay, keine Kugel hinzugefügt.");
}
} else {
System.out.println("Die Eistüte ist voll mit " + aktuelleKugeln + " Kugeln. Möchtest du eine Kugel wegnehmen? (ja/nein)");
String eingabe = scanner.nextLine();
if (eingabe.equalsIgnoreCase("ja")) {
aktuelleKugeln--;
System.out.println("Eine Kugel wurde weggenommen.");
} else {
System.out.println("Keine Kugel wurde weggenommen.");
}
}
}
}
}
```
### Erklärung:
- Solange die Anzahl der Kugeln in der Eistüte kleiner ist als die maximale Kapazität (`aktuelleKugeln < maximaleKapazität`), wird der Benutzer gefragt, ob er eine Kugel hinzufügen möchte.
- Sobald die maximale Kapazität erreicht ist, wird der Benutzer gefragt, ob er eine Kugel entfernen möchte, da die Eistüte voll ist.
Mit dieser Logik wird sichergestellt, dass du nur so lange Eis hinzufügen kannst, bis die Tüte voll ist, und danach nur noch Kugeln wegnehmen kannst.
Ich:
Meine Funktion greift in sich selbst zu und wenn eine maximale Zahl von 180 erreicht wurde soll nichts mehr einfahren können. Es wird ein Parkhaus erstellt welches am Anfang leer ist und es können autos ein oder aus fahren.
ChatGPT:
Um das Problem mit dem Parkhaus zu lösen, kannst du eine Methode verwenden, die den aktuellen Status (Anzahl der Autos) überwacht. Wenn die maximale Kapazität von 180 erreicht ist, darf kein weiteres Auto mehr einfahren, aber Autos können weiterhin ausfahren.
Hier ist eine Beispielimplementierung:
```java
public class Parkhaus {
private int aktuelleAutos = 0;
private final int maximaleKapazität = 180;
// Methode, um ein Auto einfahren zu lassen
public void autoEinfahren() {
if (aktuelleAutos < maximaleKapazität) {
aktuelleAutos++;
System.out.println("Ein Auto ist eingefahren. Aktuelle Anzahl Autos: " + aktuelleAutos);
} else {
System.out.println("Das Parkhaus ist voll! Kein Auto kann mehr einfahren.");
}
}
// Methode, um ein Auto ausfahren zu lassen
public void autoAusfahren() {
if (aktuelleAutos > 0) {
aktuelleAutos--;
System.out.println("Ein Auto ist ausgefahren. Aktuelle Anzahl Autos: " + aktuelleAutos);
} else {
System.out.println("Das Parkhaus ist leer! Kein Auto zum Ausfahren.");
}
}
}
```
### Erklärung:
- `aktuelleAutos` speichert die Anzahl der Autos im Parkhaus.
- Die Methode `autoEinfahren()` prüft, ob die Anzahl der Autos unter der maximalen Kapazität liegt. Wenn dies der Fall ist, wird ein Auto eingefahren, andernfalls wird eine Meldung ausgegeben, dass das Parkhaus voll ist.
- Die Methode `autoAusfahren()` lässt ein Auto ausfahren, wenn mindestens ein Auto im Parkhaus ist. Ansonsten wird eine Meldung angezeigt, dass das Parkhaus leer ist.
Du kannst diese Methoden dann in deinem Hauptprogramm oder in anderen Klassen verwenden, um das Ein- und Ausfahren der Autos zu steuern.

View File

@ -0,0 +1,53 @@
Ich:
Ich möchte in Java meine Systemzeit auslesen lassen und sie in einem String im Format DD.MM.YYYY HH:MM
ChatGPT:
Um die aktuelle Systemzeit in Java auszulesen und im gewünschten Format `DD.MM.YYYY HH:MM` darzustellen, kannst du die Klasse `SimpleDateFormat` oder, wenn du mit Java 8 oder höher arbeitest, die moderne `DateTimeFormatter`-API verwenden.
Hier ist ein Beispiel für beide Varianten:
### Variante 1: Mit `SimpleDateFormat`
```java
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
// Aktuelle Systemzeit
Date now = new Date();
// Format festlegen
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
// In String umwandeln
String formattedDate = sdf.format(now);
// Ausgabe
System.out.println(formattedDate);
}
}
```
### Variante 2: Mit `DateTimeFormatter` (Java 8+)
```java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Aktuelle Systemzeit
LocalDateTime now = LocalDateTime.now();
// Format festlegen
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
// In String umwandeln
String formattedDate = now.format(dtf);
// Ausgabe
System.out.println(formattedDate);
}
}
```
Beide Varianten liefern die aktuelle Systemzeit im Format `DD.MM.YYYY HH:MM`. Die moderne `DateTimeFormatter`-API wird bevorzugt, da sie thread-sicher ist und mehr Funktionalität bietet.

View File

@ -0,0 +1,95 @@
Ich:
Benutzer startet Main Klasse
Programm erstellt im Hintergrund ein Datums format und baut ein Parkplatz auf um auf die ParkplatzKlasse zugreifen zu können
System gibt Willkommens Nachricht aus und bittet um eingabe ob einfahrt oder ausfahrt
Benutzer gibt ein ob man ein-, ausfährt, bezahlen oder beenden möchte
System nimmt entscheidung auf und startet anhand der Entscheidung entweder der Park/Ausfahrt oder den Bezahlvorgang oder beendet das Programm
1. Parkvorgang:
Das Programm bittet um eingabe des Kennzeichens und des Datums mit Uhrzeit
Benutzer gibt die geforderten Daten ein
Programm sucht nach eingegebenen Kennzeichen in der ArrayList eingefahrene und ausgefahrene Autos nach dem Kennzeichen
um sicherzugehen, dass das Auto noch nicht eingefahen ist und ob es bereits mal eingefahren war um die Schulden zu übernehmen
Wenn auto gefunden in eingefahrenen ausgabe eines Fehlers, da Autos nicht zwei mal das gleiche Kennzeichen haben können, wenn auto in ausgefahrenen
0erden schulden übernommen und ausgabe einer willkommens nachricht mit erklärung, dass Schulden übernommen werden
Wenn Auto nirgends vorhanden wird neues Auto erstellt und eingefahren.
2. Ausfahrt:
System fordert den Kunden auf das Kennzeichen welches ausfahren soll sowie die Uhrzeit zu der ausgefahren werden soll
Eingabe des Kennzeichens und Datums mit Uhrzeit vom Ausfahren
Preis berechnung im Hintergrund (Wenn dauer des Parkaufenthalts kleiner als 15 minuten dann gilt Kiss and Ride und es entstehen keine Kosten)
Ausgabe Ergebnis Parkkostenberechnung und abschiedsnachricht mit ankündigung, dass Schulden da nicht bezahlt wurden hinzugefügt wurden
Platz im Parkhaus wird wieder größer
Auto wird in ausgefahrene Autos gespeichert um beim nächsten ausfahen auf die Schulden zugreifen zu können
3. Bezahlen und Ausfahren
System fordert den Kunden auf das Kennzeichen welches bezahlt werden soll sowie die Uhrzeit zu der bezahlt werden soll
Eingabe des Kennzeichens und Datums mit Uhrzeit vom bezahlen
Preis berechnung im Hintergrund
Ausgabe des Preises
Kunde wird aufgefordert seine Kreditkartennummer einzugeben
Kredtkartennummer wird auf plausiblität geprüft
Wenn plausible, werden die einzelnen Zahlen aus die letze Stelle der Kreditkartennummer aufeinander aufaddiert und die Quersumme gebildet
Quersumme mit modulo 10 geprüft ob dies die letzte Zahl auf der Kreditkarte bildet wenn
Ja:
Schulden beglichen, auto fährt aus, Platz im Parkhaus wird größer
Nein:
Schulden werden nicht getilgt, erneute Kennzeicheneingabe sowie bezahlzeit gefordert
4. beenden:
Programm verabschiedet sich und wird beendet
Korrigiere etwaiige rechtschreibfehler
ChatGPT:
Hier ist der korrigierte Text:
---
**Benutzer startet Main-Klasse:**
Das Programm erstellt im Hintergrund ein Datumsformat und baut einen Parkplatz auf, um auf die Parkplatz-Klasse zugreifen zu können.
Das System gibt eine Willkommensnachricht aus und bittet um die Eingabe, ob Einfahrt oder Ausfahrt gewünscht ist.
Der Benutzer gibt ein, ob man ein- oder ausfahren, bezahlen oder das Programm beenden möchte.
Das System nimmt die Entscheidung auf und startet basierend auf der Entscheidung entweder den Park-/Ausfahrtvorgang, den Bezahlvorgang oder beendet das Programm.
---
### 1. Parkvorgang:
Das Programm bittet um die Eingabe des Kennzeichens und des Datums mit Uhrzeit.
Der Benutzer gibt die geforderten Daten ein.
Das Programm sucht in der ArrayList der eingefahrenen und ausgefahrenen Autos nach dem Kennzeichen, um sicherzugehen, dass das Auto noch nicht eingefahren ist und ob es bereits einmal eingefahren war, um die Schulden zu übernehmen.
Wenn das Auto in den eingefahrenen Autos gefunden wird, gibt das System einen Fehler aus, da Autos nicht zwei Mal mit dem gleichen Kennzeichen eingefahren sein können.
Wenn das Auto in den ausgefahrenen Autos gefunden wird, werden die Schulden übernommen, und es wird eine Willkommensnachricht mit der Erklärung ausgegeben, dass die Schulden übernommen wurden.
Wenn das Auto nirgends vorhanden ist, wird ein neues Auto erstellt und eingefahren.
---
### 2. Ausfahrt:
Das System fordert den Kunden auf, das Kennzeichen sowie die Uhrzeit einzugeben, zu der ausgefahren werden soll.
Nach der Eingabe des Kennzeichens und des Datums mit Uhrzeit für die Ausfahrt erfolgt die Preisberechnung im Hintergrund.
(Wenn die Dauer des Parkaufenthalts kürzer als 15 Minuten ist, gilt "Kiss and Ride", und es entstehen keine Kosten.)
Das Ergebnis der Parkkostenberechnung wird ausgegeben, gefolgt von einer Abschiedsnachricht mit der Ankündigung, dass Schulden hinzugefügt wurden, da nicht bezahlt wurde.
Der Platz im Parkhaus wird wieder freigegeben.
Das Auto wird in der Liste der ausgefahrenen Autos gespeichert, um beim nächsten Einfahren auf die Schulden zugreifen zu können.
---
### 3. Bezahlen und Ausfahren:
Das System fordert den Kunden auf, das Kennzeichen sowie die Uhrzeit einzugeben, zu der bezahlt werden soll.
Nach der Eingabe des Kennzeichens und des Datums mit Uhrzeit erfolgt die Preisberechnung im Hintergrund.
Der zu zahlende Betrag wird ausgegeben.
Der Kunde wird aufgefordert, seine Kreditkartennummer einzugeben.
Die Kreditkartennummer wird auf Plausibilität geprüft.
Wenn plausibel, werden die einzelnen Ziffern der Kreditkartennummer aufaddiert und die Quersumme gebildet.
Die Quersumme wird mit Modulo 10 geprüft, ob sie mit der letzten Ziffer der Kreditkartennummer übereinstimmt.
Wenn **ja**, werden die Schulden beglichen, das Auto fährt aus, und der Platz im Parkhaus wird wieder freigegeben.
Wenn **nein**, werden die Schulden nicht getilgt, und der Kunde wird erneut aufgefordert, das Kennzeichen und die Bezahlzeit einzugeben.
---
### 4. Beenden:
Das Programm verabschiedet sich und wird beendet.
---
Alle Rechtschreibfehler wurden korrigiert, und der Ablauf bleibt wie von dir gewünscht erhalten.

View File

@ -9,6 +9,7 @@ public class Main {
Scanner sc = new Scanner(System.in); Scanner sc = new Scanner(System.in);
Parkhaus parkhaus = new Parkhaus(); Parkhaus parkhaus = new Parkhaus();
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm"); SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
String einfahrtenzeit;
sdf.setLenient(false); sdf.setLenient(false);
while (true) { while (true) {
try { try {
@ -36,55 +37,69 @@ public class Main {
String kennzeichenEinfahrt = sc.nextLine(); String kennzeichenEinfahrt = sc.nextLine();
System.out.println("Wann sind Sie in das Parkhaus eingefahren. Bitte im Format TT.MM.JJJJ SS:MM"); System.out.println("Wann sind Sie in das Parkhaus eingefahren. Bitte im Format TT.MM.JJJJ SS:MM");
String einfahrtEingabe = sc.nextLine(); String einfahrtEingabe = sc.nextLine();
Date einfahrtZeit = sdf.parse(einfahrtEingabe); Date einfahrtZeit;
if (einfahrtEingabe.isEmpty()) {
einfahrtZeit = new Date();
System.out.println("Es wird die aktuelle Systemzeit : " + sdf.format(einfahrtZeit) + " verwendet");
} else {
einfahrtZeit = sdf.parse(einfahrtEingabe);
System.out.println("Eingegebene Einfahrtzeit " + sdf.format(einfahrtZeit));
}
Auto auto = new Auto(kennzeichenEinfahrt, einfahrtZeit); Auto auto = new Auto(kennzeichenEinfahrt, einfahrtZeit);
parkhaus.addAuto(auto); parkhaus.addAuto(auto);
System.out.println("Im Parkhaus sind jetzt noch " + parkhaus.getPlatz() + " plätze frei");
break; break;
case 2: case 2:
System.out.println("Bitte geben Sie das Kennzeichen des Fahrzeugs ein, welches ausfahren soll :"); System.out.println("Bitte geben Sie das Kennzeichen des Fahrzeugs ein, welches ausfahren soll :");
String kennzeichenAusfahrt = sc.nextLine(); String kennzeichenAusfahrt = sc.nextLine();
auto = parkhaus.autoFinden(kennzeichenAusfahrt); auto = parkhaus.autoFinden(kennzeichenAusfahrt);
if (auto == null) { System.out.println("Wann wurde aus dem Parkhaus ausgefahren? Bitte im Format TT.MM.JJJJ SS:MM");
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden."); String ausfahrtEingabe = sc.nextLine();
Date ausfahrtZeit;
if (ausfahrtEingabe.isEmpty()) {
ausfahrtZeit = new Date();
System.out.println("Es wird die aktuelle Systemzeit : " + sdf.format(ausfahrtZeit) + " verwendet");
} else { } else {
System.out.println("Wann sind Sie aus dem Parkhaus ausgefahren. Bitte im Format TT.MM.JJJJ SS:MM"); ausfahrtZeit = sdf.parse(ausfahrtEingabe);
String ausfahrtEingabe = sc.nextLine(); System.out.println("Es wird die ausfahrzeit: " + sdf.format(ausfahrtZeit) + " verwendet");
Date ausfahrtZeit = sdf.parse(ausfahrtEingabe);
double kosten = parkhaus.berechneParkKosten(auto, ausfahrtZeit);
auto.setSchulden(auto.getSchulden() + kosten);
parkhaus.ausfahrt(kennzeichenAusfahrt, ausfahrtZeit);
} }
parkhaus.ausfahrt(kennzeichenAusfahrt, ausfahrtZeit);
break; break;
case 3: case 3:
System.out.println("Für welches Kennzeichen sollen die Parkgebühren bezahlt werden"); System.out.println("Für welches Kennzeichen sollen die Parkgebühren bezahlt werden");
String kennzeichenBezahlt = sc.nextLine(); String kennzeichenBezahlt = sc.nextLine();
auto = parkhaus.autoFinden(kennzeichenBezahlt); auto = parkhaus.autoFinden(kennzeichenBezahlt);
if (auto == null) { System.out.println("Wann bezahlen Sie? Bitte im Format TT.MM.JJJJ SS:MM ");
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden."); String bezahltEingabe = sc.nextLine();
Date bezahltZeit;
if (bezahltEingabe.isEmpty()) {
bezahltZeit = new Date();
System.out.println("Es wird die aktuelle Systemzeit : " + sdf.format(bezahltZeit) + " verwendet");
} else { } else {
System.out.println("Wann bezahlen Sie? Bitte im Format TT.MM.JJJJ SS:MM "); bezahltZeit = sdf.parse(bezahltEingabe);
String bezahltEingabe = sc.nextLine(); System.out.println("Es wird die Bezahlzeit: " + sdf.format(bezahltZeit) + " verwendet");
Date bezahltZeit = sdf.parse(bezahltEingabe);
System.out.println(parkhaus.berechneParkKosten(auto, bezahltZeit));
parkhaus.ausfahrt(kennzeichenBezahlt, bezahltZeit);
auto.setSchulden(0);
} }
System.out.println("Für die Dauer die Sie im Parkhaus standen, fallen Kosten in Höhe von " + parkhaus.berechneParkKosten(auto, bezahltZeit) + "€ an");
System.out.println("Bitte geben Sie die 16 Stellige Nummer Ihrer Visa Karte ein");
String kreditkartennummer = sc.nextLine();
parkhaus.bezahlen(kennzeichenBezahlt, bezahltZeit, kreditkartennummer);
break; break;
default: default:
System.out.println("Falsche Eingabe bitte nur 1,2 oder 3 eingeben"); System.out.println("Falsche Eingabe bitte nur 1,2,3 oder 4 eingeben");
break; break;
} }
} } catch (ParseException e) {
catch (ParseException e) {
System.out.println("Leider haben Sie ein Datum eingegeben was nicht existiert"); System.out.println("Leider haben Sie ein Datum eingegeben was nicht existiert");
System.out.println("Bitte veruschen Sie es erneut"); System.out.println("Bitte veruschen Sie es erneut");
} }
} }
sc.close(); sc.close();
} }

View File

@ -9,6 +9,7 @@ public class Parkhaus {
private int maxPlatz; private int maxPlatz;
private int platz; private int platz;
private List<Auto> autos; private List<Auto> autos;
private List<Auto> ausgefahrene;
public double getMaxNachtPreis() { public double getMaxNachtPreis() {
return maxNachtPreis; return maxNachtPreis;
@ -43,8 +44,9 @@ public class Parkhaus {
} }
public Parkhaus() { public Parkhaus() {
this.ausgefahrene = new ArrayList<Auto>();
this.preis = 1.0; this.preis = 1.0;
this.maxPlatz = 1; this.maxPlatz = 180;
this.platz = getMaxPlatz(); this.platz = getMaxPlatz();
this.maxNachtPreis = 5; this.maxNachtPreis = 5;
this.maxTagesPreis = 15; this.maxTagesPreis = 15;
@ -52,23 +54,83 @@ public class Parkhaus {
} }
public void addAuto(Auto auto) { public void addAuto(Auto auto) {
if (platz <= 0) { for (Auto ausgefahrenesAuto : ausgefahrene) {
System.out.println("Das Parkhaus ist voll, Sie können nicht mehr einfahren!"); if (ausgefahrenesAuto.getKennzeichen().equals(auto.getKennzeichen())) {
} else { System.out.println("Auto mit dem Kennzeichen " + auto.getKennzeichen() + " fährt erneut ein. Übernommene Schulden: " + ausgefahrenesAuto.getSchulden() + "€");
autos.add(auto); ausgefahrene.remove(ausgefahrenesAuto);
platz -= 1; ausgefahrenesAuto.setEinfahrtZeit(auto.getEinfahrtZeit());
autos.add(ausgefahrenesAuto);
platz -= 1;
return;
}
} }
autos.add(auto);
platz -= 1;
System.out.println("Auto mit dem Kennzeichen " + auto.getKennzeichen() + " ist eingefahren.");
} }
public Auto autoFinden(String kennzeichen) { public Auto autoFinden(String kennzeichen) {
for (Auto auto : autos) { for (Auto auto : autos) {
if (auto.getKennzeichen().equals(kennzeichen)) { if (auto.getKennzeichen().equals(kennzeichen)) {
return auto; return auto;
} }
} }
for (Auto auto : ausgefahrene) {
if (auto.getKennzeichen().equals(kennzeichen)) {
return auto;
}
}
return null; return null;
} }
public void bezahlen(String kennzeichen, Date bezahltZeit, String kreditkartennummer) {
Auto auto = autoFinden(kennzeichen);
if (auto == null) {
System.out.println("Für dieses Kennzeichen ist leider kein Auto vorhanden.");
return;
}
double aktuelleKosten = berechneParkKosten(auto, bezahltZeit);
double gesamtSchulden = auto.getSchulden() + aktuelleKosten;
if (!istGueltigeVisaKarte(kreditkartennummer)) {
System.out.println("Ungültige Kreditkartennummer! Bitte versuchen Sie es erneut.");
return;
}
System.out.println("Zahlung erfolgreich! Ihre Schulden wurden beglichen.");
auto.setSchulden(0);
System.out.println("Wir wünschen Ihnen noch einen schönen Tag und bis zum nächsten mal");
autos.remove(auto);
ausgefahrene.remove(auto);
platz +=1;
System.out.println("Nun sind im Parkhaus wieder " + platz + " Plätze frei");
}
private boolean istGueltigeVisaKarte(String kreditkartenNummer) {
if (kreditkartenNummer.length() != 16 || !kreditkartenNummer.startsWith("4")) {
return false;
}
return algoPruf(kreditkartenNummer);
}
private boolean algoPruf(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;
}
public void ausfahrt(String kennzeichen, Date ausfahrtZeit) { public void ausfahrt(String kennzeichen, Date ausfahrtZeit) {
Auto auto = autoFinden(kennzeichen); Auto auto = autoFinden(kennzeichen);
if (auto == null) { if (auto == null) {
@ -76,50 +138,56 @@ public class Parkhaus {
return; return;
} }
auto.setAusfahrtZeit(ausfahrtZeit); auto.setAusfahrtZeit(ausfahrtZeit);
double kosten = berechneParkKosten(auto, ausfahrtZeit); double neueKosten = berechneParkKosten(auto, ausfahrtZeit);
System.out.println("Die Koste für das Fahrzeug mit dem eingegebenen Kennzeichen " + kennzeichen + "betragen:"); double bestehendeSchulden = auto.getSchulden();
System.out.println(kosten); auto.setSchulden(bestehendeSchulden + neueKosten);
System.out.println("Da Sie ohne zu Zahlen gegangen sind werden Ihnen die Parkkosten in Höhe von " + neueKosten + "€ hinzugefügt.");
System.out.println("Gesamtschulden belaufen sich jetzt auf: " + auto.getSchulden() + "€.");
autos.remove(auto); autos.remove(auto);
ausgefahrene.add(auto);
platz += 1; platz += 1;
} }
public double berechneParkKosten(Auto auto, Date ausfahrtZeit) { public double berechneParkKosten(Auto auto, Date ausfahrtZeit) {
Date einfahrtZeit = auto.getEinfahrtZeit(); Date einfahrtZeit = auto.getEinfahrtZeit();
if (einfahrtZeit == null || ausfahrtZeit == null) { long parkMinuten = (ausfahrtZeit.getTime() - einfahrtZeit.getTime()) / 60000;
System.out.println("Es wurde keine Ein- oder ausfahrtzeit gesetzt!"); long kostenMinuten = parkMinuten - 15;
} else if (ausfahrtZeit.before(einfahrtZeit)) {
System.out.println("Das ausfahren darf nicht vor dem einfahren liegen! ");
}
long parkDauerMinuten = (ausfahrtZeit.getTime() - einfahrtZeit.getTime()) / (1000 * 60);
double kosten = 0; double kosten = 0;
if (parkDauerMinuten < 0) { if (parkMinuten <= 15) {
System.out.println("Diese Eingaben sind nicht möglich"); System.out.println("Kiss and Ride, die ersten 15 Minuten sind kostenlos");
return 0;
} }
int einFahrtStunde = einfahrtZeit.getHours(); long parkTage = (long) Math.ceil(parkMinuten / (60.0 * 24));
int ausFahrtStunde = ausfahrtZeit.getHours();
if (einFahrtStunde >= 20 || ausFahrtStunde <= 6) { for (int tag = 0; tag < parkTage; tag++) {
if (parkDauerMinuten <= 15) { long restMinuten = kostenMinuten - (tag * 24 * 60);
return 0; long stundenAmTag = Math.min(restMinuten / 60, 24);
}
kosten = maxNachtPreis;
} else {
if (parkDauerMinuten <= 15) {
return 0;
}
parkDauerMinuten -= 15;
long parkDauerStunden = (parkDauerMinuten / 60) + 1;
kosten = parkDauerStunden * preis;
if (parkDauerStunden > 24) { double nachttarifKosten = 0;
kosten = maxTagesPreis; for (int stunde = 0; stunde < stundenAmTag; stunde++) {
int aktuelleStunde = (einfahrtZeit.getHours() + stunde) % 24;
if (aktuelleStunde >= 20 || aktuelleStunde < 6) {
nachttarifKosten += 1;
if (nachttarifKosten > maxNachtPreis) {
nachttarifKosten = maxNachtPreis;
break;
}
}
} }
double tagKosten = Math.min(stundenAmTag, 24) * preis + nachttarifKosten;
tagKosten = Math.min(tagKosten, maxTagesPreis);
kosten += tagKosten;
} }
if (auto.getEAuto()) { if (auto.getKennzeichen().endsWith("E")) {
kosten *= 0.8; kosten *= 0.8;
} }
return kosten; return kosten;
} }
}
}

View File

@ -1,104 +0,0 @@
Ich:
Ich habe ein Problem mit Java Code. Ich habe ein Parkhaus programmiert und in der Main Klasse einen Switch-Case. Es wird abgefragt ob man einfahren möchte, bezahlen, ausfahren oder beenden möchte. Nachdem man einfahren auswählt soll man sein kennzeichen und danch das Datum mit Uhrzeit eingeben. Dies passiert über 1,2,3 oder 4 und einem scanner der das eingegebene int ließt. Wenn ich jetzt aber zum beispiel 1 für einfahren wählt wird die eingabe des kennzeichens komplett übersprungen und man kann nur noch direkt das Datum eingeben
ChatGpt:
Es klingt so, als ob es ein Problem mit der Verarbeitung der Benutzereingaben in deinem Switch-Case gibt. Wenn du das Kennzeichen nach der Auswahl des Menüpunktes für das Einfahren abfragen möchtest, solltest du sicherstellen, dass die Eingabeaufforderung für das Kennzeichen direkt nach der Auswahl erfolgt und nicht von einer anderen Eingabe überschrieben wird.
Hier ist ein einfaches Beispiel, das zeigt, wie du das implementieren kannst. Ich werde die Struktur deines Switch-Case darstellen, um das Einfahren, Bezahlen, Ausfahren und Beenden zu demonstrieren:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean running = true;
while (running) {
System.out.println("Wählen Sie eine Option:");
System.out.println("1. Einfahren");
System.out.println("2. Bezahlen");
System.out.println("3. Ausfahren");
System.out.println("4. Beenden");
int option = scanner.nextInt();
scanner.nextLine(); // Leere Zeile einlesen, um den Scanner zu reinigen
switch (option) {
case 1:
System.out.print("Geben Sie Ihr Kennzeichen ein: ");
String kennzeichen = scanner.nextLine();
System.out.print("Geben Sie das Datum mit Uhrzeit ein: ");
String datum = scanner.nextLine();
System.out.println("Auto mit Kennzeichen " + kennzeichen + " ist eingefahren am " + datum);
break;
case 2:
// Logik zum Bezahlen
System.out.println("Bezahlen...");
break;
case 3:
// Logik zum Ausfahren
System.out.println("Ausfahren...");
break;
case 4:
running = false; // Programm beenden
break;
default:
System.out.println("Ungültige Auswahl, bitte versuchen Sie es erneut.");
break;
}
}
scanner.close();
}
}
```
### Erläuterungen:
1. **`scanner.nextLine();` nach `scanner.nextInt();`**: Dies wird verwendet, um den Scanner zu reinigen. Wenn der Benutzer eine ganze Zahl eingibt, bleibt ein Zeilenumbruch im Eingabepuffer. Durch das Hinzufügen von `scanner.nextLine();` wird dieser Zeilenumbruch entfernt, sodass die nächste `nextLine()`-Eingabeaufforderung korrekt funktioniert.
2. **Eingabeaufforderungen**: Die Eingabeaufforderungen für das Kennzeichen und das Datum werden direkt nach der Auswahl der Option gestellt.
### Tipps zur Fehlersuche:
- Stelle sicher, dass die Scanner-Objekte nicht an anderer Stelle in deinem Code das Verhalten beeinflussen.
- Überprüfe, ob du beim Einlesen der Optionen den richtigen Typ verwendest (z. B. `nextInt()` für ganze Zahlen und `nextLine()` für Strings).
- Achte darauf, dass das Programm nicht vorzeitig beendet wird oder in einen unerwarteten Zustand gerät, der die Eingabeaufforderungen überspringt.
Wenn du weitere Details zu deinem bestehenden Code teilst, kann ich dir gezielter helfen!
Ich:
Ist das einlesen einer leeren zeile nach dem Int einlesen notwendig?
ChatGPT:
Ja, das Einlesen einer leeren Zeile nach dem Scannen eines `int` mit `scanner.nextInt()` ist notwendig, wenn du danach mit `scanner.nextLine()` weitere Eingaben vom Benutzer erfassen möchtest. Hier ist der Grund dafür:
- **Eingabepuffer**: Wenn du eine ganze Zahl mit `nextInt()` liest, wird nur die Zahl selbst aus dem Eingabepuffer gelesen. Der Zeilenumbruch (Enter-Taste), den der Benutzer gedrückt hat, bleibt jedoch im Puffer. Das bedeutet, dass die nächste `nextLine()`-Eingabe (die erwartet, dass der Benutzer einen String eingibt) sofort den verbleibenden Zeilenumbruch liest und nicht auf die Eingabe des Benutzers wartet.
### Beispiel:
Wenn du dies nicht tust:
```java
int option = scanner.nextInt(); // Benutzer gibt 1 ein und drückt Enter
String kennzeichen = scanner.nextLine(); // Diese Zeile liest den Zeilenumbruch und überspringt die Eingabe
```
Der `kennzeichen`-String wird leer sein, weil der Zeilenumbruch sofort gelesen wird, ohne dass der Benutzer die Möglichkeit hat, etwas einzugeben.
### Lösung:
Um sicherzustellen, dass die Benutzeraufforderung korrekt funktioniert, solltest du nach dem Scannen der Zahl `nextLine()` aufrufen, um den Zeilenumbruch zu konsumieren:
```java
int option = scanner.nextInt();
scanner.nextLine(); // Liest den Zeilenumbruch
String kennzeichen = scanner.nextLine(); // Jetzt kann der Benutzer korrekt das Kennzeichen eingeben
```
Wenn du sicherstellen möchtest, dass die Eingabeaufforderungen für das Kennzeichen und das Datum wie gewünscht funktionieren, ist dieser Schritt wichtig.

Binary file not shown.