Autoververmietung

kitz

Mitglied
Also ich versuche das hier nochmal ein wenig zu sortieren.

Ich soll eine Autovermietung programmieren

Dazu habe ich folgende Klasse erstellt:

Java:
public class ErweitertesAuto extends EinfachesAuto {

    private String standort;
    private long fahrgestellnummer;
    

    public ErweitertesAuto () {
    }

    public ErweitertesAuto (String fahrer, String autotyp, String farbe,
            int erstzulassung, int leistung, int kmStand, String standort,
            long fahrgestellnummer) {

        super (fahrer, autotyp, farbe, erstzulassung, leistung, kmStand);
        this.standort=standort;
        this.fahrgestellnummer=fahrgestellnummer;
    }

    public String get_Standort () {
        return standort;
    }

    public void set_Standort (String standort) {
        this.standort=standort;
    }

    public long get_Fahrgestellnummer () {
        return fahrgestellnummer;
    }

    public void set_Fahrgestellnummer (long fahrgestellnummer) {
        this.fahrgestellnummer=fahrgestellnummer;
    }

    

    public void info () {
        ErweitertesAuto a = new ErweitertesAuto ();
        System.out.println ("Daten des Fahrzeugs:\n ");
        System.out.println ("Fahrer: " +a.get_Fahrer ());
        System.out.println ("Autotyp: " +a.get_Autotyp ());
        System.out.println ("Farbe: " +a.get_Farbe ());
        System.out.println ("Erstzulassung: " +a.get_Erstzulassung ());
        System.out.println ("Leistung: " +a.get_Leistung());
        System.out.println ("Fahrgestellnummer: " +a.get_Fahrgestellnummer());
    }

    private String Ziel;
    private int Entfernung;

    public int faehrtNach (String Ziel, int Entfernung) {
        ErweitertesAuto a = new ErweitertesAuto ();
        System.out.println ("Das Auto fährt von Lübeck nach " +Ziel+ " :" +Entfernung+ "km");
        return a.get_KmStand ();
    }

}

Nun habe ich dazu folgende Aufgabenstellung:

5. Programmieren Sie eine Klasse Autoverwaltung mit folgenden Eigenschaften. Die Klasse Autoverwaltung besitzt die Klassenvariablen anzahlVermieteteAutos, gesamtFahrleistung vom Typ int und durchschnittlicheFahrleistung vom Typ double. Dadurch sind die Anzahl der vermieteten Autos jederzeit verfügbar. Das gleiche gilt für die Fahrleistung aller Autos. Deklarieren Sie die genannten Eigenschaften als static.

Deklarieren Sie in Autoverwaltung ein statisches Objektarray autos[]von Objekten der Klasse ErweitertesAuto. DieLänge des Objektarrays sei 10.Erzeugen Sie in der Klasse Autoverwaltung fünfObjekte von ErweitertesAuto.

Die Klasse Autoverwaltung besitzt dazu die statische Methoden vermietung(). Die statische Methode vermietung() soll innerhalb eines Dialogs (einfache while(true)- Schleife) einen Vermietungsvorgang (in stark vereinfachter Form) abbilden. Sie wird von der Klassenmethode dialog() aufgerufen, die dem Nutzer die Auswahl zwischen vermieten() und der Klassenmethode info() ermöglicht. Die freien Autos sollen angezeigt werden. Dann nimmt vermietung() Fahrerdaten, die Fahrzeugdaten und das Fahrtziel auf. Der Status des betreffenden Autos ist nun "vermietet". Die Klassenmethode control() soll jederzeit die Übersicht über den Fuhrpark, die Gesamtzahl der vermieteten Autos, die gesamte Fahrleistung aller Autos und die durchschnittliche Fahrleistung pro Auto ausgeben. Die Klasse Autoverwaltung wird in der Datei Autoverwaltung.java gespeichert.



Und ich habe nun ein Problem mit der Vermietung. Denn ich weiß nicht genau, wie ich ihm sagen soll, dass er nur die freien Autos aufrufen und die Daten ausgeben soll bzw. wie ich dann nach dem Vermietungsvorgang, wenn also ein Auto gemietet wurde, das Auto auf vermietet setzen kann, so dass es in der Liste der freien Autos nicht mehr auftaucht.

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Autoverwaltung {

   
   static  int anzahlVermieteAutos;   
   static  int gesamtFahrleistung;
   static  double durchschnittlicheFahrleistung;

    

  static ErweitertesAuto autos[] = new ErweitertesAuto[10];   
public static void main(String[] args) throws IOException {

   
      autos[0] = new ErweitertesAuto(" ", "Auto ","rot",1980, 110,230000,"München",15498);
      autos[1] = new ErweitertesAuto("", "Auto","gelb",2001, 120,25900,"Rostock",15468);
      autos[2] = new ErweitertesAuto("", "Auto","blau",2005, 89,5000,"Berlin",15426);
      autos[3] = new ErweitertesAuto("", "Bagger","grün",1999, 55,100000,"Hamburg",33256);
      autos[4] = new ErweitertesAuto("", "Auto","silber",2000, 205,50000,"Trier",15487);

  
    boolean fertig = false; 


    while(!fertig){
      System.out.println("Herzlich Willkommen zu Fahrzeugvermietung");
      System.out.println("Wählen Sie nun zwischen "
            +"\n" +"[1]Informationen über Fahrzeuge"
            +"\n" +"[2]Fahrzeug ausleihen"
            +"\n" +"[3]Gesamtübersicht"
            +"\n" +"[4]rogramm beenden");


    BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
    int  auswahl = Integer.parseInt(eingabe.readLine());

    switch(auswahl) {


        case 1: ;
        break;
        case 2: vermietung();
        break;
        case 3: ct();
        break;
        case 4: System.exit(-1);

     }  fertig= false;  
   }
     }

 
  public static void vermietung() throws IOException{

boolean vermietet=false;

    for (int i = 0;i < 5;i++){
       System.out.println("Auto "+(i+1)+":");
   
       
       if (autos[i].vermietet) {
           autos[i].info ();
    }
    }

     BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in)); 

    System.out.println("\nEntscheiden Sie sich für ein Auto");
    int auswahl = (Integer.parseInt(eingabe.readLine())-1);

    System.out.println("Bitte geben Sie ihren Namen ein");
    autos[auswahl].set_Fahrer(eingabe.readLine());

    System.out.println("Bitte geben Sie ihr Fahrziel ein");
    String fahrtziel = eingabe.readLine();

    System.out.println("Bitte geben Sie die Entfernung ein");
    int entfernung = Integer.parseInt(eingabe.readLine());


    autos[auswahl].faehrtNach(fahrtziel, entfernung);
  
    anzahlVermieteAutos++;
    gesamtFahrleistung = gesamtFahrleistung + entfernung;


    }
  

    public static void ct(){
     System.out.println("Fahrzeug-Gesamtübersicht");
     System.out.println("Vermietete Autos : "+anzahlVermieteAutos);
     System.out.println("Gesamtfahrleistung "+gesamtFahrleistung);


     if (!(anzahlVermieteAutos == 0)) {
     durchschnittlicheFahrleistung = gesamtFahrleistung / anzahlVermieteAutos;
     }
     System.out.println("Durchschnittliche Fahrleistung "+ durchschnittlicheFahrleistung);
     System.out.println("Gesamtübersicht : ");
    
    }

  
     public static void dialog() throws IOException
     { 


      dialog();
      }

}


Dass die Zeilen 57 bis 68 nicht richtig sind weiß ich, und genau da liegt mein problem.
Ich weiß nicht wie ich ihm das sagen soll.

Zudem habe ich noch das Problem, dass mit die Daten zu den jeweiligen Autos aus dem Array nicht angezeigt werden können.
Hatte gerade schon dazu in einem anderen Beitrag einen Hinweis erhalten, aber das hat bei mir trotzdem nicht funktioniert. Ich bekomme da lauter nullen.
Mag vielleicht dumm rüberkommen, aber irgendwie habe ich mich da total verknotet und sehe den Wald vor lauter Bäumen nicht mehr.
 

Sempah

Bekanntes Mitglied
Und ich habe nun ein Problem mit der Vermietung. Denn ich weiß nicht genau, wie ich ihm sagen soll, dass er nur die freien Autos aufrufen und die Daten ausgeben soll bzw. wie ich dann nach dem Vermietungsvorgang, wenn also ein Auto gemietet wurde, das Auto auf vermietet setzen kann, so dass es in der Liste der freien Autos nicht mehr auftaucht.

Du könntest entweder deinem Auto eine weitere Variable mitgeben (boolean vermietet), oder man könnte z.B. sagen:
Java:
if (autos[i].getFahrer().equals("")) ...
Also wenn kein Fahrer gesetzt ist, sollte das Auto nicht vermietet sein.

Ich bekomme da lauter nullen.

Java:
ErweitertesAuto a = new ErweitertesAuto ();
System.out.println ("Daten des Fahrzeugs:\n ");
System.out.println ("Fahrer: " +a.getFahrer());

Was sollte sonst auch kommen? Du rufst schließlich nur den Standard Konstruktor (ohne Argumente) auf.
Du möchtest sicherlich lieber die Daten deines aktuellen Objektes. Versuch mal:


Java:
System.out.println ("Daten des Fahrzeugs:\n ");
System.out.println ("Fahrer: " +this.getFahrer());

this
 

Suinos

Bekanntes Mitglied
Zu [c]ErweitertesAuto[/c]:
kitz hat gesagt.:
[java=8]
public ErweitertesAuto () {
}
[/code]
Ist das so vorgegeben?

Wenn ja:
... doofe Schulaufgaben!

Wenn nein:
Entferne diesen leeren Konstruktor lieber, da er seinen Zweck nicht erfüllt.

kitz hat gesagt.:
[java=20]
get_Standort
[/code]
Laut den Code Conventions müsste das '_' weg, danach also so aussehen:
Java:
public String getStandort()
(Natürlich nicht nur bei dieser Methode, sondern bei allen!)

kitz hat gesagt.:
[java=49]
private String Ziel;
private int Entfernung;

public int faehrtNach (String Ziel, int Entfernung) {
ErweitertesAuto a = new ErweitertesAuto ();
System.out.println ("Das Auto fährt von Lübeck nach " +Ziel+ " :" +Entfernung+ "km");
return a.get_KmStand ();
}
[/code]
Uh.. was genau hast du hier versucht zu erreichen?

Ausserdem:
  • Dir fehlt ein Attribut, mit welchem ein Auto sagen kann, ob es vermietet ist oder nicht, wie Sempah bereits richtig sagte.
  • Du solltest dir Gedanken zur Formatierung des Codes machen, dann kannst du dein Geschriebenes auch besser lesen.

[ot]
Bin ich der einzige, der solche Schulaufgaben einfach nur mies findet?
Zum Beispiel:
Klasse Autoverwaltung besitzt die Klassenvariablen anzahlVermieteteAutos, gesamtFahrleistung vom Typ int und durchschnittlicheFahrleistung vom Typ double
:arrow: Methoden, die diese Dinge berechnen und zurückgeben

Oder:
Die Klasse Autoverwaltung besitzt dazu die statische Methoden vermietung()
WTF?! Was sollen die Schüler daraus lernen? Überall dort [c]static[/c] hinzuzufügen, wo man will?
[/ot]
 

kitz

Mitglied
Es klappt!!
Vielen vielen Dank euch beiden. War ja nicht so dramatisch wie ich dachte.

Eine Frage hab ich allerdings noch.

Und zwar heißt es weiter vorne in der Aufgabenstellung: (insgesamt sind 5 Dateien zu erstellen bei der gesamten Aufgabe)

1. Programmieren Sie eine Klasse EinfachesAuto mit folgenden Eigenschaften: die Klasse EinfachesAuto besitzt die Attribute fahrer, autotyp, farbe vom Typ String. Weiterhin die Attribute erstzulassung, leistung und kmStand vom Typ int. Deklarieren Sie die genannten Eigenschaften als private oder falls erforderlich als protected und deklarieren Sie geeignete set- und get-Methoden für den Zugriff auf private und protected- Attribute. Zeigen Sie, daß der Zugriff auf als private deklarierte Elemente aus der Testklasse möglich, aus der abgeleiteten Klasse aber nicht möglich ist.


Mir ist klar, dass es um die Zugriffsrechte geht, aber was heißt denn falls erforderlich? Woher weiß ich denn was ich protected machen muss? Ich habe das alles auf private gesetzt und es funktioniert ja so auch.

Ach und ja der Konstruktor ist so vorgegeben
 
Zuletzt bearbeitet:

SegFault

Bekanntes Mitglied
alles was du auch im erweiterten Auto zugreifen musst, sollte protected sein. Das du ansonsten innerhalb der erweiterten Klasse nicht mehr an die Variablen rankommst. Aktuell geht das ganz deswegen weil du für alles getter und setter hast die du in der abgeleiteten Klasse aufrufst. Aber an die eigentliche Variable für Fahrer etc kommst du nur ran wenn sie protected ist. Wie man das aber wirklich zeigen kann weiss ich nicht. Habs noch nie probiert ob der compiler das überhaupt macht wenn man versucht auf private variablen in einer abgeleiteten Klasse zu zu greiffen. Im Rahmen der aufgabe denke ich mal das du die Variablen wie Fahrer etc als protected deklarieren sollst
 

Oben