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 istmain
parent
76141da3f1
commit
b9e703500f
|
@ -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
|
|
@ -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.
|
|
@ -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.
|
|
||||||
|
|
|
@ -7,11 +7,11 @@ 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("Willkommen im Parkhaus der Hochschule Mannheim");
|
||||||
System.out.println("Wollen Sie ");
|
System.out.println("Wollen Sie ");
|
||||||
|
@ -45,16 +45,15 @@ public class Main {
|
||||||
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 ){
|
if (auto == null) {
|
||||||
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden.");
|
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden.");
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
System.out.println("Wann sind Sie aus dem Parkhaus ausgefahren. Bitte im Format TT.MM.JJJJ SS:MM");
|
System.out.println("Wann sind Sie aus dem Parkhaus ausgefahren. Bitte im Format TT.MM.JJJJ SS:MM");
|
||||||
String ausfahrtEingabe = sc.nextLine();
|
String ausfahrtEingabe = sc.nextLine();
|
||||||
Date ausfahrtZeit = sdf.parse(ausfahrtEingabe);
|
Date ausfahrtZeit = sdf.parse(ausfahrtEingabe);
|
||||||
double kosten = parkhaus.berechneParkKosten(auto, ausfahrtZeit);
|
double kosten = parkhaus.berechneParkKosten(auto, ausfahrtZeit);
|
||||||
auto.setSchulden(auto.getSchulden() + kosten);
|
auto.setSchulden(auto.getSchulden() + kosten);
|
||||||
parkhaus.ausfahrt(kennzeichenAusfahrt , ausfahrtZeit);
|
parkhaus.ausfahrt(kennzeichenAusfahrt, ausfahrtZeit);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -62,15 +61,14 @@ public class Main {
|
||||||
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 ){
|
if (auto == null) {
|
||||||
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden.");
|
System.out.println("Keine Auto gefunden mit diesem Kennzeichen gefunden.");
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
System.out.println("Wann bezahlen Sie? Bitte im Format TT.MM.JJJJ SS:MM ");
|
System.out.println("Wann bezahlen Sie? Bitte im Format TT.MM.JJJJ SS:MM ");
|
||||||
String bezahltEingabe = sc.nextLine();
|
String bezahltEingabe = sc.nextLine();
|
||||||
Date bezahltZeit = sdf.parse(bezahltEingabe);
|
Date bezahltZeit = sdf.parse(bezahltEingabe);
|
||||||
System.out.println(parkhaus.berechneParkKosten(auto, bezahltZeit));
|
System.out.println(parkhaus.berechneParkKosten(auto, bezahltZeit));
|
||||||
parkhaus.ausfahrt(kennzeichenBezahlt , bezahltZeit);
|
parkhaus.ausfahrt(kennzeichenBezahlt, bezahltZeit);
|
||||||
auto.setSchulden(0);
|
auto.setSchulden(0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -80,6 +78,13 @@ public class Main {
|
||||||
System.out.println("Falsche Eingabe bitte nur 1,2 oder 3 eingeben");
|
System.out.println("Falsche Eingabe bitte nur 1,2 oder 3 eingeben");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (ParseException e) {
|
||||||
|
System.out.println("Leider haben Sie ein Datum eingegeben was nicht existiert");
|
||||||
|
System.out.println("Bitte veruschen Sie es erneut");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sc.close();
|
sc.close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,19 +42,23 @@ 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) {
|
||||||
|
if (platz <= 0) {
|
||||||
|
System.out.println("Das Parkhaus ist voll, Sie können nicht mehr einfahren!");
|
||||||
|
} else {
|
||||||
autos.add(auto);
|
autos.add(auto);
|
||||||
platz -= 1;
|
platz -= 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Auto autoFinden(String kennzeichen) {
|
public Auto autoFinden(String kennzeichen) {
|
||||||
for (Auto auto : autos) {
|
for (Auto auto : autos) {
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue