Bussgeldrechner

P

Porre...

Neues Mitglied
Hallo erstmal! Ich habe eine Hausaufgabe bekommen, einen Bussgeldrechner zu erstellen. Leider habe ich von dem ganzen Thema keine Ahnung und mir konnte auch der Lehrer nicht weiterhelfen. s gibt zwar schon ein paar Beiträge zu dem Thema, allerdings werde ich aus diesen Beiträgen nicht schlau. Hier einmal die Aufgabenstellung:

Erstelle ein einfaches Programm für die Punkteberechnung in Flensburg. Folgende Vorgaben müssen beachtet werden:

- Objektorientiert

- Variablen sind private

Eingaben:

- vorhandene Punkte:

- Geschwindigkeitsbegrenzung: 30 / 50 / 70 / 100 / 120

- Gemessene Geschwindigkeit:

Ausgabe:

- zusammenfassung der Strafe



Bussgeldkalalog:

ab 20 km/h mehr 20 Euro

ab 40 km/h mehr 50 Euro + 1 Punkt

ab 50 km/h mehr 100 Euro + 2 Punkte

ab 70 km/h mehr 120 Euro + 2 Punkte + 1 Monat Fahrverbot

ab 85 km/h mehr 200 Euro + 3 Punkte + 3 Monate Fahrverbot

ab 100 km/h mehr 300 Euro + 5 Punkte + Führerscheinentzug

ab 12 Punkte = Führerscheinentzug



Ich hoffe mir kann irgendwer helfen.
 
kneitzel

kneitzel

Top Contributor
Da ist erst einmal meine Frage: Woran hängt es denn? Wo gibt es Unklarheiten? Was für Gedanken hast Du Dir denn bisher gemacht?
 
P

Porre...

Neues Mitglied
Ich schaue mir die Aufgabe an und frage mich, was ich da überhaupt machen muss. Die Rechnungen könnte ich ja schriftlich erledigen, aber diese ganzen Sachen die man bei Java beachten muss, bringen mich zum verzweifeln.
 
MoxxiManagarm

MoxxiManagarm

Top Contributor
Die Rechnungen könnte ich ja schriftlich erledigen, aber diese ganzen Sachen die man bei Java beachten muss, bringen mich zum verzweifeln.

Dann versuch doch die Punkte einzeln aufzuschreiben und dann nach Java zu "übersetzen". Die Punkte könnten etwa so aussehen

1. vorhandene Punkte eingeben und speichern
2. die Geschwindingkeitsbegrenzung am Messungsort eingeben und speichern
3. die gemessene Geschwindigkeit eingeben und speichern
4. die Differenz aus Geschwindigkeitsbegrenzung und gemessener Geschwindigkeit berechnen und speichern
5. diese berechnete Differenz einem Datenset aus dem Bußgeldkatalog zuordnen
6. Falls Punkte hinzukamen überprüfen, ob die neue Anzahl Punkte 12 oder mehr ist, falls ja Führerscheinentzug dem Datenset hinzufügen
7. Datenset ausgeben

Ein Datenset sollte ein Objekt sein. Persönliche Empfehlung für die Zuordnung von berechneter Differenz zu Datenset ist eine TreeMap mit Verwendung von floorEntry. Anderenfalls wirst du ein recht großes if-else Konstrukt haben.
 
kneitzel

kneitzel

Top Contributor
Das bringt mir jetzt immer noch nicht wirklich einen Ansatz, wie ich Dir helfen könnte ...

Zumal ich auch etwas hin und her gerissen bin - die Forderung "objektorientiert" ist bei so einer kleinen Sache relativ schwer, denn vieles wird man nicht benötigen ...

Aber fangen wir mit dieser Forderung an:
Kannst Du da irgendwas unterteilen? Siehst Du da etwas?

Ich versuche Mal ein anderes Beispiel aufzubauen:
Duden-Applikation:
Es gibt also ein Objekt Duden, welches ganz viele EInträge hat.
Einträge haben: Einen Namen, eine Lautschrift, eine Liste von Beschreibungen / Bedeutungen.

Das war das offensichtliche der Modelierung schon. Aber wir brauchen ja eine kleine Applikation, die Eingaben entgegen nimmt und Ausgaben macht. Das kann man noch etwas trennen:

In der Applikation habe ich einen Controller. Der kennt die Logik des Programmes. Also der Nutzer muss ein Wort eingeben können. Wenn das Wort eingegeben wurde, muss der Controller prüfen, ob es das gibt um dann entweder einen Fehler oder die Details auszugeben.

Die Ausgabe kann man nun noch etwas trennen. Controller und ein Model haben wir - da kann man in den Worten des MVC Pattern bleiben und wir machen noch eine View.
Die View hat eine vorgegebene Funktionalität:
- Eingabe Wort
- Ausgabe Fehlermeldung
- Ausgabe Beschreibung

Sowas könnte man auch für dein Problem machen. Dann hättest Du erst einmal ein kleines Objektmodell.

Sowas könnte man umsetzen. Sprich: Die main Methode erstellt den Duden und initialisiert diesen (so das nicht schon im Konstruktor passiert). Dann werden Controller und View erzeugt und der Controller darf dann loslegen (mit der View).

So eine run Methode könnte sein: In einer Endlosschleife wird nach einem Wort gefragt (über die View). Ist dieses leer, beendet sich die Applikation. Ist dieses nicht leer, wird in der duden Instanz nachgeschaut, ob es das Wort gibt und es wird entweder ein Fehler ausgegeben oder die Details ...

Ein Datenset sollte ein Objekt sein. Persönliche Empfehlung für die Zuordnung von berechneter Differenz zu Datenset ist eine TreeMap mit Verwendung von floorEntry. Anderenfalls wirst du ein recht großes if-else Konstrukt haben.
Das sehe ich etwas anders. Die Strafe kann man schön in einem Model erfassen. Der Bussgeldkatalog ist einfach eine Menge von bekannten Strafen. Dann muss man lediglich alle Strafen durchgehen um zu schauen, ob man eine Strafe finden kann oder nicht. Wird keine Strafe gefunden, weil man nicht schnell genug gefahren ist, dann wäre dies auch ein Ergebnis (-> keine Strafe gefunden).
Da hat man dann eher eine objektorientierte Lösung ...
 
MoxxiManagarm

MoxxiManagarm

Top Contributor
Zumal ich auch etwas hin und her gerissen bin - die Forderung "objektorientiert" ist bei so einer kleinen Sache relativ schwer, denn vieles wird man nicht benötigen ...
Ich finde der Bußgeldkatalog sollte objektorientiert abgebildet werden. Ein Bußgeldeintrag (oben bei mir genannt Datenset) sollte ein Objekt sein und der Bußgeldkatalog eine Menge dieser Einträge (oben bei mir TreeMap empfohlen). Natürlich würde es auch ohne gehen, aber die Objektorientierung finde ich hier schon sauberer und wäre einfacher zu erweitern, falls man das wollte.

Das sehe ich etwas anders. Die Strafe kann man schön in einem Model erfassen. Der Bussgeldkatalog ist einfach eine Menge von bekannten Strafen.
Ich habe das Gefühl ich habe mich schlecht ausgedrückt, es kam falsch bei dir an. Ein Datenset ist bei mir eine Strafe, also ein Model.

Dann muss man lediglich alle Strafen durchgehen um zu schauen, ob man eine Strafe finden kann oder nicht. Wird keine Strafe gefunden, weil man nicht schnell genug gefahren ist, dann wäre dies auch ein Ergebnis (-> keine Strafe gefunden).
Und das ist das, was ich sehr umständlich finde. Wenn du die Strafen als Objekt von Strafe{ Preis, Punkte, Fahrverbot, Führerscheinentzug } in einer TreeMap<Double, Strafe> (oder ggf. Integer als key) speicherst (die TreeMap ist der Bußgeldkatalog), dann brauchst du dir mit floorEntry(calculatedDiff).getValue() nur noch die Strafe aus dem Katalog holen. Du musst nichts "durchgehen". Beim "durchgehen" müsstest du immer schauen zwischen welchen 2 Werten sich die Differenz befindet. Diese Umständlichkeit nimmt dir eine TreeMap ab.

Bußgeldrechner:
public class Bußgeldrechner {
    private NavigableMap<Integer, Strafe> bußgeldkatalog = new TreeMap<>();

    public Bußgeldrechner() {
        bußgeldkatalog.put(0, new Strafe(0, 0, 0, false));
        bußgeldkatalog.put(20, new Strafe(20, 0, 0, false));
        bußgeldkatalog.put(40, new Strafe(50, 1, 0, false));
        bußgeldkatalog.put(50, new Strafe(100, 2, 0, false));
        bußgeldkatalog.put(70, new Strafe(120, 2, 1, false));
        bußgeldkatalog.put(85, new Strafe(200, 3, 3, false));
        bußgeldkatalog.put(100, new Strafe(300, 5, 0, true));
    }

    public Strafe gibStrafe(int differenz) {
        return bußgeldkatalog.floorEntry(differenz).getValue();
    }

    public static void main(String... args) {
        Bußgeldrechner bußgeldrechner = new Bußgeldrechner();
        System.out.println(bußgeldrechner.gibStrafe(88));
        System.out.println(bußgeldrechner.gibStrafe(50));
    }
}
 
Zuletzt bearbeitet:
kneitzel

kneitzel

Top Contributor
Ok, dann hatte ich Dich nur falsch verstanden. Ich finde da so Begriffe wie "DataSet" etwas irritierend, denn da unterstelle ich dann gerne, dass da etwas nicht ausmodelliert wurde. Du bringst halt Implementierungsdetails rein, die hier aus meiner Sicht noch keine Rolle spielen. (Und die man ja auch anders machen könnte - mein Ansatz wäre halt ein anderer gewesen :) )

Wenn ich erst einmal nur die Elemente ausbaue, dann lasse ich das aussen vor. Da geht es dann erst einmal darum, was ich alles habe und brauche. Wo sehe ich logische Grenzen? Jetzt nehme ich dem AO aber sehr viel weg, aber hier sehe ich:
- Bussgeldkatalog mit Einträgen
- Einträge haben ein Kriterium und eine Strafe

Dann sehe ich eine Situation -> Die enthält Dinge wie Geschwindigkeitsbegrenzung, vorgeworfene Geschwindigkeit

Die Aufgabe trennt nicht, daher enthält die Situation auch sowas wie vorhandene Punkte des Fahrers ...

Dann könnte man sich überlegen, ob man nicht universell bleiben möchte: Das Kriterium könnte dann unter dem Strich etwas wie ein Predicate<Situation> sein. (Ich würde ein eigenständiges Functional Interface bauen, um den sauberen Namen zu haben. Denn evtl. gibt es ja eine Implementation wie GeschwindigkeitsCheck, die min / max Werte haben ... und Einträge haben sowas wie new GeschwindigkeitsCheck(20,40)?)

Also mir fallen da durchaus gewisse Möglichkeiten ein, da ein paar schöne Dinge zu bauen :)
 
Anzeige

Neue Themen


Oben