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.