Konstruktor für ein Rechtwinkliges Dreieck

kxrdelis

Mitglied
Guten Tag,
Ich habe eine frage zum Konstruktor für ein Rechtwinkliges Dreieck.
Meine Lehrerin hat mir folgendes beigebracht:

Java:
public rDreieck(double a, double b) {
    this.a = a;
    this.b = b;
    this.c = Math.sqrt(a*a+b*b);
}

Sie geht davon aus, dass ich die Werte a und b habe und die Hypothenuse c ausrechnen soll. Ansatz dafür, dass man zb a und c hat sieht wie folgt aus:
Kon.read ist mein vorgegebener Scanner.


Java:
public static abfrage{
char abc;
System.out.println("Für ein rechtwinkliges Dreieck benötigen wir folgende Längen: Kathete a, Kathete b, und Hypothenuse c");
System.out.println("Welche Länge haben Sie NICHT?");
abc = Kon.readChar();
if (abc == 'a') {
    double b = Kon.readDouble("Geben Sie bitte Länge b an: ");
    double c = Kon.readDouble("Geben Sie bitte Länge c an: ");
    double a = Math.sqrt((c*c)-(b*b));
    System.out.println("a = " + a);

}else if(abc == 'b'){
    double a = Kon.readDouble("Geben Sie bitte Länge a an: ");
    double c = Kon.readDouble("Geben Sie bitte Länge c an: ");
    double b = Math.sqrt((c*c)-(a*a));
    System.out.println("b = " + b);

}else if(abc == 'c'){
    double a = Kon.readDouble("Geben Sie bitte länge a an: ");
    double b = Kon.readDouble("Geben Sie bitte länge b an: ");
    double c = Math.sqrt(a*a+b*b);
    System.out.println("c = " + c);
}else { System.out.println("Fehler: " + abc);}
}


Ich hatte mir folgendes gedacht. Man gibt die vorhanden werte ein und der fehlende Wert wird ausgerechnet.
Der Konstruktor sieht dann so aus:

Java:
public rDreieck(double a, double b, double c) {
    this.a = a;
    this.b = b;
    this.c = c;
}

Damit kann ich dann weiter Formeln anwenden um zb den Umfang zu rechnen.
Wie bekomme Ich das hin, dass man den fehlenden wert ausrechnet und "aktualisiert". Ich bedanke mich für jede Hilfe!
 
Zuletzt bearbeitet von einem Moderator:
Es gibt mehrere Möglichkeiten. Du könntest statt double Double verwenden. So kannst du den fehlenden Wert als null übergeben.
Du könntest mehrere Konstruktoren anbieten: public RightTriangle(double a, double b), RightTriangle(double a, double c), RightTriangle(double b, double c)
Du könntest auch Werte für a, b oder c die 0 oder kleiner als 0 sind als fehlend betrachten.
 
Es gibt mehrere Möglichkeiten. Du könntest statt double Double verwenden. So kannst du den fehlenden Wert als null übergeben.
Du könntest mehrere Konstruktoren anbieten: public RightTriangle(double a, double b), RightTriangle(double a, double c), RightTriangle(double b, double c)
Du könntest auch Werte für a, b oder c die 0 oder kleiner als 0 sind als fehlend betrachten.
Also Ich hab weitergearbeitet und bin auf folgendes gekommen:


Java:
public rechtDreieck(double a, double b, double c) {
    if(a == 0){
        this.a = Math.sqrt((c*c)-(b*b));
        this.b = b;
        this.c = c;
        System.out.println("Wert a:" + a + "Wert b:" + b + "Wert c:" + c);
    }else if(b == 0){
        this.a = a;
        this.b = Math.sqrt((c*c)-(a*a));
        this.c = c;
        System.out.println("Wert a:" + a + "Wert b:" + b + "Wert c:" + c);
    }else if(c == 0){
        this.a = a;
        this.b = b;
        this.c = Math.sqrt(a*a+b*b);
        System.out.println("Wert a:" + a + "Wert b:" + b + "Wert c:" + c);
    }else{ System.out.println("Fehler vorhanden.");}
}

Die Aussgabe ist zum testen. Problem ist nur, dass Ich bis dahin nicht komme, weil es hiernach:

Java:
case "Rechtwinkliges-Dreieck" -> {
    System.out.println("Für ein rechtwinkliges Dreieck benötigen wir folgende Werte: Kathete a, Kathete b, und Hypothenuse c \n Wenn ein Wert nicht verfügbar ist 0 eintragen");
    System.out.println("Geben Sie bitte den Wert für die Kathete a an:");
    double a =Kon.readDouble();
    double b =Kon.readDouble("Geben Sie bitte den Wert für die Kathete b an: ");
    double c =Kon.readDouble("Geben Sie bitte den Wert für die Hypothenuse c an:  ");
    rechtDreieck rdrei = new rechtDreieck(a, b , c);

}
nicht weitergeht. Nichts im Case wird ausgeführt.
 
Zuletzt bearbeitet von einem Moderator:
Du könntest mehrere Konstruktoren anbieten
Die genannten Konstruktoren sind natürlich für Java alle gleich und so nicht möglich. Denn alles sind Konstruktoren, die zwei double Werte nehmen. Ist ja auch logisch, denn woher soll Java wissen, was bei new RightTriangle(1.0, 2.0) für ein Konstruktor genutzt werden soll?

Aber was ginge wären Factory Methoden. Also etwas wie
public static createReactangleWithHypothenuse(double a, double c) { ... }

Sprich: Da kann man dann unterschiedliche Methodennamen verwenden.


Ansonsten ist die Lösung mit dem 0 Wert prinzipiell auch in Ordnung. Ich verstehe nur nicht, was Du mit dem Code:

Java:
case "Rechtwinkliges-Dreieck" -> {
    System.out.println("Für ein rechtwinkliges Dreieck benötigen wir folgende Werte: Kathete a, Kathete b, und Hypothenuse c \n Wenn ein Wert nicht verfügbar ist 0 eintragen");
    System.out.println("Geben Sie bitte den Wert für die Kathete a an:");
    double a =Kon.readDouble();
    double b =Kon.readDouble("Geben Sie bitte den Wert für die Kathete b an: ");
    double c =Kon.readDouble("Geben Sie bitte den Wert für die Hypothenuse c an: ");
    rechtDreieck rdrei = new rechtDreieck(a, b , c);
}
genau machen willst. Evtl. zeigst Du einmal das dazu gehörige switch und so ...
 
Der Switch ist nur da um zwischen verschiedenen Dreieck's Körper zu wechseln.


[CODE lang="java" title="Class Dreieck um zwischen den Verschiedenen Körpern zu wechseln"]public class Dreieck {

public Dreieck(){

String koerper;

System.out.println("'Rechtwinkliges-Dreieck', 'Gleichseitiges-Dreieck', 'belibiges-Dreieck'");

System.out.println("Welchen Körper Möchten Sie berechnen?");

koerper = Kon.readString();

switch (koerper) {

case "Rechtwinkliges-Dreieck" -> {

System.out.println("Für ein rechtwinkliges Dreieck benötigen wir folgende Werte: Kathete a, Kathete b, und Hypothenuse c \n Wenn ein Wert nicht verfügbar ist 0 eintragen");

System.out.println("Geben Sie bitte den Wert für die Kathete a an:");

double a =Kon.readDouble();

double b =Kon.readDouble("Geben Sie bitte den Wert für die Kathete b an: ");

double c =Kon.readDouble("Geben Sie bitte den Wert für die Hypothenuse c an: ");

rechtDreieck rdrei = new rechtDreieck(a, b , c);



}

case "Gleichseitiges-Dreieck" -> {

/*Platzhalter */

}

case "belibiges-Dreieck" -> {

/*Platzhalter */

}

default -> throw new IllegalStateException("Das ist leider Kein verfügbarer Körper: " + koerper);

}



}



}[/CODE]
 
Also das sieht prinzipiell ok aus. Die Klasse Kon sagt mir aber nichts. Aber wenn da die Eingabe richtig entgegen genommen wird, dann sollte das funktionieren.

Aber dran denken; Du musst es genau so schreiben - also auch Gross/Kleinschreibung beachten und so. Ggf. einfach einmal die Eingabe testweise ausgeben. Also etwas wie:
System.out.println("Eingabe: \"" + koerper + "\"");

Dann kann man sehen, was evtl. falsch gelaufen ist.
 
So hat alles geklappt. Vielen Dank an alle 🙂
[CODE lang="java" title="Lösung Teil 1"]public class Dreieck {

public Dreieck(){
String koerper;
System.out.println("'Rechtwinkliges-Dreieck', 'Gleichseitiges-Dreieck', 'belibiges-Dreieck'");
System.out.println("Welchen Körper Möchten Sie berechnen?");
koerper = Kon.readString();
switch (koerper) {
case "rr" -> {
System.out.println("\nFür ein rechtwinkliges Dreieck benötigen wir folgende Werte: Kathete a, Kathete b, und Hypothenuse c \nWenn ein Wert nicht verfügbar ist 0 eintragen\n");
double a =Kon.readDouble("\nGeben Sie bitte den Wert für die Kathete a an: ");
double b =Kon.readDouble("\nGeben Sie bitte den Wert für die Kathete b an: ");
double c =Kon.readDouble("\nGeben Sie bitte den Wert für die Hypothenuse c an: ");

if(a == 0){
a = Math.sqrt( (c*c)-(b*b) );
System.out.println("Wert a: " + a + "\nWert b: " + b + "\nWert c: " + c);
}else if(b == 0){
b = Math.sqrt( (c*c)-(a*a) );
System.out.println("Wert a: " + a + "\nWert b: " + b + "\nWert c: " + c);
}else if(c == 0){
c = Math.sqrt( (a*a)+(b*b) );
System.out.println("Wert a: " + a + "\nWert b: " + b + "\nWert c: " + c);
}else{ System.out.println("Fehler vorhanden.");}

rechtDreieck rdrei = new rechtDreieck(a, b , c);
}
case "Gleichseitiges-Dreieck" -> {
/*Platzhalter */
}

case "belibiges-Dreieck" -> {
/*Platzhalter */
}
default -> throw new IllegalStateException("Das ist leider Kein verfügbarer Körper: " + koerper);
}



}



}
[/CODE]
[CODE lang="java" title="Lösung Teil 2"]public rechtDreieck(double a, double b, double c){
this.a = a;
this.b = b;
this.c = c;
System.out.println("Wert test 2:" + a + "Wert b:" + b + "Wert c:" + c);
}[/CODE]
 
Bitte beachtet die Java Konventionen:
Klassennamen beginnen mit einem Großbuchstaben "rechtDreieck" => "RechtDreieck".
Variablen- und Methodennamen beginnen entsprechend mit einem Kleinbuchstaben.
 
Erst einmal schön, dass Du eine Lösung gefunden hast. Dazu würde ich Dir aber gerne noch einen Hinweis geben:

Wo würdest Du schauen, wenn Du nach der Berechnung der Seiten des rechtwinkligen Dreiecks schauen müsstest und die Details noch nicht kennen würdest? Da wäre doch der erste Gedanke, dass Du in der Klasse RechtDreieck schauen. Nur da befindet sich die Berechnung nicht.

Die Berechnungen, die spezifisch für das rechtwinklige Dreieck sind, sollten also irgendwie in diese Klasse.

Dazu gibt es mehrere Möglichkeiten:
a) FactoryMethoden: Dabei handelt es sich um statische Methoden, die eine Instanz der Klasse erzeugen und zurück geben. Das wäre dann etwas wie
Java:
public static RectDreieck createFromAAndB(double a, double b) { ... }
public static RectDreieck createFromAAndB(double a, double c) { ... }
public static RectDreieck createFromAAndB(double b, double c) { ... }

b) die Berechnung selbst könnte man natürlich auch in entsprechende Methoden packen:
Java:
public static double calculateCathetus(double cathetus, double hypothenuse) { ... }
public static double calculateHypothenuse(double cathetusA, double cathetusA) { ... }

Generell ist auch eine Mischung aus a) und b) denkbar - dann nutzt a) die Methoden aus b)

Dann fällt noch auf, dass Du doppelten Code hast. Du hast 3 Mal die Ausgabe des Dreiecks. Das kannst Du entweder
a) in eine Methode packen. Die Ausgabe eines RectDreiecks kann am Besten in RectDreieck aufgehoben sein... also eine Art print() Methode. Die würde ich dann auch erst aufrufen, nachdem das Dreieck erstellt wurde.
b) Die Ausgabe ist in if/else Strukturen. Das kann also auch einfach außerhalb sein.

Last but not Least: Du gibst an einer Stelle eine Fehlermeldung aus, aber Du machst normal weiter. Das sieht zumindest erst einmal nicht korrekt aus.

Das einfach nur noch als Ergänzung und vielleicht möchtest Du den einen oder anderen Punkt mit aufnehmen.
 
Ich hab seit gestern weitergearbeitet und den Code jetzt so:
[CODE lang="java" title="Dreieck Klasse"]public Dreieck(){
String koerper;
System.out.println("'Rechtwinkliges-Dreieck', 'Gleichseitiges-Dreieck', 'belibiges-Dreieck'");
System.out.println("Welchen Körper Möchten Sie berechnen?");
koerper = Kon.readString();
switch (koerper) {
case "rr" -> {
rightTriangle.auswahl();
rightTriangle.check();
}
case "Gleichseitiges-Dreieck" -> {
equalTriangle.auswahl();
equalTriangle.check();
}

case "belibiges-Dreieck" -> {

}
default -> throw new IllegalStateException("Das ist leider Kein verfügbarer Körper: " + koerper);
}



}
public void auswahl(){
System.out.println("Sie haben die Kategorie " + Dreieck.class.getName() + " ausgewählt");
}[/CODE]
[CODE lang="java" title="Rechteck Klasse"]public class rightTriangle {
private final double a;
private final double b;
private final double c;


public rightTriangle(double a, double b, double c){
this.a = a;
this.b = b;
this.c = c;

printArea();
printScope();
repeat();
}

public double getA() { return this.a; }

public double getB() { return this.b ; }

public double getC() { return this.c ; }

public void printValues(){ System.out.println("Wert a:" + getA() + "Wert b:" + getB() + "Wert c:" + getC());}

public double area() {
return 0.5*this.a * this.b;
}

public double scope() {
return this.a + this.b + this.c;
}

public void printArea() {
System.out.println("\n\nDie Fläche beträgt" + area() + ".");
}

public void printScope() {
System.out.println("\n\nDer Umfang beträgt" + scope() + ".");
}

public static void check(){
System.out.println("\nFür ein rechtwinkliges Dreieck benötigen wir folgende Werte: Kathete a, Kathete b, und Hypothenuse c \nWenn ein Wert nicht verfügbar ist 0 eintragen\n");
double a =Kon.readDouble("\nGeben Sie bitte den Wert für die Kathete a an: ");
double b =Kon.readDouble("\nGeben Sie bitte den Wert für die Kathete b an: ");
double c =Kon.readDouble("\nGeben Sie bitte den Wert für die Hypothenuse c an: ");

if(a == 0){
a = Math.sqrt( (c*c)-(b*b) );
}else if(b == 0){
b = Math.sqrt( (c*c)-(a*a) );
}else if(c == 0){
c = Math.sqrt( (a*a)+(b*b) );
}else{ System.out.println("Fehler vorhanden.");}
rightTriangle right = new rightTriangle(a, b , c);
right.printValues();

}

public static void repeat(){
System.out.println("\nMöchten Sie nochmal rechnen?");
String repeat = Kon.readString("\nMöchten Sie nochmal rechnen?");
if(repeat.equals("Ja")){
new Dreieck();
}else System.exit(0);
}

public static void auswahl(){
System.out.println("Sie haben die Kategorie " + rightTriangle.class.getName() + " ausgewählt");
}
}[/CODE]
 

Neue Themen


Zurück
Oben