*UPDATE* Organisationsfrage im Code

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • *UPDATE* Organisationsfrage im Code

    !!! Die Frage wurde beantwortet, bitte ganz am Ende schaun, dort steht die nächste ;) Danke :) !!!


    Hallo Coder-Community!

    Wir haben in der Schule jetzt angefangen mit BlueJ zu arbeiten (ich bin in der Stufe 11) und haben dazu einen Lehrgang bekommen, den irgendein Kollege von unserem Informatiklehrer ins Netz gestellt hat. Ich bin jetzt gerade dabei, diesen Lehrgang nachzuvollziehen, bin aber an einer Stelle jetzt unsicher.

    In der Aufgabenstellung steht, dass eine Methode, die man einfach nur abtippen sollte, fehlerhaft sei. Wir sollen nun rausfinden, wo der Fehler liegt und ihn beheben. Doch ich kann mir bisher nicht vorstellen, wo ein fehler liegen sollte.

    Ich poste mal den bisherigen Code:

    Quellcode

    1. public class Auto
    2. {
    3. // Attribute
    4. double tankvolumen, benzinstand;
    5. double verbrauch, kmstand;
    6. // Konstruktoren
    7. public Auto()
    8. {
    9. tankvolumen = 70.0; // L
    10. benzinstand = 50.0; // L
    11. verbrauch = 8.6; // L pro 100 km
    12. kmstand =77000; // km
    13. }
    14. public Auto(double tv, double bst, double verb, double km)
    15. {
    16. tankvolumen = tv;
    17. benzinstand = bst;
    18. verbrauch = verb;
    19. kmstand = km;
    20. }
    21. // Oeffentliche Methoden
    22. public void tanken(double liter)
    23. {
    24. benzinstand = benzinstand + liter;
    25. }
    26. public void anzeigen()
    27. {
    28. System.out.println("Tankvolumen = "+tankvolumen+" Liter");
    29. System.out.println("Benzinstand = "+benzinstand+" Liter");
    30. System.out.println("Verbrauch = "+verbrauch +" Liter/100 km");
    31. System.out.println("km-Stand = "+kmstand +" km");
    32. }
    33. // Private Methoden
    34. }
    Alles anzeigen


    Es geht um die Methode tanken(). Das einzige, was mir als Laie bisher ein bisschen komisch vorkommt ist, dass die Methode tanken(double liter) genannt wird, ich würde liter ja noch als l deklarieren und dann nur tanken(double l) benutzen (ich hoffe das ist verständlich :D).

    Ich zitiere mal die Aufgabenstellung:
    Die Methode tanken() ist noch fehlerhaft.

    a) Warum ist die Methode noch fehlerhaft; was könnte man besser machen? (1 Punkt)

    b) Verbessern Sie die Methode entsprechend! (2 Punkte)


    Was meint ihr dazu?

    lg, Skyclimber

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Skyclimber ()

  • Hallo Skyclimber !!!

    Nun also erstmal folgendes sind zwar keine Fehler aber ist mir eben aufgefallen

    besser ist es du machst die Instanzvariablen so :

    Quellcode

    1. private double tankvolumen, benzinstand verbrauch, kmstand;

    sind ja alles double werte heißt du sparst dir so Zeit
    und am besten wäre noch private ran zusetzen aber ist wahrscheinlich bei euch noch nicht dran gewesen
    als nächstes solltest du im Konstruktor immer this verwänden um sicher zugehen das du auch die richtigen variablen veränderst

    Quellcode

    1. public Auto()
    2. {
    3. this. tankvolumen = 70.0; // L
    4. this.benzinstand = 50.0; // L
    5. this.verbrauch = 8.6; // L pro 100 km
    6. this.kmstand =77000; // km
    7. }



    so nun zu deinem Fehler in der Methode tanken ()

    also eigentlich ist die Methode so wie sie ist richtig zumindest von der synatax her doch was passiert denn wenn ich jetzt eben 50.00L in meinem Auto habe und tanke nochmals 50.00l dazu
    obwohl mein tankvolumen nur 70.00l beträgt ??? Genau der Tank läuft über also folgendes:

    Quellcode

    1. public void tanken(double liter)
    2. {
    3. benzinstand = benzinstand + liter;
    4. if (benzinstand > tankvolumen ){
    5. .................
    6. }


    in die if abfrage setzt du nun eine Fehler Ausgabe mit System.out.println() oder du setzt den Benzinstand auf das Tankvolumen da dies das Maximalvolumen ist !!!
    (hab ich mit absicht nicht vollständig hier gemacht ;) du willst ja auch noch was spaß haben )

    so mehr fällt mir dazu auch nicht ein

    Viele Grüße !
  • Heyho :)

    Vielen Dank für die Antwort :)

    Ich habe mir jetzt gerade mal noch die nächste Aufgabe angeschaut, da ist wieder von einer fehlerhaften Methode die Rede, diesmal jedoch mit dem Zusatz, dass etwas bestimmtes passieren könnte. Also scheint die Sache mit dem Tankvolumen, die du angesprochen hast wohl richtig zu sein Pirate :D Klar war mir das schon vorher, nur kam mir die Aufgabenstellung so vor, dass wirklich ein Fehler darin stecken würde :D

    Das mit private kam noch nicht wirklich vor, doch ist mir klar, dass Variablen, die mit private gekennzeichnet sind nur in der jeweiligen Methode vorhanden sind, Variablen mit public in jeder beliebigen. Richtig so weit? xD

    Ich werde das mal noch umändern, danke :)

    So, mit der if-Abfrage... Ich habe es nun so gelöst, ist das so richtig? (Der Debugger meckert nicht, und die Ergebnisse stimmen eig auch :D)

    Quellcode

    1. public void tanken(double liter)
    2. {
    3. if (liter <= (tankvolumen - benzinstand))
    4. {
    5. benzinstand = benzinstand + liter;
    6. }
    7. else
    8. System.out.println("Der Tank ist zu klein für diese Menge Benzin!");
    9. }


    Vielen Dank für die Antwort auf jeden Fall, jetzt komme ich zumindest mal weiter :D
  • Ja ganz genau so kann man es auch lösen :) .....

    zu private und public vorsicht es geht hier nicht um die Methoden die es geht viel mehr um Klassen wenn du deine variable private setzt kann dies nur von der jeweiligen Klasse in der sie steht gesehn werden ! und somit gehst du auch sicher das diese variable nicht von inneren Klassen , packet Klassen oder externe Klassen überschrieben wird die eventuell auch eine Variable mit dem gleichen namen bestizen ist auch einfach eine Stil frage also private gehört meiner meinung nach zu einem guten Programmierstil genau so wie this. aber vorsicht es kann später auch fälle geben wo du manche variablen vieleicht public setzen müsstest aber ist ehr selten also ich habs zumindest noch nicht gebraucht !
  • Ja das mit dem this. ist etwas komplizierter also die definition heißt eigentlich :
    this =
    Schlüsselwort, mit dem eine Methode oder ein Element der Klasse, in der dieses Wort steht, qualifiziert werden kann.

    So ich versuche dir das mal mit eigenen worten zu erklären wenn du nun deine Auto Klasse hernimmst und dir zwei objekte erstellst also sagen wir Mercedes und Opel
    nun nehmen wir mal an es gäbe in der Klasse Auto eine Methode alter() die das alter des Autos anzeigt und um darauf zugreifen zu können sagen wir einfach Mercedes.alter() so jetzt greifen wir auf die instanz alter() der Klasse auto zu tun dies aber von außerhalb da die Main methode in der das objekt erstellt wird wahrscheinlich in einer Testklasse steht das gleiche können wir auch mit Opel.alter() tun so wenn wir jetzt aber in der Klasse Auto selbst sind und möchten auf alter() zugreifen tun wir dies durch this.alter() gemeint ist damit die instanz der Klasse in der wir uns gerade befinden also wir tun nichts anderes wie wenn wir einen Objekt namen davor schreiben würden was wir hier aber ja noch nicht tun können da wir ja kein objekt besitzen das this kann auch weggelassen werden ... also meine erklärung vorhin this verwenden damit du weißt das du genau diese variable meinst ist zwar richtig aber etwas sehr einfach ausgedrückt und nur die halbe wahrheit also ich habs mir so gemerkt

    so ich hoffe du findest mein beispiel nicht zu verwirrend und hast so einigermaßen verstanden um was es geht ????

    vieleicht kann es hier noch jemand etwas besser erklären bzw frag einfach deinen lehrer das gibt eventuell plus punkte :)

    auch kann ich dir empfehlen : openbook.galileocomputing.de/javainsel8/

    das ist ein kostenloses E-Book das dir als Anfänger sicher weiterhelfen kann oder du kaufst dir einfach die druckversion davon
  • Hmm, ein wenig verwirrend ists schon xD Aber ich versuch mich mal durchzubeißen :D

    Wenn ich jetzt mitm Mercedes.alter() und mit Opel.alter() arbeiten würde, heißt das dann, dass ich alter() von zwei unterschiedlichen Objekten benutze, die dann auch jeweils nen anderen Wert haben, der seperat gespeichert wird? Und wenn wir in der Klasse sind und dadurch kein Objekt haben benutzt man this.alter() um sich auf alter() innerhalb der Klasse zu beziehen?

    Und danke für den Link, ich werdes mir mal anschaun :D

    lg, Sky
  • Ja ich glaube du hast es verstanden ..... Ja die beiden Objekte können ein unterschiedliches Alter haben wenn du es im konsturktor so übergibst also folgendermaßen :


    Quellcode

    1. public Auto(double tv, double bst, double verb, double km, int a)
    2. {
    3. this.alter = a;
    4. this.tankvolumen = tv;
    5. this.benzinstand = bst;
    6. this.verbrauch = verb;
    7. this.kmstand = km;
    8. }


    Das ist der Konstruktor in der Klasse Auto die jetzt zusätzlich die Instanzvariable alter bekommen hat die im Konstruktor mit a belegt wird

    so in der Test Klasse wird nun folgendes gemacht bzw Main klasse

    Quellcode

    1. // erstellen von 2 Objekten
    2. // tvolumen benzinst verb KM alter
    3. Auto Mercedes = new Mercedes (70.00, 50.00, 8.6, 30000.00, 3);
    4. Auto Opel = new Opel (70.00, 50.00, 8.6, 70000.00, 10);
    5. // Aufruf der Methode alter ();
    6. Mercede.alter();
    7. Opel.alter();


    so die Methode Alter selbst :

    Quellcode

    1. public void alter (){
    2. System.out.println(alter+"Jahre");
    3. }

    steht übrigens auch in der Klasse Auto !!!

    So nun wird er uns Als Ausgabe folgendes Ausgeben

    Für Mercedes 3 Jahre
    und für Opel 10 Jahre

    Klar soweit ???? also ist davon abhängig mit welchen Parametern du das Objekt erstellst wenn du den ersten Konstruktor nehmen würdest also das Objekt nur mit

    Quellcode

    1. Auto Opel = new Auto();
    2. Auto Mercedes = new Auto();



    und in diesem Konstruktor wird ein festes Alter vergeben wirst du bei beiden Objekten das selbe Alter bekommen !
  • Okay, hier bin ich wieder und gleich mit einer vielleicht sehr noobigen Frage:

    Wie organisier ich mir den Code am besten? Ich poste mal (ein zugegebenermaßen längeres) Codestück, an dem ich mein Problem verdeutliche:

    Quellcode

    1. public class Auto
    2. {
    3. // Attribute
    4. private double ggewicht, lgewicht, gepaeck, tankvolumen, benzinstand, verbrauch, kmstand, zuladung;
    5. private int personen, passagiere;
    6. // Konstruktoren
    7. public Auto()
    8. {
    9. tankvolumen = 70.0; // L
    10. benzinstand = 50.0; // L
    11. verbrauch = 8.6; // L pro 100 km
    12. kmstand =77000; // km
    13. ggewicht = 3600; // zulässiges Gesamtgewicht in kg
    14. lgewicht = 1400; // Leergewicht in kg
    15. personen = 1; // Anzahl der Personen im Auto
    16. gepaeck = 0; // Gewicht des Gepaeck in kg
    17. }
    18. public Auto(double tv, double bst, double verb, double km, double lgw, int p, double gep)
    19. {
    20. tankvolumen = tv;
    21. benzinstand = bst;
    22. verbrauch = verb;
    23. kmstand = km;
    24. ggewicht = 3600; // zulässiges Gesamtgewicht in kg
    25. lgewicht = lgw;
    26. personen = p;
    27. gepaeck = gep;
    28. }
    29. // Oeffentliche Methoden
    30. public void tanken(double liter)
    31. {
    32. if (liter <= (tankvolumen - benzinstand))
    33. {
    34. benzinstand = benzinstand + liter;
    35. }
    36. else
    37. System.out.println("Der Tank ist zu klein für diese Menge Benzin!");
    38. }
    39. public void anzeigen()
    40. {
    41. zuladung = ((personen*50)+gepaeck); // gesamte Zuladung in kg bestehend aus Gepäck und Passagieren
    42. if (zuladung+lgewicht <= 1800)
    43. verbrauch = verbrauch;
    44. else
    45. if (zuladung+lgewicht <= 2400)
    46. verbrauch = (verbrauch+0.73);
    47. else
    48. if (zuladung+lgewicht <= 3000)
    49. verbrauch = (verbrauch+(2*0.73));
    50. else
    51. if (zuladung+lgewicht <= 3600)
    52. verbrauch = (verbrauch+(3*0.73));
    53. System.out.println("Tankvolumen = "+tankvolumen+" Liter");
    54. System.out.println("Benzinstand = "+benzinstand+" Liter");
    55. System.out.println("Verbrauch = "+verbrauch +" Liter/100 km");
    56. System.out.println("km-Stand = "+kmstand +" km");
    57. System.out.println("Leergewicht = "+lgewicht +" kg");
    58. System.out.println("zulässiges Gesamtgewicht = "+ggewicht +" kg");
    59. System.out.println("Personenanzahl = "+personen +" Personen");
    60. System.out.println("Gewicht des Gepäck = "+gepaeck +" kg");
    61. System.out.println("Zuladung = "+zuladung +" kg");
    62. }
    63. public void passagiere(int passagiere)
    64. {
    65. if (passagiere > 4)
    66. System.out.println("So viele Leute passen nicht in dein Auto!");
    67. else
    68. personen = (personen+passagiere);
    69. }
    70. public void fahren(double kilometer)
    71. {
    72. if ((kilometer/100*verbrauch) > benzinstand)
    73. {
    74. System.out.println("Für diese Strecke ist nicht genug Benzin vorhanden!");
    75. }
    76. else
    77. {
    78. kmstand = kmstand + kilometer;
    79. benzinstand = benzinstand - kilometer/100 * verbrauch;
    80. }
    81. }
    82. // Private Methoden
    83. }
    Alles anzeigen


    So, das ist der Batzen... Was mir nun missfällt ist folgendes: In der Methode anzeigen() habe ich zuladung mit eingebracht, da es aktuell sein muss auch nachdem ich die Methode passagiere(int pa) benutzt habe. Deswegen kann sie nicht in auto() hinein. Und auch die gesamte Abfrage, wie der Verbrauch nun wirklich ist steht in anzeigen() mit drin, da ich auch hier wieder das Aktualitätsproblem habe. Nur gefallen mir diese Passagen an den Stellen nicht... Kann ich die irgendwo anders sinnbringend unterbringen oder ist es unter Umständen "normal", dass ab und an Dinge an stellen sind, an denen man sie nicht unbedingt haben will?

    Danke im Vorraus ;)

    lg, Sky

    PS: Sorry für den Doppelpost, aber ich denke für die neue Frage geht das okay, wenn nicht bitte melden, dann editier ich den letzten Post um etc. pp.
  • Hallo Sky!

    Ich hoffe ich habe deine Frage richtig Verstanden ......
    zunächst mal (leicht aufen hinterkopf hau) X( Was hast du Vergessen ??? .... this. (also uns wird das zumindest im Studium eingetrichtert) !

    So zu deinem Problem also eigentlich ist es schon richtig an der Stelle wo es ist aber du könntest auch folgendes machen :

    Quellcode

    1. public void passagiere ( int passagiere){
    2. {
    3. if (passagiere > 4)
    4. System.out.println("So viele Leute passen nicht in dein Auto!");
    5. else
    6. personen = (personen+passagiere);
    7. }
    8. zuladung = ((personen*50)+gepaeck); // gesamte Zuladung in kg bestehend aus Gepäck und Passagieren
    9. if (zuladung+lgewicht <= 1800)
    10. verbrauch = verbrauch;
    11. else
    12. if (zuladung+lgewicht <= 2400)
    13. verbrauch = (verbrauch+0.73);
    14. else
    15. if (zuladung+lgewicht <= 3000)
    16. verbrauch = (verbrauch+(2*0.73));
    17. else
    18. if (zuladung+lgewicht <= 3600)
    19. verbrauch = (verbrauch+(3*0.73));
    20. }
    Alles anzeigen


    Du packst die Zuladung einfach in die Methode Passagiere so hast du schon mal die Aktualliesierungs Probleme gelößt jetzt musst du auch noch den Konstruktor etwas verändern :

    Quellcode

    1. public Auto2(double tv, double bst, double verb, double km, double lgw, int p, double gep)
    2. {
    3. this.tankvolumen = tv;
    4. this.benzinstand = bst;
    5. this.verbrauch = verb;
    6. this.kmstand = km;
    7. this.ggewicht = 3600; // zulässiges Gesamtgewicht in kg
    8. this.lgewicht = lgw;
    9. this.gepaeck = gep;
    10. this.passagiere(p);
    11. }
    Alles anzeigen


    und zwar musst du hier die Methode passagiere (p) aufrufen damit du von anfang an ein aktuelles gewicht zuladung verbrauch usw bekommst
    wenn du nun noch mehr passagiere möchtest musst du einfach die methode passagiere() mit einem Objekt aufrufen
    auch wenn du den ersten Konstruktor verwendest brauchst du nichts weiter zu tun als z.B Opel. passagiere () aufzurufen

    was mir aufgefallen ist veränderst du dein Gepäck aber nur durch den Konstruktor könnte doch aber sein das noch eine Person mit gepäck hinzusteigt hierfür würde ich dir empfehlen
    um das Aktualitäts problem zu umgehn die Methode passagiere() zu überladen
    also sprich :

    Quellcode

    1. public void passagiere ( int passagiere){
    2. }

    so wie sie schon ist und zusätzlich noch

    Quellcode

    1. public void passagiere ( int passagiere, doubel gepaeck2 ){
    2. .
    3. .
    4. .
    5. // hier rechnest du das gewicht ja mit ein was du im Konstruktor übergeben hast
    6. // fehlt also noch eine Zeile
    7. this.gepaeck=gepaeck+gepaeck2;
    8. zuladung = ((personen*50)+gepaeck);
    9. .
    10. .
    11. .
    12. }
    Alles anzeigen

    Alles Klar sowet??? (die Namensgebung bzüglich gepaeck2 ist nicht so gelungen kannste ja besser machen :) )

    Hoffe das hat dein Problem gelößt !!