Flaechen vergleichen/kleines Fehler?

jackdaniel

Mitglied
Hey. Ich habe ein Problem. Ich habe eine Aufgabe, in der ich eine Klasse Figur erstellen sollte, dann erbende Klassen: Rechteck, Kreis, usw. (alle Klassen zeige ich unten, die sollen richtig sein). Dann soll ich in der Klasse TestGeometrie die Flaechen von den Figuren, die als ein Array erzeugt wurden, vergleichen. Java zeigt mir dumme Fehler beim Kompilieren, zB. Java sagt mir, in einer Schleife ploetzlich ein ';' zu stecken. Ich glaube, ich habe irgendwo ein Fehler gemacht, aber nach den ganzen Tag habe ich ihn weiter nicht gefunden ;/ kann mir jemand Quell-Code pruefen? Ich waere fuer die Hilfe sehr dankbar!

Java:
/** 
 * Modelliert eine Figur mit x- und y-Koordinaten, welche 
 * um dx,dy verschoben werden koennen.
 */
public class Figur {
    /** Attribute */
    private double pos_x; // x-Koordinate
    private double pos_y; // y-Koordinate

    /** Methoden */
    // Konstruktor
    public Figur(double pos_x, double pos_y) {
        this.pos_x = pos_x;
        this.pos_y = pos_y;
    }
    // Getter
    public double getPosX() {
        return pos_x;
    }
    public double getPosY() {
        return pos_y;
    }
    // andere Methoden
    // verschiebt die Figur um dx in x-Richtung und um dy in y-Richtung
    public void verschieben(double dx, double dy) {
        pos_x += dx;
        pos_y += dy;
    }
    // gibt einen String mit den Koordinaten zurueck
    public String toString() {
        return "Diese Figur hat die Mittelpunkt-Koordinaten ("+ pos_x+", "+pos_y+")";
    }
}

Java:
public class Kreis extends Figur {
	
	//zusaetzliche Attribute
	private double radius;

	//parametrisierter Konstruktor
	public Kreis(double pos_x, double pos_y, double radius) {
		super(pos_x, pos_y);
		this.radius = radius;
	}

	//Methoden
	public double berechneFlaeche() {
		double flaeche = Math.PI * this.radius * this.radius;
		return flaeche;
	}


	//toString - Methode
	public String toString(){
		return "Dieser Kreis hat die Mittelpunkt-Koordinaten (" + pos_x + ", " + pos_y + "), den Radius " + this.radius + " und die Flaeche " + flaeche + ".";
	}

}

Java:
public class Rechteck extends Figur {

	//zusaetzliche Attribute
	private double laenge;
	private double breite;

	//parametrisierter Konstruktor
	public Rechteck(double pos_x, double pos_y, double laenge, double breite) {
		super(pos_x, pos_y);
		this.laenge = laenge;
		this.breite = breite;
	}

	//Methoden
	public double getLaenge(){
		return laenge;
	}

	public double berechneFlaeche(){
		double flaeche = laenge * breite;
		return flaeche;
	}

	public String toString(){
		return ""Dieses Rechteck hat die Mittelpunkt-Koordinaten (" + pos_x + ", " + pos_y + "), die Laenge " + this.laenge + ", die Breite " + this.breite + " und die Flaeche " + flaeche + ".";
	}

}

Java:
public class Quadrat extends Rechteck {

	//parametrisierter Konstruktor
	public Kreis(double pos_x, double pos_y, double laenge, double breite) {
		rechteck(pos_x, pos_y, laenge, breite = laenge);
	}

	
	//Methoden
	public String toString() {
		return "Dieses Quadrat hat die Mittelpunkt-Koordinaten (" + pos_x + ", " + pos_y + "), die Laenge " + rechteck.getLaenge() + " und die Flaeche " + rechteck.flaeche() + ".";
	}

}

Java:
public class TestGeometrie{
	public static void main(String[] args){
		
		//Die Implementierte Klassen werden getestet.

		Figur figur[] = new Figur[5];

		//Objekte von verschiedenen Klassen erzeugen

		Figur figur1 = new Figur(0.0, 0.0);
		Kreis kreis1 = new Kreis(1.5, 0.0, 0.5);
		Kreis kreis2 = new Kreis(0.0, 2.5, 1.0);
		Rechteckt rechteck1 = new Rechteck(-2.0, 0.0, 1.0, 2.0);
		Quadrat quadrat1 = new Quadrat(0.0, -2.0, 1.0, 1.0);

		//Objekte den Elementen des Arrays zuweisen

		figur[0] = figur1;
		figur[1] = kreis1;
		figur[2] = kreis2;
		figur[3] = rechteck1;
		figur[4] = quadrat1;

		//fuer jedes Element des Arrays die Methode toString anwenden

		for(int i = 0, i < figur.length, i++){
			figur[i].toString();
		}

		//Figur mit maximalen Flaeche finden
		double max = 0;
		for(int i = 0, i < figur.length - 1, i++){
			if(figur[i].berechneFlaeche() > max){
				max = figur[i];
			}
		}
		return max;
		
		int i;
		if(figur[i].berechneFlaeche = max){
		return i;
		}
		
		System.out.println("Die Maximale Flaeche der " + figur.length + " Figuren ist " + max + " mit Index " + i + ".");

		//Elemente des Arrays verschieben
	
		for(int i = 0, i<figur.length, i++){
			figur[i].verschieben(10.0, 20.0);
		}

		//fuer jedes Element des Arrays erneut die Methode toString anwenden

		for(int i = 0, i < figur.length, i++){
			figur[i].toString();
		}
	}
}
 
Das kann so nicht funktionieren.

Java:
        int i;
        if(figur[i].berechneFlaeche = max){
        return i;

Vergleichen tut man mit == während = eine Zuweisung ist.
Eine Variable zu erstellen ohne sie zu initialisieren und dann gleich zu verwenden ist auch nicht wirklich toll.

Das hier kann so auch nicht gehen:
Java:
        for(int i = 0, i<figur.length, i++){
            figur[i].verschieben(10.0, 20.0);
        }

Richtig wäre:

Java:
for(int i = 0; i<figur.length;i++)

Das heisst nicht , dass das alles war, was falsch ist, aber das ist mir gleich ins Auge gestochen.

Pentalon
 
Zuletzt bearbeitet:
Bem drüber gucken sehe ich mehrere Fehler.

Poste einfach die Fehlermeldungen des Compilers oder noch besser: Google danach.

Mal sind zwei " wo sie nicht hingehören, mal fehlen klammern.


Gruß,

Martin
 
Ich weiss, dort kann es mehrere Fehler geben, ich bin Anfaenger in Sache Java...

Pentalon, danke! Ich habe mich geirrt, jetzt habe ich schon = in == geaendert. Das macht aber die Anzahl der Fehler nicht ;/

Martin, jetzt werde ich nach fehlenden klammern oder '' suchen.

was soll ich noch aendern? was ist total falsch? danke fuer jede hilfe, diese aufgabe ist mir ziemlich wichtig, und uns wird in der schule nicht alles so gut erklaert...
 
Hier hast Du Dich wohl vertan:

Hier hast DU Dich beim Konstruktor verschrieben:

Java:
public class Quadrat extends Rechteck {
 
    //parametrisierter Konstruktor
    public Kreis(double pos_x, double pos_y, double laenge, double breite) { // Wenn es der Konstruktor sein soll muss er gleich heissen wie die Klasse und die heisst Quadrat :-)
        rechteck(pos_x, pos_y, laenge, breite = laenge);
    }
}

Pentalon
 
Und das hier wird auch nicht gehen:

Java:
return "Dieser Kreis hat die Mittelpunkt-Koordinaten (" + pos_x + ", " + pos_y + "), den Radius " + this.radius + " und die Flaeche " + flaeche + ".";

Für den Zugriff auf die Variablen pos_x und pos_y hast Du Dir doch was schönes gebaut in der Klasse Figur.
Die Fläche berechnest Du mit einer anderen Methode in der Klasse Kreis.
Schau auch in den anderen Klassen, da sind diese Fehler auch.

Die Klasse Figur hat keine Methode berechneFlaeche() !!!

Java:
if(figur[i].berechneFlaeche() > max)

Erst die abgeleiteten Klassen haben die.

Pentalon
 
Zuletzt bearbeitet:
ja, ich habe die Getter - Methoden benutzt und jetzt gibt es nur noch 29 Fehler! 🙂

ok, weiter: ich glaube, die Klasse Figur ist richtig (ohne Fehler). Ist es?

Ich habe groesste Probleme mit der Klasse Quadrat, die von Figur und von Rechteck erbt... das ist die neue toString Methode, die ich fuer Quadrat geschrieben habe:
Java:
public String toString() {
		return "Dieses Quadrat hat die Mittelpunkt-Koordinaten (" + getPosX() + ", " + getPosY() + "), die Laenge " + Rechteck.getLaenge() + " und die Flaeche " + Rechteck.berechneFlaeche() + ".";
	}

Ist das richtig?


darum wollte ich auch fragen:
ich weiss, dass erst die abgeleiteten klassen haben methode 'berechneFlaeche'. Ich kann aber damit nicht wirklich umgehen... das ist doch nur ein beispiel-array und ich kann nicht schreiben, dass er sollte erst ab 2. element betrachtet werden, weil erster element der klasse figur ist, weil bei einem anderen array wuerde es nicht funktionieren... entschuldigung, ich habe nur wenige erfahrung mit java ;/
 
Zuletzt bearbeitet:
Java:
return "Dieses Quadrat hat die Mittelpunkt-Koordinaten (" + this.getPosX() + ", " + this.getPosY() + "), die Laenge " + this.getLaenge() + " und die Flaeche " + this.berechneFlaeche() + ".";

Du Willst ja die Methoden DIESER Klasse verwenden.

Womit erstellst Du den Code ? Verwendest Du eine IDE ?

Wem Return'st Du in der Main ???

Java:
return max;

Wer soll mit max arbeiten ?

Hier hast Du Dich Verschrieben:
Java:
Rechteckt rechteck1 = new Rechteck(-2.0, 0.0, 1.0, 2.0);
Die Klasse heisst Rechteck und nicht Reckteckt

Im Quadrat musst Du den Konstruktor noch anpassen.

Pentalon
 
Zuletzt bearbeitet:
Zu Deiner Frage wegen der Figur:

Ich habe das so gemacht:

Java:
/** 
 * Modelliert eine Figur mit x- und y-Koordinaten, welche 
 * um dx,dy verschoben werden koennen.
 */
public class Figur {
    /** Attribute */
    private double pos_x; // x-Koordinate
    private double pos_y; // y-Koordinate
 
    /** Methoden */
    // Konstruktor
    public Figur(double pos_x, double pos_y) {
        this.pos_x = pos_x;
        this.pos_y = pos_y;
    }
    // Getter
    public double getPosX() {
        return pos_x;
    }
    public double getPosY() {
        return pos_y;
    }
    // andere Methoden
    // verschiebt die Figur um dx in x-Richtung und um dy in y-Richtung
    public void verschieben(double dx, double dy) {
        pos_x += dx;
        pos_y += dy;
    }
    
    //Methoden
    public double berechneFlaeche() {          // <<<<<----------
        return 0.0;
    }
    
    // gibt einen String mit den Koordinaten zurueck
    public String toString() {
        return "Diese Figur hat die Mittelpunkt-Koordinaten ("+ pos_x+", "+pos_y+")";
    }
}

Damit ist die Methode in dieser Klasse bekannt.

Pentalon
 
Aber in Quadrat gibt es keine Methode berechne Flaeche, darf ich 'this.berechneFlaeche()' schreiben? Soll ich nicht Rechteck.berechneFlaeche() schreiben?

ich hatte auch damit Probleme (Quadrat Konstruktor): also, es wurde in Aufgabestellung gesagt, dass es gleiche Breite und Laenge haben sollte, aber den Konstruktor von Rechteck benutzen sollte. Und Konstruktor von Rechteck braucht doch 2 Variablen, Breite und Laenge. Was soll ich damit tun?
 
Deine Idee mit der Flaeche 0.0 ist nicht schlimm, ich kann aber die Klasse Figur nicht aendern (strikte Aufgabestellung). Ich habe aber einen Hinweis gefunden, den ich leider nicht wirklich benutzen kann... also: 2. Eine Objektmethode, welche nur in der Subklasse definiert wird, jedoch nicht in der Superklasse
existiert, kann nur von Variablen vom Typ der Subklasse aufgerufen werden (wichtig für Bestimmung der maximalen Fläche). Das Stichwort zur Lösung diese Problems heißt Typumwandlung
(mit dem cast-Operator in den Typ der Subklasse).

vielleicht weisst du worum es hier geht? (ich kann einfache Sachen casten, zb. double zu int oder so, aber hier? keine ahnung).
 
Aber in Quadrat gibt es keine Methode berechne Flaeche,
Doch, diese hat sienämlich von Rechteck geerbt. genau darum geht es ja bei der Vererbung...

darf ich 'this.berechneFlaeche()' schreiben?
Ja.

Soll ich nicht Rechteck.berechneFlaeche() schreiben?
Nein, den dass ist der Zugriff auf eine statische Methode in Rechteck.

ich hatte auch damit Probleme (Quadrat Konstruktor): also, es wurde in Aufgabestellung gesagt, dass es gleiche Breite und Laenge haben sollte, aber den Konstruktor von Rechteck benutzen sollte. Und Konstruktor von Rechteck braucht doch 2 Variablen, Breite und Laenge. Was soll ich damit tun?
Ist es wirklich eine so große schöpferische Leistung die Idee zu entwickeln, den reinkommenden Parameter doppelt "nach unten" weiterzugeben?

bye
TT
 
Quadrat erbt von Rechteck. Rechteck hat eine Methode berechneFlaeche().
Du verwendest die geerbte Version indem Du this.berechneFlaeche() aufrufst.

Beim Quadrat ist ist Länge und Breite gleich (sonst ist es ja kein Quadrat 🙂).

Du kannst den den Konstrukter der Superklasse aufrufen. Das hast Du ja an anderer Stelle auch schon gemacht (Rechteck, Kreis).

Der Aufruf lautet super(parameter...);
Damit rufst Du den Konstruktor der Klasse von der Du erbst auf. In diesem Fall von Rechteck.
Dieser Konstruktor von Rechteck braucht 4 Parameter, x,y,breite, hoehe.
Nachdem hoehe und breite gleich sein sollen (müssen 🙂) könnte man doch einfach sagen:

Java:
super(pos_x, pos_y, laenge, laenge);

Der Konstruktor von Quadrat braucht dann auch nur 3 Parameter: x, y, laenge.

Pentalon
 
danke fuer jede Antwort.

darum geht es in 'den reinkommenden Parameter doppelt "nach unten" weiterzugeben' ? :

Java:
	public Quadrat(double pos_x, double pos_y, double laenge, double breite) {
		rechteck(pos_x, pos_y, laenge, laenge);
	}

entschuldigung noch einmal fuer die dummen fragen. ihr alle habt mich schon ein paar sachen erklaert, ich bin wirklich dankbar 🙂
 
danke fuer jede Antwort.

darum geht es in 'den reinkommenden Parameter doppelt "nach unten" weiterzugeben' ? :

Java:
	public Quadrat(double pos_x, double pos_y, double laenge, double breite) {
		rechteck(pos_x, pos_y, laenge, laenge);
	}
Ja, wenn du nun noch die nicht benötigte
Code:
breite
weg lässt ist es richtig gut.

bye
TT
 
ja, ich habe schon super anstatt Rechteck geschrieben, 7 Fehler! 🙂

und bei allen diesen Fehler geht es um das gleiche, also das, womit ich nicht umgehen kann: die Tatsache, dass Figur keine Methode berechneFlaeche() hat, und man sollte etwas 'casten', es ist mir aber unklar, was und wo... irgendwelche Ideen?
 
ja, ich habe schon super anstatt Rechteck geschrieben, 7 Fehler! 🙂

und bei allen diesen Fehler geht es um das gleiche, also das, womit ich nicht umgehen kann: die Tatsache, dass Figur keine Methode berechneFlaeche() hat, und man sollte etwas 'casten', es ist mir aber unklar, was und wo... irgendwelche Ideen?

Na 7 das ist doch schon viel besser als 36 🙂

Wenn der Chef möchte, dass gecastet wird, dann hier ein kleines Beispiel, das Dich in die Lage versetzen sollte, den Rest selber fertigzustellen:

Java:
        	if(figur[i] instanceof Kreis) {
        		System.out.println("Figur ist ein Kreis");
        		x= ((Kreis)figur[i]).berechneFlaeche();
        		if (x > max) max = x;	
        	}

Das System.out.println("Figur ist ein Kreis"); kannst rausschmeissen. Das hat nur der Überprüfung gedient.

Pentalon
 
Na 7 das ist doch schon viel besser als 36 🙂

Wenn der Chef möchte, dass gecastet wird, dann hier ein kleines Beispiel, das Dich in die Lage versetzen sollte, den Rest selber fertigzustellen:

Java:
        	if(figur[i] instanceof Kreis) {
        		System.out.println("Figur ist ein Kreis");
        		x= ((Kreis)figur[i]).berechneFlaeche();
        		if (x > max) max = x;	
        	}
Die bessere Lösung wäre aber, der Klasse
Code:
Figur
eine (abstrackte) Methode
Code:
berechneFlaeche()
zu geben, die von den (bereits existierenden) Methoden
Code:
berechneFlaeche()
in den Spezialisierungen überschrieben bzw. implementiert wird, weil ja genau dass der Vorteil von Polymorphie ist: den Typ gar nicht genauer kennen zu müssen.

bye
TT
 

Neue Themen


Zurück
Oben