You are not logged in.

  • Login

1

Thursday, September 30th 2010, 6:22pm

*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:

Source code

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


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:

Quoted

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

This post has been edited 2 times, last edit by "Skyclimber" (Oct 1st 2010, 11:18pm)


2

Thursday, September 30th 2010, 7:12pm

Hallo Skyclimber !!!

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

besser ist es du machst die Instanzvariablen so :

Java 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

Java Quellcode

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



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:

Java Quellcode

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


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 !

3

Thursday, September 30th 2010, 7:33pm

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)

Java Quellcode

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


Vielen Dank für die Antwort auf jeden Fall, jetzt komme ich zumindest mal weiter :D

4

Thursday, September 30th 2010, 7:47pm

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 !

5

Thursday, September 30th 2010, 7:51pm

Okay, danke, dass ist gut zu wissen :)

Zu dem this habe ich noch eine Frage: Das bezweckt doch "nur", dass genau der nachfolgende Wert, also Variable oder was auch immer, beeinflusst wird oder? Das kam bisher in unserem Lehrgang noch nicht vor, aber es ist immer nützlich sowas so früh wie möglich zu verinnerlichen ;)

lg Sky

6

Thursday, September 30th 2010, 8:22pm

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 : http://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

7

Thursday, September 30th 2010, 8:48pm

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

8

Thursday, September 30th 2010, 9:17pm

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 :


Java Quellcode

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


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

Java Quellcode

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


so die Methode Alter selbst :

Java Quellcode

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

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

Java Quellcode

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



und in diesem Konstruktor wird ein festes Alter vergeben wirst du bei beiden Objekten das selbe Alter bekommen !

9

Thursday, September 30th 2010, 10:40pm

Jep, das ist es was ich meinte :)

Fein, dann wäre das geklärt :) Vielen Dank Pirate :)

10

Friday, October 1st 2010, 11:22pm

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:

Java Quellcode

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


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.

11

Saturday, October 2nd 2010, 2:28pm

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 :

Java Quellcode

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


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 :

Java Quellcode

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


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 :

Java Quellcode

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

so wie sie schon ist und zusätzlich noch

Java Quellcode

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

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

Hoffe das hat dein Problem gelößt !!

12

Tuesday, October 5th 2010, 5:40pm

Hey :)

Jep, alles klar soweit und 'tschuldigung, dass ich das this. vergessen habe xD Ich werds mir angewöhnen ;)

*patsch* Mensch, bin ich blöd, das Problem, dass bis grade noch hier stand war auf meiner Dummheit gewachsen, jetzt hab ich den Fehler gefunden :D

lg, Sky

This post has been edited 1 times, last edit by "Skyclimber" (Oct 5th 2010, 5:45pm)


Social bookmarks