Junit Test für die Einfahren Methode, Gebühren berechnen methode,
Code-Verbesserungen, Use Case für das Parkhausmain
parent
1bfd8bed19
commit
9cc877e0e9
|
@ -0,0 +1,41 @@
|
|||
Frage 1:
|
||||
Ich: erkläre mir mit einfachen Wörtern, wie man die Prüfziffer einer 16stellige VISA-Karten überprüft?
|
||||
|
||||
ChatGPT: Um die Prüfziffer einer 16-stelligen VISA-Karte zu überprüfen, verwendet man den sogenannten Luhn-Algorithmus. Hier ist eine einfache Schritt-für-Schritt-Erklärung, wie das funktioniert:
|
||||
|
||||
Zahlen von rechts nach links durchgehen: Schreibe die 16-stellige Kartennummer auf und beginne mit der letzten Ziffer (die ganz rechts steht).
|
||||
|
||||
Jede zweite Ziffer verdoppeln: Beginne bei der zweitletzten Ziffer und verdopple jede zweite Zahl. Wenn das Ergebnis des Verdoppelns zweistellig ist (z. B. 7 × 2 = 14), addiere die beiden Ziffern zusammen (also 1 + 4 = 5).
|
||||
|
||||
Alle Ziffern addieren: Nachdem du die Verdopplungen und die Additionen gemacht hast, zähle alle Ziffern zusammen (die verdoppelten und die unveränderten).
|
||||
|
||||
Durch 10 teilen: Wenn die Summe der Ziffern durch 10 teilbar ist (also ohne Rest), ist die Kartennummer gültig. Wenn nicht, ist sie ungültig.
|
||||
|
||||
Beispiel:
|
||||
|
||||
Kartennummer: 4532 7084 1234 5678
|
||||
|
||||
Verdopple jede zweite Ziffer (von rechts aus gesehen):
|
||||
|
||||
8 bleibt 8
|
||||
7 wird zu 14 (1 + 4 = 5)
|
||||
6 bleibt 6
|
||||
5 wird zu 10 (1 + 0 = 1)
|
||||
usw.
|
||||
Addiere die Ziffern zusammen: Summe = 70
|
||||
|
||||
Da 70 durch 10 teilbar ist, ist die Kartennummer gültig.
|
||||
|
||||
Das ist der Grundprozess zur Überprüfung der Prüfziffer.
|
||||
|
||||
-------------------------------------------------------------------------------------------------------------------
|
||||
Frage 2:
|
||||
Ich: was macht die methode mathe.Ceil() einfach?
|
||||
ChatGPT:Die Methode Math.ceil() ist eine Funktion aus der Java-Bibliothek, die eine Zahl aufrundet. Sie gibt den kleinsten ganzzahligen Wert zurück, der größer oder gleich der eingegebenen Zahl ist.
|
||||
Funktionsweise von Math.ceil():
|
||||
Wenn die Zahl bereits ganzzahlig ist, bleibt sie unverändert.
|
||||
Wenn die Zahl einen Nachkommateil hat, wird sie zur nächsten vollen Zahl aufgerundet.
|
||||
Beispiel:
|
||||
Math.ceil(2.1); // Ausgabe: 3.0
|
||||
Math.ceil(3.7); // Ausgabe: 4.0
|
||||
Math.ceil(1.01); // Ausgabe: 2.0
|
Binary file not shown.
|
@ -0,0 +1,9 @@
|
|||
package Parkhaus;
|
||||
|
||||
public class AutoNichtGefundenException extends Exception {
|
||||
|
||||
AutoNichtGefundenException(String autoNichtGefunden){
|
||||
super(autoNichtGefunden);
|
||||
}
|
||||
|
||||
}
|
|
@ -3,36 +3,51 @@ package Parkhaus;
|
|||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
/* Jedes Fahrzeug hat ihr eigene:
|
||||
* - Kennzeichen
|
||||
* - Einfahrtzeit sowie Ausfahrtzeit
|
||||
* - Betrag
|
||||
*
|
||||
* - Ich gehe davon aus, dass das Fahrzeug automatisch als nicht bezahlt gilt, wenn es in das Parkhaus einfährt.
|
||||
*
|
||||
*/
|
||||
public class Fahrzeug {
|
||||
|
||||
|
||||
private String kennzeichen;
|
||||
private Date einfahrt;
|
||||
private final String kennzeichen;
|
||||
private final Date einfahrt;
|
||||
private Date ausfahrt;
|
||||
private boolean bezahlt;
|
||||
|
||||
private int betrag;
|
||||
|
||||
Fahrzeug() {
|
||||
this.kennzeichen = kennzeichenzufaelliggenerieren.kennzeichenzufaelliggenerieren();
|
||||
this.kennzeichen = kennzeichenzufaelliggenerieren.kennzeichengenerieren();
|
||||
this.einfahrt = new Date();
|
||||
this.betrag = 0;
|
||||
this.bezahlt = false;
|
||||
|
||||
}
|
||||
|
||||
Fahrzeug(String kennzeichen, Date einfahrt) {
|
||||
|
||||
this.kennzeichen = kennzeichen;
|
||||
this.einfahrt = einfahrt;
|
||||
this.betrag = 0;
|
||||
this.bezahlt = false;
|
||||
}
|
||||
|
||||
public String getKennzeichen() {
|
||||
return kennzeichen;
|
||||
}
|
||||
|
||||
// Diese Methode hilft mir, die Zeit in der Console formatted auszugeben
|
||||
public String getEinfahrtFormatted() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
|
||||
return sdf.format(einfahrt);
|
||||
}
|
||||
|
||||
public Date getEinfahrt() {
|
||||
return einfahrt;
|
||||
}
|
||||
|
||||
public Date getAusfahrt() {
|
||||
return ausfahrt;
|
||||
}
|
||||
|
@ -49,5 +64,12 @@ public class Fahrzeug {
|
|||
this.bezahlt = bezahlt;
|
||||
}
|
||||
|
||||
public int getBetrag() {
|
||||
return betrag;
|
||||
}
|
||||
|
||||
public void setBetrag(int betrag) {
|
||||
this.betrag = betrag;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
package Parkhaus;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import org.junit.jupiter.api.*;
|
||||
import java.text.ParseException;
|
||||
|
||||
class JTest_Einfahren {
|
||||
private Parkhaus parkhaus;
|
||||
|
||||
@BeforeEach
|
||||
void start() {
|
||||
parkhaus = new Parkhaus();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEinfahrenOhneEingabe() throws ParseException {
|
||||
|
||||
parkhaus.einfahrenextern("", "");
|
||||
assertEquals(179, parkhaus.getMaxPlaetze());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEinfahrenMitEingabe() throws ParseException {
|
||||
String kennzeichen = "MA-SH 4077";
|
||||
String einfahrtzeit = "01.10.2024, 14:30";
|
||||
|
||||
String test = parkhaus.einfahrenextern(kennzeichen, einfahrtzeit);
|
||||
assertTrue(test.contains(kennzeichen));
|
||||
assertTrue(test.contains(einfahrtzeit));
|
||||
assertEquals(179, parkhaus.getMaxPlaetze());
|
||||
|
||||
}
|
||||
}
|
|
@ -11,16 +11,14 @@ import java.util.Date;
|
|||
*
|
||||
*/
|
||||
public class Parkhaus {
|
||||
|
||||
private ArrayList<Fahrzeug> fahrzeuge;
|
||||
private ArrayList<Fahrzeug> fahrzeugeMitSchuldern;
|
||||
private static int maxPlaetze;
|
||||
private ArrayList<Fahrzeug> fahrzeugeMitSchulden;
|
||||
private int maxPlaetze;
|
||||
private SimpleDateFormat sdf;
|
||||
|
||||
|
||||
Parkhaus(){
|
||||
Parkhaus() {
|
||||
fahrzeuge = new ArrayList<>();
|
||||
fahrzeugeMitSchuldern = new ArrayList<>();
|
||||
fahrzeugeMitSchulden = new ArrayList<>();
|
||||
maxPlaetze = 180;
|
||||
sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
|
||||
}
|
||||
|
@ -30,34 +28,70 @@ public class Parkhaus {
|
|||
Fahrzeug fahrzeug;
|
||||
if (kennzeichen.isEmpty() && einfahrtzeit.isEmpty())
|
||||
fahrzeug = new Fahrzeug();
|
||||
|
||||
else {
|
||||
einfahrt = sdf.parse(einfahrtzeit);
|
||||
fahrzeug = new Fahrzeug(kennzeichen, einfahrt);
|
||||
}
|
||||
|
||||
fahrzeuge.add(fahrzeug);
|
||||
|
||||
// reduziere ich die Anzahl der verfügbare Parkplätze im Parkhaus
|
||||
maxPlaetze--;
|
||||
return "Das Fahrzeug mit dem Kennzeichen: " + fahrzeug.getKennzeichen() + "\n" + "wurde um: "
|
||||
+ fahrzeug.getEinfahrtFormatted() + " im Parkhaus eingefahren.";
|
||||
}
|
||||
public String einfahrenextern(String kennzeichen, String einfahrtzeit) throws ParseException {
|
||||
if(!checkParkplatze())
|
||||
return "Das Parkhaus ist voll";
|
||||
|
||||
return einfahrenIntern(kennzeichen,einfahrtzeit);
|
||||
public String einfahrenextern(String kennzeichen, String einfahrtzeit) throws ParseException {
|
||||
|
||||
return einfahrenIntern(kennzeichen, einfahrtzeit);
|
||||
}
|
||||
|
||||
private int berechneParkgebuehrenIntern(String kennzeichen, String ausfahrtzeit)throws AutoNichtGefundenException, ParseException {
|
||||
Fahrzeug fahrzeug = findeFahrzeug(kennzeichen);
|
||||
Date ausfahrt = sdf.parse(ausfahrtzeit);
|
||||
Date einfahrt = fahrzeug.getEinfahrt();
|
||||
|
||||
long inMinuten = ((ausfahrt.getTime() - einfahrt.getTime()) / 1000 / 60);
|
||||
int inStunden = (int) Math.ceil(inMinuten / 60); // Z.b = 6 Stunden
|
||||
int maxNachtBetrag = 5;
|
||||
int maxTagBetrag = 15;
|
||||
int betrag;
|
||||
|
||||
if (inMinuten <= 15)
|
||||
betrag = 0;
|
||||
|
||||
|
||||
// zwische 20 Uhr und 6 Uhr max 5€
|
||||
else if (einfahrt.getHours() >= 20 || einfahrt.getHours() < 6 || ausfahrt.getHours() >= 20|| ausfahrt.getHours() < 6)
|
||||
betrag = Math.min(inStunden, maxNachtBetrag);
|
||||
|
||||
else {
|
||||
betrag = inStunden;
|
||||
|
||||
if (betrag > maxTagBetrag)
|
||||
betrag = maxTagBetrag;
|
||||
}
|
||||
|
||||
fahrzeug.setBetrag(betrag);
|
||||
return fahrzeug.getBetrag();
|
||||
|
||||
}
|
||||
|
||||
public int berechneParkgebuehrenExtern(String kennzeichen, String ausfahrtzeit) throws AutoNichtGefundenException, ParseException {
|
||||
int betrag = berechneParkgebuehrenIntern(kennzeichen, ausfahrtzeit);
|
||||
return betrag;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public boolean checkParkplatze() {
|
||||
if (maxPlaetze <= 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return maxPlaetze > 0;
|
||||
}
|
||||
|
||||
|
||||
private boolean checkSchulden(String kennzeichen) {
|
||||
for (Fahrzeug sc: fahrzeugeMitSchuldern)
|
||||
for (Fahrzeug sc : fahrzeugeMitSchulden)
|
||||
if (sc.getKennzeichen().equals(kennzeichen))
|
||||
return true;
|
||||
|
||||
|
@ -68,16 +102,26 @@ public class Parkhaus {
|
|||
return checkSchulden(kennzeichen);
|
||||
}
|
||||
|
||||
public Fahrzeug findeFahrzeug(String kennzeichen) throws AutoNichtGefundenException {
|
||||
|
||||
for (Fahrzeug auto : fahrzeuge)
|
||||
if (auto.getKennzeichen().equals(kennzeichen))
|
||||
return auto;
|
||||
|
||||
throw new AutoNichtGefundenException("Ihre Auto wurde nicht gefunden \n melden Sie sich bitte an die Support");
|
||||
|
||||
}
|
||||
|
||||
// Getter methoden:
|
||||
public ArrayList<Fahrzeug> getFahrzeuge() {
|
||||
return fahrzeuge;
|
||||
}
|
||||
|
||||
public ArrayList<Fahrzeug> getFahrzeugeMitSchuldern() {
|
||||
return fahrzeugeMitSchuldern;
|
||||
public ArrayList<Fahrzeug> getFahrzeugeMitSchulden() {
|
||||
return fahrzeugeMitSchulden;
|
||||
}
|
||||
|
||||
public static int getMaxPlaetze() {
|
||||
public int getMaxPlaetze() {
|
||||
return maxPlaetze;
|
||||
}
|
||||
|
||||
|
@ -85,6 +129,4 @@ public class Parkhaus {
|
|||
return sdf;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -8,19 +8,16 @@ import java.util.Random;
|
|||
* - Diese Klasse hat nur die Aufgabe, zufällige Kennzeichen zu generieren
|
||||
* - immer wenn diese Klasse ein zufälliges Kennzeichen generiert,
|
||||
* - speichere ich das,damit es nicht für mehrere Autos dasselbe Kennzeichen generiert.
|
||||
|
||||
|
||||
*/
|
||||
public class kennzeichenzufaelliggenerieren {
|
||||
|
||||
private static ArrayList<String> speichereEindutigeNummern = new ArrayList<>();
|
||||
private static String[] ersteZweiZeichen = { "MA", "HD", "KA", "FF", "ROK", "BW", "HH", "B", "D" };
|
||||
private static String[] zweiteZweizeichen = { "ME", "SH", "DF", "KC", "FT", "GH", "OM", "KL", "CV" };
|
||||
private static final ArrayList<String> speichereEindutigeNummern = new ArrayList<>();
|
||||
private static final String[] ersteZweiZeichen = { "MA", "HD", "KA", "FF", "ROK", "BW", "HH", "B", "D" };
|
||||
private static final String[] zweiteZweizeichen = { "ME", "SH", "DF", "KC", "FT", "GH", "OM", "KL", "CV" };
|
||||
private static String eindutigeZahlen = "";
|
||||
private static Random random = new Random();
|
||||
|
||||
public static String kennzeichenzufaelliggenerieren() {
|
||||
String zufaelligeKennzeichen = "";
|
||||
public static String kennzeichengenerieren() {
|
||||
String zufaelligeKennzeichen;
|
||||
|
||||
zufaelligeKennzeichen = ersteZweiZeichen[random.nextInt(ersteZweiZeichen.length)];
|
||||
zufaelligeKennzeichen += "-" + zweiteZweizeichen[random.nextInt(zweiteZweizeichen.length)] + " ";
|
||||
|
|
|
@ -5,4 +5,5 @@
|
|||
*
|
||||
*/
|
||||
module Parkhaus {
|
||||
requires org.junit.jupiter.api;
|
||||
}
|
Loading…
Reference in New Issue