Aufgabe: Dreieck Punkte Quellcodeverbesserung



  • Hallo an Alle,

    Ich habe folgendes Problem: Ich hatte folgende Aufgabe für eine Hausaufgabe. Ich habe eine Klasse Triangle.java geschrieben, die auf eine andere Klasse Point.Java zugreifen soll. Die Klasse Point, die gekapselte Datenelemente und eine Methode zur Abstansbestimmung eines Punktes zu einem beliebigen anderen Punkt besitzt.
    Die Klasse Triangle soll den Begriff des Dreiecks in der Ebene reprasentiert,
    das durch seine drei Eckpunkte gegeben ist. Die Klasse Triangel habe drei gekapselte Datenelemente vom Typ Verweis auf Point, einen Konstruktor mit drei formalen Parametern vom Typ Verweis auf Point,eine Methode boolean isDegenerated(), die true zuruckgibt, falls das Dreieck entartet ist, d.h., falls alle drei Eckpunkte auf einer Geraden liegen, sonst false, einer Methode boolean isIsosceles(), die true zuruckgibt, falls das Dreieck gleichschenklig
    ist, sonst false,einer Methode double perimeter(), die den Umfang des Dreiecks zuruckgibt; falls das Dreieck entartet ist, soll 0.0 zuruckgegeben werden.
    Beachten Sie, dass Sie fur viele Methoden die Methode double distance(Point) der Klasse Point verwenden können.

    Das habe ich dann soweit auch gemacht. Als Feedback der HA habe ich aber zurück bekommen, dass ich keine Punkte bekomme, da mein Code nicht auf alle Testfälle des Dozenten passt.

    Kann mir vielleicht ein kluger Kopf von Euch sagen wo mein Fehler liegt. Oder was ich besser machen hätte können?

    Hier der Code von der Klasse Point:

    class Point {
    
      // Instanzvariablen (Datenelemente)
      private int x, y;
      private String color;
    
      // Konstruktoren
      Point() {
    	x = 0;
    	y = 0;
      }
    
      Point(int xInit, int yInit) {
    	x = xInit;
    	y = yInit;
      }
    
      Point(int xInit, int yInit, String colorInit) {
    	x = xInit;
    	y = yInit;
    	color = colorInit;
      }
    
      // Methoden zum Abfragen der Werte der Datenelemente
      int getX() {
    	return x;
      }
    
      int getY() {
    	return y;
      }
    
      String getColor() {
    	return color;
      }
    
      // Methoden absolutes Verschieben
      void moveTo(int xNew) {
    	x = xNew;
      }
    
      void moveTo(int xNew, int yNew) {
    	x = xNew;
    	y = yNew;
      }
    
      // Methode relatives Verschieben
      void moveRel(int dx, int dy) {
    	x = x + dx;
    	y += dy;
      }
    
      // Methode: Abstand zum Ursprung
      double distance() {
    	return Math.sqrt(x*x + y*y);
      }
    
      // Methode: Abstand zu einem anderen Punkt
      double distance(Point p) {
    	int dx = x - p.x;
    	int dy = y - p.y;
    	return Math.sqrt(dx*dx + dy*dy);
      }
    
      // Methode zum Umfaerben
      void setColor(String colorNew) {
    	color = colorNew;
      }
    }
    
    //Point
    

    Und hier meine geschriebene Klasse Triangle:

    public class Triangle {
    
    	// instance variables
    	private Point p1; 
    	private Point p2;
    	private Point p3; 
    
    	// Constructors
    	Triangle(Point a, Point b, Point c) {
    		p1 = a; 
    		p2 = b;
    		p3 = c;
    	}
    
    	//method for 
    	boolean isDegenerated() {
    		boolean x = p1.getX() == p2.getX();
    		boolean y = p2.getX() == p3.getX();
    		if( x & y )
    			return true;
    		else
    			return false;
    	}
    
    	//method for determine if triangle isosceles triangle 
    	boolean isIsosceles() {
    		Double Abstand1 = getAbstandp1p2();
    		Double Abstand2 = getAbstandp2p3();
    		Double Abstand3 = getAbstandp1p3();
    
    		if (Double.compare(Abstand1, Abstand2) == 0)
    			return true;
    		else if (Double.compare(Abstand2, Abstand3) == 0)
    			return true;
    		else if (Double.compare(Abstand3, Abstand1) == 0)
    			return true;
    		else 
    			return false;
    	}
    
    	//method for calculate the perimeter of the triangle
    	double perimeter() {
    		if (isDegenerated())
    			return 0.0;
    		else
    			return (getAbstandp1p2() + getAbstandp2p3() + getAbstandp1p3());
    	}
    
    	//method for determine the distance of a point
    	double getAbstandp1p2() {
    		return Math.sqrt((p1.getX() * p2.getX()) + (p1.getY() * p2.getY()));
    	}
    	double getAbstandp2p3() {
    		return Math.sqrt((p2.getX() * p3.getX()) + (p2.getY() * p3.getY()));
    	}
    	double getAbstandp1p3() {
    		return Math.sqrt((p3.getX() * p1.getX()) + (p3.getY() * p1.getY()));
    	}
    
    }
    

    Vielen Dank schon mal.

    Liebe Grüße

    EDIT durch Gregor: Java-Code-Tags eingefügt.



  • Du hast das "Beachten Sie, ..." nicht beachtet, d.h. deine Triangle-Methoden sollten auf die Point.distance(Point)-Methode zugreifen (anstatt selber die Berechnung mittels Math.sqrt() durchzuführen).
    Und deine Implementierung der Methoden isDegenerated() und isIsosceles() stimmt auch nicht.


  • Mod

    @Alexandria26: Ich schließe mich Th69 an. Zusätzlich noch ein kleiner Hinweis, wie man diese Methoden implementieren könnte:

    Nehmen wir an, dass die drei Punkte des Dreiecks A, B und C sind...

    "isDegenerated" kann man relativ elegant über die Determinante der Matrix realisieren, die aus den Vektoren B-A und C-A besteht. Wenn das Dreieck entartet ist, dann sollte diese Determinante 0 sein, ansonsten nicht.

    Jenseits davon, dass Du zur Abstandsbestimmung die anderen Methoden nutzen solltest, sind Deine Realisierungen des Abstandes falsch. Du hast da so etwas wie

    sqrt(x1*x2+y1*y2).

    Es sollte aber eher etwas wie

    sqrt((x2-x1)2+(y2-y1)2)

    sein. Als Konsequenz liefern die Methoden "isIsosceles" und "perimeter" natürlich auch falsche Resultate. Zudem ist mir persönlich nicht klar, warum Du in "isIsosceles" die compare-Methode der Klasse Double nimmst. Du kannst doch einfach mit <, >, == und ähnlichen Operatoren vergleichen. Jenseits davon: Tests zweier Fließkommazahlen auf Gleichheit sind oft problematisch. Die Zahlen werden irgendwie berechnet und unterschiedliche Rechenwege können bei Fließkommazahlen trotz formeller Gleichheit numerisch zu ganz leicht unterschiedlichen Ergebnissen führen. Hier ist das aber wahrscheinlich nicht relevant.

    Die ganzen kleinen Fehler, die Du da gemacht hast, können beim Programmieren durchaus passieren. Du glaubst gar nicht, wie oft ich einen Programmcode schreibe und dann macht der letztendlich etwas völlig anderes als ich wollte oder er funktioniert nur für bestimmte Spezialfälle, weil ich beim Programmieren eben nur diese Spezialfälle vor Augen hatte. Aus diesem Grund ist es wichtig, seinen Code zu testen. Das ist etwas, was Du immer machen solltest. Schreib zusätzlich einen Testcode, der Dir für diverse Testfälle die Resultate berechnet. In den Testfällen sollten jenseits von ganz normalen Fällen vor allem auch Grenzfälle enthalten sein.



  • Danke für Eure Antworten. Aber irgendwie verstehe ich gerade nicht ganz. Oder es ist schon wieder zu lange her. Scheinbar habe ich das Thema noch nicht ganz verinnerlicht....Könntest du mir vielleicht konkret aufzeigen, wie ich es schreiben müsste damit es stimmt?

    Liebe Grüße


Anmelden zum Antworten