Hinzufügen der Ordner für FlowChart und KI Prompts

Nach Prüfung korrektur des Datums, nun keine nicht existierenden Daten mehr möglich
Anpassung des Platz überprüfens nun kann nicht mehr eingefahren werden wenn das Parkhaus voll ist
main
Leon Maximilian Löhle 2024-10-07 14:40:36 +02:00
parent 76141da3f1
commit b9e703500f
6 changed files with 133 additions and 179 deletions

View File

@ -0,0 +1,26 @@
Benutzer startet Main Klasse
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 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
2. Ausfahrt:
Eingabe des Kennzeichens und Datums mit Uhrzeit vom Ausfahren
Preis berechnung im Hintergrund
Platz im Parkhaus wird wieder größer
nicht gezahlter Betrag wird zu den Schulden gespeichert
3. Bezahlen und Ausfahren
Eingabe des Kennzeichens und Datums mit Uhrzeit vom Ausfahren
Preis berechnung im Hintergrund
Ausgabe des Preises
Kunde wird aufgefordert seine Kreditkartennummer einzugeben
Prüfziffer wird berechnet
Platz im Parkhaus wird größer, keine Schulden da gezahlt wird
4. beenden:
Programm verabschiedet sich und wird beendet

View File

@ -0,0 +1,21 @@
Ich: Ich benutze das Java simple Date format und wenn ich den 31.02.2023 eingebe, wird kein fehler geworfen
ChatGPT:
Das Verhalten des `SimpleDateFormat` in Java hängt von seiner Toleranz gegenüber ungültigen Datumsangaben ab. Standardmäßig versucht es, das eingegebene Datum auf ein gültiges Datum anzupassen, anstatt einen Fehler zu werfen.
Wenn du z.B. den 31.02.2023 eingibst, passt Java dieses Datum auf den nächsten gültigen Tag an, in diesem Fall den 3. März 2023, da der Februar im Jahr 2023 nur 28 Tage hat.
Um sicherzustellen, dass wirklich nur gültige Datumsangaben akzeptiert werden und eine Ausnahme (wie `ParseException`) bei ungültigen Daten geworfen wird, musst du den Leniency-Modus deaktivieren. Hier ist ein Beispiel:
```java
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
sdf.setLenient(false); // Leniency-Modus deaktivieren
try {
Date date = sdf.parse("31.02.2023");
System.out.println("Gültiges Datum: " + date);
} catch (ParseException e) {
System.out.println("Ungültiges Datum: " + e.getMessage());
}
```
Mit `sdf.setLenient(false)` wird der Parser streng und ungültige Daten wie der 31. Februar führen zu einem Fehler.

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.

View File

@ -7,78 +7,83 @@ import java.util.Scanner;
public class Main { public class Main {
public static void main(String[] args) throws ParseException { public static void main(String[] args) throws ParseException {
Scanner sc = new Scanner(System.in); Scanner sc = new Scanner(System.in);
Parkhaus parkhaus = new Parkhaus(1.0); Parkhaus parkhaus = new Parkhaus();
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm"); SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
sdf.setLenient(false);
while (true) { while (true) {
try {
System.out.println("Willkommen im Parkhaus der Hochschule Mannheim");
System.out.println("Wollen Sie ");
System.out.println("1. Ins Parkhaus einfahren");
System.out.println("2. Aus dem Parkhaus ausfahren");
System.out.println("3. Bezahlen und ausfahren");
System.out.println("4. Beenden");
int auswahl = sc.nextInt();
sc.nextLine();
if (auswahl == 4) {
System.out.println("Das Programm wird nun beendet.");
System.out.println("Wir wünschen Ihnen noch einen schönen Tag");
break;
}
System.out.println("Willkommen im Parkhaus der Hochschule Mannheim"); switch (auswahl) {
System.out.println("Wollen Sie ");
System.out.println("1. Ins Parkhaus einfahren"); case 1:
System.out.println("2. Aus dem Parkhaus ausfahren"); System.out.println("Bitte geben Sie ihr Kennzeichen ein:");
System.out.println("3. Bezahlen und ausfahren"); String kennzeichenEinfahrt = sc.nextLine();
System.out.println("4. Beenden"); System.out.println("Wann sind Sie in das Parkhaus eingefahren. Bitte im Format TT.MM.JJJJ SS:MM");
int auswahl = sc.nextInt(); String einfahrtEingabe = sc.nextLine();
sc.nextLine(); Date einfahrtZeit = sdf.parse(einfahrtEingabe);
Auto auto = new Auto(kennzeichenEinfahrt, einfahrtZeit);
parkhaus.addAuto(auto);
break;
case 2:
System.out.println("Bitte geben Sie das Kennzeichen des Fahrzeugs ein, welches ausfahren soll :");
String kennzeichenAusfahrt = sc.nextLine();
auto = parkhaus.autoFinden(kennzeichenAusfahrt);
if (auto == null) {
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden.");
} else {
System.out.println("Wann sind Sie aus dem Parkhaus ausgefahren. Bitte im Format TT.MM.JJJJ SS:MM");
String ausfahrtEingabe = sc.nextLine();
Date ausfahrtZeit = sdf.parse(ausfahrtEingabe);
double kosten = parkhaus.berechneParkKosten(auto, ausfahrtZeit);
auto.setSchulden(auto.getSchulden() + kosten);
parkhaus.ausfahrt(kennzeichenAusfahrt, ausfahrtZeit);
}
break;
case 3:
System.out.println("Für welches Kennzeichen sollen die Parkgebühren bezahlt werden");
String kennzeichenBezahlt = sc.nextLine();
auto = parkhaus.autoFinden(kennzeichenBezahlt);
if (auto == null) {
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden.");
} else {
System.out.println("Wann bezahlen Sie? Bitte im Format TT.MM.JJJJ SS:MM ");
String bezahltEingabe = sc.nextLine();
Date bezahltZeit = sdf.parse(bezahltEingabe);
System.out.println(parkhaus.berechneParkKosten(auto, bezahltZeit));
parkhaus.ausfahrt(kennzeichenBezahlt, bezahltZeit);
auto.setSchulden(0);
}
break;
default:
System.out.println("Falsche Eingabe bitte nur 1,2 oder 3 eingeben");
break;
}
if (auswahl == 4) {
System.out.println("Das Programm wird nun beendet.");
System.out.println("Wir wünschen Ihnen noch einen schönen Tag");
break;
} }
catch (ParseException e) {
System.out.println("Leider haben Sie ein Datum eingegeben was nicht existiert");
switch (auswahl) { System.out.println("Bitte veruschen Sie es erneut");
case 1:
System.out.println("Bitte geben Sie ihr Kennzeichen ein:");
String kennzeichenEinfahrt = sc.nextLine();
System.out.println("Wann sind Sie in das Parkhaus eingefahren. Bitte im Format TT.MM.JJJJ SS:MM");
String einfahrtEingabe = sc.nextLine();
Date einfahrtZeit = sdf.parse(einfahrtEingabe);
Auto auto = new Auto(kennzeichenEinfahrt, einfahrtZeit);
parkhaus.addAuto(auto);
break;
case 2:
System.out.println("Bitte geben Sie das Kennzeichen des Fahrzeugs ein, welches ausfahren soll :");
String kennzeichenAusfahrt = sc.nextLine();
auto = parkhaus.autoFinden(kennzeichenAusfahrt);
if(auto == null ){
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden.");
}
else {
System.out.println("Wann sind Sie aus dem Parkhaus ausgefahren. Bitte im Format TT.MM.JJJJ SS:MM");
String ausfahrtEingabe = sc.nextLine();
Date ausfahrtZeit = sdf.parse(ausfahrtEingabe);
double kosten = parkhaus.berechneParkKosten(auto, ausfahrtZeit);
auto.setSchulden(auto.getSchulden() + kosten);
parkhaus.ausfahrt(kennzeichenAusfahrt , ausfahrtZeit);
}
break;
case 3:
System.out.println("Für welches Kennzeichen sollen die Parkgebühren bezahlt werden");
String kennzeichenBezahlt = sc.nextLine();
auto = parkhaus.autoFinden(kennzeichenBezahlt);
if(auto == null ){
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden.");
}
else {
System.out.println("Wann bezahlen Sie? Bitte im Format TT.MM.JJJJ SS:MM ");
String bezahltEingabe = sc.nextLine();
Date bezahltZeit = sdf.parse(bezahltEingabe);
System.out.println(parkhaus.berechneParkKosten(auto, bezahltZeit));
parkhaus.ausfahrt(kennzeichenBezahlt , bezahltZeit);
auto.setSchulden(0);
}
break;
default:
System.out.println("Falsche Eingabe bitte nur 1,2 oder 3 eingeben");
break;
} }
} }
sc.close(); sc.close();

View File

@ -42,18 +42,22 @@ public class Parkhaus {
this.platz = platz; this.platz = platz;
} }
public Parkhaus(double preis) { public Parkhaus() {
this.preis = 1.0; this.preis = 1.0;
this.maxPlatz = 180; this.maxPlatz = 1;
this.platz = maxPlatz; this.platz = getMaxPlatz();
this.maxNachtPreis = 5; this.maxNachtPreis = 5;
this.maxTagesPreis = 15; this.maxTagesPreis = 15;
this.autos = new ArrayList<Auto>(); this.autos = new ArrayList<Auto>();
} }
public void addAuto(Auto auto) { public void addAuto(Auto auto) {
autos.add(auto); if (platz <= 0) {
platz -= 1; System.out.println("Das Parkhaus ist voll, Sie können nicht mehr einfahren!");
} else {
autos.add(auto);
platz -= 1;
}
} }
public Auto autoFinden(String kennzeichen) { public Auto autoFinden(String kennzeichen) {
@ -81,13 +85,15 @@ public class Parkhaus {
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) { if (einfahrtZeit == null || ausfahrtZeit == null) {
System.out.println("Es wurde keine Ein- oder ausfahrtzeit gesetzt"); System.out.println("Es wurde keine Ein- oder ausfahrtzeit gesetzt!");
} else if (ausfahrtZeit.before(einfahrtZeit)) {
System.out.println("Das ausfahren darf nicht vor dem einfahren liegen! ");
} }
long parkDauerMinuten = (ausfahrtZeit.getTime() - einfahrtZeit.getTime())/(1000*60); long parkDauerMinuten = (ausfahrtZeit.getTime() - einfahrtZeit.getTime()) / (1000 * 60);
double kosten = 0; double kosten = 0;
if(parkDauerMinuten < 0){ if (parkDauerMinuten < 0) {
System.out.println("Diese Eingaben sind nicht möglich"); System.out.println("Diese Eingaben sind nicht möglich");
} }