Übungsprojekt - Autobewertung
Jedes Jahr werden in Deutschland mehrere hundert Tausend Autos gekauft und verkauft. Bei Gebrauchtwagen stellt sich dann immer die Frage: Wie viel ist ein Auto noch wert? Egal ob man selbst ein Auto kaufen oder verkaufen möchte, eine möglichst genaue Abschätzung des Wertes ist nicht ganz einfach, aber natürlich sehr wichtig. Man stellt sich dann Fragen wie:
- Wie viel ist mein Auto noch wert?
- Wenn ich 5000,- Euro zur Verfügung habe, was für ein Auto bekomme ich dafür?
- Sollte ich mein Auto noch behalten, da der Wertverlust jetzt besonders hoch ist?
- ...
Ziel ist es ein Modell eines Autos zu programmieren, mit dem sich diese und ähnliche Fragen beantworten lassen.
Ein mathematisches Modell für ein Auto finden
Um die Preisentwicklung von Autos mathematisch zu modellieren, kann man z.B. die Inseratspreise von Autos sammeln und auswerten. Betrachtet man sich die Preise z.B. für einen VW Golf ergibt sich folgendes Bild:
Ob man nun das Alter, die Laufleistung, die Zahl der Vorbesitzer oder andere Faktoren
betrachtet: Der Marktwert verringert sich immer, wenn einer dieser Faktoren wächst.
Dabei ist der Wertverlust am Anfang eher hoch, wird dann aber immer kleiner.
Ob ein Auto 0km oder 10.000km gefahren ist macht einen großen Unterschied
im Preis aus, während der Wertverlust zwischen 240.000km oder 250.000km Fahrleistung
beinahe vernachlässigbar ist.
Analog verhält es sich mit dem Alter oder der Zahl der Vorbesitzer.
Für den Anfang reicht es, das Alter des Autos zu berücksichtigen.
Wenn man den Restwert eines Autos in Abhängigkeit vom Neupreis und dem Alter
berechnen möchte, benötigt man also eine Funktion, die ungefähr folgendermaßen aussieht:
Aufgabe 1
Finde eine Funktion f, die folgenden Zusammenhang näherungsweise erfüllt:
restwert = neupreis * f(alter)
Beachte: Die Funktion schneidet die y-Achse. (Warum muss das so sein?)
Tipp: Du kannst Deine Ideen auch mit einem Funktionsplotter
oder Geogebra testen.
Ein objektorientiertes Modell für ein Auto finden
Um ein Auto im Computer darstellen zu können, müssen wir (z.B.) ein objektorientiertes Modell dazu finden. Dazu müssen wir uns fragen:
- Welche Eigenschaften sind für ein Auto relevant?
- Welche Fähigkeiten muss ein Auto besitzen?
Oder anders ausgedrückt:
- Welche Attribute muss ein Auto besitzen?
- Welche Methoden muss ein Auto besitzen?
Wesentliche Eigenschaften sind sicher: Der Neupreis und das Alter eines Autos. Wesentliche Fähigkeiten sind sicher: "Berechne den aktuellen Marktwert", "Berechne den Wertverlust" oder "Berechne den zu erwartenden Händler-Einkaufspreis". Letzterer liegt sicher unter dem Marktwert, da der Händler an dem Auto ja auch verdienen möchte.
Ein Klassendiagramm könnte also folgendermaßen aussehen:
Methoden, die Werte berechnen und zurück geben, werden üblicherweise mit
get... begonnen.
In der UML werden Kommazahlen mit dem Datentyp Real
bezeichnet.
In Java gibt es diesen Datentyp nicht, hier wird double
benutzt.
Nähere Informationen zu double
Es gibt in Java mehrere Datentypen für Kommazahlen, die sich in ihrer
Genauigkeit unterscheiden.
Der Datentyp double
ist der Datentyp, der meistens für Kommazahlen
benutzt wird.
Man spricht hier von "doppelter Genauigkeit", da er doppelt so viel Speicherplatz
benötigt wie der Datentyp float
.
Aufgabe 2
Betrachte die verwendeten Datentypen und die Signatur der Methoden. Begründe die Auswahl. Welche Alternativen hätte es noch gegeben? Warum benötigen die Methoden hier keine Parameter, z.B. für das Alter?
Ein Automodell objektorientiert implementieren
Wie man das Klassendiagramm mit Hilfe von BlueJ und Java umsetzt, zeigt Dir der Screencast:
Aufgabe 3
- Probiere das selbst aus. Du kannst den Screencast jederzeit pausieren oder zurückspulen.
- Erstelle auch ein Auto-Objekt und rufe die bisher implementierten Methoden auf. Erkläre die Ergebnisse.
- Welche Bedeutung hat das
return
? - Was bewirkt der Ausdruck
Math.pow(0.87, alter)
? - Was passiert bei der Ausführung der Zeile
return neupreis - getMarktwert();
genau? - Ergänze die noch fehlende Methode
double getHaendlerEK()
. Der Händler-Einkaufspreis soll sich aus 80% des Marktwertes ergeben.
Objekte initialisieren
Das Auto besitzt noch nicht das gewünschte Verhalten. Es muss möglich sein die Attribute, z.B. bei
der Erzeugung des Objektes, mit entsprechenden Werten zu belegen.
Dies erreicht man durch Einführung eines Konstruktors.
Man kann diesen auch im Klassendiagramm darstellen.
Dort ordnet man ihn dann bei den Methoden ein.
In manchen Sprachen spricht man auch von der "Konstruktormethode".
In Java ist das eher unüblich, da es (unabhänig von Java) einige Unterschiede zwischen gewöhnlichen
Methoden und Konstruktoren gibt.
Im Quellcode wird der Konstruktor - üblicherweise zwischen Attributen und Methoden - folgendermaßen ergänzt:
Aufgabe 4
- Füge den Konstruktor ein und teste Dein Programm.
- Beschreibe Gemeinsamkeiten und Unterschiede zwischen Konstruktoren und Methoden.
Attributwerte verändern
Wirklich nützlich wird das Programm erst, wenn man auch mit den Attributwerten experimentieren kann, und testen kann wie sich z.B. eine Veränderung des Alters auf den Wert des Autos auswirkt.
Wenn Du den Objektinspektor aufrufst, wirst Du allerdings merken, dass Du dort
den Wert der Attribute nur sehen, aber nicht verändern kannst.
Normalerweise greift man auf Attribute nur indirekt über Methoden zu.
Warum das so ist, wirst Du im nächsten Projekt genauer erfahren.
Du benötigst also eine Methode, die nichts anderes macht, als den Attributwert
für das Attribut alter
zu verändern.
Der folgende Screencast demonstriert dies:
Das Klassendiagramm hat nun folgende Gestalt:
Aufgabe 5
Probiere das selbst aus.Aufgabe 6 - Erweiterung des Klassendiagramms
Ergänze ein Attribut für den Kilometerstand und eine entsprechende set-Methode im Klassendiagramm.
Aufgabe 7 - Erweiterung der Implementierung
Ergänze die Implementierung um den Kilometerstand und eine entsprechende set-Methode. Der Marktwert soll außer dem Alter jetzt auch noch den Kilometerstand berücksichtigen. Ergänze dazu analog zum Faktor für das Alter einen weiteren Faktor zum Kilometerstand. Tipp: Es fällt leichter eine geeignete Basis zu finden, wenn man festlegt, dass der Kilometerstand in "Tausend Kilometer" angegeben wird.
Aufgabe 8 - Eigene Ideen
Überlege wie sich die Modellierung verbessern lässt. Ergänze das Klassendiagramm und setze die Ideen im Programm um.
Grenzen von Modellen
Wir haben oben Modelle entwickelt, um den Wert eines Autos zu berechnen. Modelle vereinfachen dabei sehr häufig die zu beschreibende Realität.
Aufgabe 9
Welche Grenzen hat das bisher benutzte Modell? Wie könnte man das Modell verbessern?Quellen
- [1]: Austin A110 - Urheber: Redsimon - Lizenz: CreativeCommons BY 2.5
- [2]: Preisentwicklung Golf in Abhängigkeit vom Alter - Urheber: Autoscout24 - Lizenz: Gemeinfrei
- [3]: Preisentwicklung Golf in Abhängigkeit vom Kilometerstand - Urheber: Autoscout24 - Lizenz: Gemeinfrei