4. Der Verbrauch
Um das Projekt etwas realistischer zu gestalten, wollen wir jetzt einbauen, dass ein Kfz bei einer Fahrt Benzin verbraucht - je länger die Fahrtstrecke, desto mehr. Dazu muss der Verbrauch des Kfz bekannt sein (angegeben in "Liter pro 100 km").
Klasse Kfz
Attribute
Wir fügen ein neues Attribut ein: verbrauch
speichert, wie oben erwähnt, den Benzinverbrauch in Liter pro 100 km Fahrstrecke. Beim Verbrauch sind Dezimalangaben üblich, deshalb ist der Datentyp double
.
Das Fahren einer bestimmten Strecke führt zu einem bestimmten Benzinverbrauch, der oft Nachkommastellen aufweist. Dieser Verbrauch muss von tankAktuell
subtrahiert werden (siehe unten, Methode fahre()
). Deshalb muss tankAktuell auf double
geändert werden, damit dort auch Nachkommazahlen gespeichert werden können.
Damit sieht die Attributliste so aus:
private String marke;
private int kmStand;
private int tankMax;
private double tankAktuell;
private double verbrauch;
Konstruktor
Im Konstruktor wird verbrauch
als Parameter ergänzt und dem Attribut zugewiesen. In der letzten Anweisung wird die Information zum Verbrauch ergänzt.
public Kfz(String marke, int tankMax, double verbrauch) {
this.marke = marke;
this.kmStand = 0;
this.tankMax = tankMax;
this.tankAktuell = 0;
this.verbrauch = verbrauch;
System.out.println("---------------------------------");
System.out.println("Objekterstellung " + this.marke);
System.out.println("(" + tankMax + " Liter-Tank, Verbrauch " + this.verbrauch + " Liter auf 100 km)");
}
Getter und Setter
Der Verbrauch eines Kfz-Objekts muss nie geändert werden. Deswegen ist nur der Getter sinnvoll.
public double getVerbrauch() {
return this.verbrauch;
}
Die Methode streckenVerbrauch()
In der Methode fahre()
wird der Benzinverbrauch für die geplante Fahrstrecke benötigt. Dafür schreiben wir eine Methode streckenverbrauch()
, die den Verbrauch für eine bestimmte Strecke zurückgibt. Diese Methode kann dann in fahre()
verwendet werden (siehe unten).
Die benötigte Formel lautet:
Streckenverbrauch = Strecke (km) • Verbrauch (Liter/100 km) / 100
Da beim Streckenverbrauch auch Nachkommastellen möglich sind, ist der Rückgabetyp double
.
public double streckenVerbrauch(int strecke) {
return strecke * this.verbrauch / 100;
}
Die Methode fahre()
Die Methode wird ergänzt:
Zu Beginn werden ,zusätzlich zur geplanten Fahrtstrecke, der aktuelle Tankstand und der dafür benötigte Streckenverbrauch auf der Konsole ausgegeben. Der Streckenverbrauch wird mit der Methode streckenVerbrauch()
berechnet.
Dann wird wie gehabt der km-Stand mit setKmStand()
aktualisiert.
Zusätzlich wird der Tankstand (Attribut tankAktuell
) aktualisiert. Der Wert von streckenVerbrauch() muss subtrahiert werden. Deswegen erhält die Methode setTankAktuell()
als Parameter-Wert: tankAktuell
minus streckenverbrauch(strecke)
.
Zum Schluss wird zusätzlich zum neuen km-Stand auch der neue Tankstand ausgegeben.
public void fahre(int strecke) {
System.out.println("---------------------------------");
System.out.println("Fahrtvorgang " + this.marke + ":");
System.out.println("Tankstand : " + this.tankAktuell + " Liter");
System.out.println("Geplante Fahrtstrecke : " + strecke + " km");
System.out.println("Streckenverbrauch : " + streckenVerbrauch(strecke) + " Liter");
setKmStand(this.kmStand + strecke);
setTankAktuell(this.tankAktuell - streckenVerbrauch(strecke));
System.out.println("neuer Km-Stand : " + this.kmStand + " km");
System.out.println("neuer Tankstand : " + this.tankAktuell + " Liter");
}
Klasse Verkehr
In der Klasse Verkehr wird ein Objekt erzeugt, dann einmal die Methode tanke()
und 3 mal die Methode fahre()
aufgerufen.
public class Verkehr {
public static void main(String[] args) {
Kfz kfz1 = new Kfz("VW", 55, 6.5);
kfz1.tanke(50);
kfz1.fahre(320);
kfz1.fahre(100);
kfz1.fahre(500);
}
}
Ausführen der Klasse Verkehr
führt zur Konsolenausgabe:
--------------------------------- Objekterstellung VW (55 Liter-Tank, Verbrauch 6.5 Liter auf 100 km) --------------------------------- Tankvorgang VW: Max. moegl. Tankmenge: 55.0 Liter. Gewuenschte Tankmenge: 50 Liter. 50 Liter getankt, neuer Tankstand: 50.0 Liter. --------------------------------- Fahrtvorgang VW: Tankstand : 50.0 Liter Geplante Fahrtstrecke : 320 km Streckenverbrauch : 20.8 Liter neuer Km-Stand : 320 km neuer Tankstand : 29.2 Liter --------------------------------- Fahrtvorgang VW: Tankstand : 29.2 Liter Geplante Fahrtstrecke : 100 km Streckenverbrauch : 6.5 Liter neuer Km-Stand : 420 km neuer Tankstand : 22.7 Liter --------------------------------- Fahrtvorgang VW: Tankstand : 22.7 Liter Geplante Fahrtstrecke : 500 km Streckenverbrauch : 32.5 Liter neuer Km-Stand : 920 km neuer Tankstand : 22.7 Liter
Die ersten 2 Fahrten werden korrekt ausgeführt.
Der letzte Fahrtvorgang ist problematisch:
Der Tankstand reicht nicht mehr für die geplante Fahrtstrecke. Der Streckenverbrauch ist höher als tankAktuell
. Der Tankstand wird nicht aktualisiert, weil er kleiner als 0 würde. Das wird im Setter setTankAktuell()
verhindert. Aber der km-Stand wird trotzdem erhöht, als hätte die Fahrt stattgefunden!
Das ist ein Fehler, den wir im nächsten Schritt korrigieren müssen.