Hallo liebe Community
Ich bin gerade an einem simplen Programm zur Übung von Klassen, Methoden, Parameter usw. Es geht dabei um die Berechnung eines Rechtecks. Bei einer Methode, wo es um die Längen der Seiten geht würde ich gern mit einem String wert arbeiten. Das Problem: Die Methode ist als Double definiert und lässt dem entsprechend keine String Werte zu. Wie kann ich nun den Double Wert in einen String umwandeln?
Hier der Konkrete Fall:
double getLangeSeite() {
if(laenge > breite){
return laenge;
}
if(laenge == breite) {
return ??? System.out.println("Das Rechteck ist ein Quadrat");
} else {
return breite;
Die Frage ist doch eher ob dein Ansatz richtig ist. Wieso möchtest du deine Double-Werte in einen String umwandeln?
Wenn ich deine Methode richtig interpretiere, soll diese dir die längere Seite deines "möglichen" Rechteckes emitteln, und von daher macht ein Rückgabewert "double" doch mehr Sinn als String.
Eine mögliche Lösung für dich wäre aber eine Exception zu werfen, in dem Falle das es sich um ein Quadrat handelt. Müsstest dann aber um den Aufruf ein try/catch basteln.
Auch wenn das nicht deine Frage war, wollte ich mal meinen Senf dazu geben.
Eine mögliche Lösung für dich wäre aber eine Exception zu werfen, in dem Falle das es sich um ein Quadrat handelt. Müsstest dann aber um den Aufruf ein try/catch basteln.
Die Frage ist doch eher ob dein Ansatz richtig ist. Wieso möchtest du deine Double-Werte in einen String umwandeln?
Wenn ich deine Methode richtig interpretiere, soll diese dir die längere Seite deines "möglichen" Rechteckes emitteln, und von daher macht ein Rückgabewert "double" doch mehr Sinn als String.
Wenn seine Klasse keine zwei-gleich langen Seiten zulässt (Ist aus dem Code nicht 100%ig ersichtlich), kann man es sehr wohl als Ausnahme ansehen .. aber anderes Thema
Für lokale Variablen macht das Sinn aber nicht für Methoden. Oder Irr ich mich da?
Ich habe allerdings bemerkt, das es so wie ich mir das vorstelle so oder so nicht funktionieren würde. Ich vermute das wäre nur über einen anderen, schwereren Weg möglich den ich so noch nicht kenne. Danke trotzdem für die Hilfe. Immer gut zu wissen, dass man hier Ernst genommen wird und persönliche Probleme lösen kann. Diese Anwendung wie ich sie hier wollte war auch nicht in der Aufgabenstellung. Ich wollte es aus persönlicher intiative Hinzufügen, da es für mich mit diesem Zusatz mehr Sinn gemacht hätte.
Nein .
Es wäre ein Rechteck und das Programm sagt ob die breite oder die Länge länger ist. Das Quadrat hab ich hinzugefügt da es im falle von identischer Länge ein Quadrat wär.
Ich weiss schon was du willst. Ich meinte wenn du eine Methode "getLangeSeite()" hast sollte die ja nicht zurückliefern ob es ein Quadrat ist. das sollte eine Methode isQuadrat() tun.
Also wenn ich nun alles richtig verstanden habe willst du diese Funktion nur als "Informationsquelle" nutzen, und damit keine weiteren Mathematischen Operationen durchführen..!?
Wenn ja:
Würde ich 1. den Rückgabewert der funktion zu String ändern, und den Namen in etwas umwandeln wie "getLangeSeiteInfo()" o.ä.
Andernfalls mach es wie JStein52 gesagt hat durch ein "isQuadrat()" auf die Quadrat-Eigenschaft prüfen und getLangeSeite() liefert wie gehabt die längere, bzw. bei gleichlangen Seiten eben einen der beiden Werte (egal welchen) zurück.
Also 1 geht nicht, da ich ja die grösse vergleichen muss.
Also meinst du, wenn die Seiten identisch währen würde getLangeSeite() einfach einen Wert ausgeben und isQuadrat() klarstellen ob es sich um ein Quadrat handelt?
wenn ja:
Stimmt das wäre eine Lösung. Ich sehe hier aber das Problem, dass bei der Ausgabe der Wert der längeren Seite ja falsch wäre und das beim Anwender Verwirrung stiften könnte. Es sollte demnach bei "Längere Seite: " ein "-" oder sowas stehen und das ist wieder ein String.
Sorry für die vielen Fragen bin halt noch am Anfang mit Java und hab hie und da Probleme mit der Syntax.
Die Prüfung auf "isQuadrat()" sollte dann auch vor der Ausgabe der langen Seite kommen, damit du keine falschen Informationen ausgibst.
Pseudocode:
Wenn Quadrat dann: Ausgabe: "Es ist ein Quadrat mit der einer Seitenlänge von: " + getLangeSeite();
ansonsten: Ausgabe "Es ist ein Rechteck mit den Längen von: " + getLangeSeite() + "/" + getKurzeSeite()
Wieso wäre das falsch ? Was ist die längere Seite eines Quadrates ? Deshalb meine Bemerkung zu philosophischer Frage vorhin Das hat auch alles nichts mit Java und Syntax zu tun sondern ist eine Designentscheidung
Die Frage ist doch, was du überhaupt haben willst.
Willst du dass die längste Seite eines Quadrats zurückgegeben wird? -> führe die Methode ganz normal aus, denn dann ist es egal ob Länge oder Breite zurückgegeben wird
Willst du eine Ausgabe der Längen inklusive der Info ob es ein Quadrat oder nur ein Rechteck ist? -> mach es so wie Times geschrieben hat
@JStein52@Times@SchwarzWeiß
Danke für eure Hilfe nach langem ausprobieren und überlegen hats geklappt. Ich weiss nicht ob es nun wirklich so ist wie Times es sich vorgestellt hat, auf jeden Fall geht es in die Richtung.
Wenn ihr Lust habt und ihn versteht, hier ist der Quelltext.
An deinen Einrückungen solltest du noch arbeiten. Sie sind... seltsam.
Ansonsten gäbe es auch noch die eine oder andere Verbesserung, z.B.
Java:
voidisQuadrat(){// Achtung kein Rückgabetyp und dein d ist lokalboolean d;// hier deklarierst du "d"if(laenge == breite){
d =true;}else{
d =false;}// ab hier gibt es "d" nicht mehrbooleanisQuadrat(){return laenge == breite;}
Sorry, Blödsinn, aufgrund der seltsamen Einrückungen habe ich erst jetzt den Rest der Funktion gesehen. Aber als Tip: bei einer Funktion mit diesem Namen gehe ich davon aus, dass die Rückgabe ein boolean ist. Das ist eine weit verbreitete Konvention.
Ich weiss deshalb hab ich auch geschrieben "wenn ihr ihn versteht" weil er ist echt unübersichtlich. Ich hab mich hier halt vor allem auf das Programm nicht auf die Darstellung bezogen. Sorry dafür. Über die Verbesserungen bin ich mir auch bewusst. Beispielsweise könnte ich im Prinzip auf den ganzen Rechnerischen teil in isQuadrat verzichten und müsste nur den System.out Befehl Schreiben (Boolean usw. sind unnötig, da ich nur den Befehl von isQuadrat2 brauche). Das hab ich erst im nachhinein gesehen, da ich verschiedene Lösungswege ausprobiert habe. Ich war am Schluss aber so froh das es funktionierte das ich ihn unmittelbar danach hierhin gepostet habe.
Schön dass es geklappt hat. Hier zwei minimale Anmerkungen:
1. wie schon von temi geschrieben, der Präfix "is" deutet laut Konvention auf einen boolean-Rückgabewert hin, wenn du nur eine Ausgabe in der Methode machst, kannst du sie ja z.B. printXY nennen
2. du brauchst nicht
Java:
if(d ==true)
schreiben,
Java:
if(d)
reicht, aber wenn du es wie Temi machst, hat sich das sowieso erledigt, dann kannst du
Java:
if(isQuadrat())
schreiben und dieser Code sieht dann auch gleich viel verständlicher aus
Noch eine Anmerkung: Die Sichtbarkeit ist für alle deine classmember identisch. Damit sind die getter/setter ziemlich witzlos, weil jede Klasse die auf die methoden zugreifen darf, ebenfalls auf die Klassenvariablen direkt zugreifen kann.
Grundregel ist dabei, dass eine Klasse nur die Methoden öffentlich macht, die auch wirklich von außen benötigt werden.
Auf den parameterlosen Standardkonstruktor kannst du vermutlich komplett verzichten oder findest du es sinnvoll ein Rechteck mit den Abmessungen 0 x 0 zu erzeugen? In diesem Sinn ist es auch sinnvoll die Parameter des zweiten Konstruktors auf Null zu prüfen und z.B. mit einer Exception zu reagieren. Allerdings ist das auch anwendungsabhängig, wenn du "nicht existierende" Rechtecke benötigst dann ist das OK, allenfalls könntest du die Codeduplikation vermeiden indem du es so machst:
Java:
publicRechteck(){this(0,0);// ruft den zweiten Konstruktor auf}
Hey, habe mal deinen Code ein wenig überarbeitet. Ich hoffe ich habe nicht zuviel vorweg genommen, und hoffe ebenso dir damit ein bisschen helfen zu können.
An sich ist mir folgendes aufgefallen (Wurde auch bereits kommentiert von meinen Vorgängern!)
Wir geben den Methoden nicht umsonst gewisse Namen die anfangen mit "set", "get" oder "is".. bei "is" würde ich IMMER einen Boolschen Rückgabewert erwarten wenn ich diese Methode von aussen aufrufe.
Bei get, erwarte ich immer gewisse Objekte als Rückgabewert und mit set möchte ich auch immer etwas setzen. Das war ja soweit auch in Ordnung.
isQuadrat2 .. ist für eine Konsolenausgabe ein sehr unglücklicher Name!
Die von mir angefügten Kommentare musst du nicht hinzufügen, dies ist nur eine Angewohnheit von mir!
Zudem habe ich modifier wie private/public zu den Attributen und Methoden hinzugefügt. Wenn da etwas unklar ist, kann ich dir gerne nochwas dazu schreiben Frag dann einfach
Meine ganzen "this." kannst du, musst du aber nicht ignorieren. Auch eine Angewohnheit von mir. Ich finde es wesentlich einfacher den Code zu lesen wenn ich direkt sehe wo das Attribut herkommt, bzw hingehört. Wenn ich Vererbung benutze kann ich schließlich auch ein super. benutzen. Ist also auch kein muss.
Zuletzt habe ich bei Berechnungen noch Klammern gesetzt. Im grunde genommen gilt zwar nach wie vor "Punkt vor Strich" Rechnung, aber so ist es für den Entwickler auch einfacher zu lesen. Okay, bei so kurzen Rechenoperationen sollte es auch kein Problem darstellen, aber ich brauche nur mit dem Cursor zur ersten Klammer gehen und sehe sofort (auch wenn der Code über mehrere Zeilen gehen sollte) wo das Ende dieser Operation ist.
Auch kein muss, aber vorallem bei sehr langen Rechnungen hilfreich.
Code:
public class Rechteck {
private double laenge, breite;
/**
* Erstellt ein Recheck mit einer Breite und Hoehe von 0.
*/
public Rechteck() {
this(0,0);
}
/**
* Erstellt ein Recheck.
* @param laenge Laenge des Rechtecks.
* @param breite Breite des Rechtecks.
*/
public Rechteck(double laenge, double breite) {
this.laenge = laenge;
this.breite = breite;
}
/**
* Setzt die Laenge des Rechtecks.
* @param laenge Laenge des Rechtecks.
*/
public void setLaenge(double laenge) {
this.laenge = laenge;
}
/**
* Setzt die Breite des Rechtecks.
* @param breite Breite des Rechtecks.
*/
public void setBreite(double breite) {
this.breite = breite;
}
/**
* Setzt das Rechteck auf eine neue Groesse.
* @param laenge Laenge des Rechtecks.
* @param breite Breite des Rechtecks.
*/
public void setSize(double laenge, double breite){
this.laenge = laenge;
this.breite = breite;
}
/**
* @return Laenge des Rechtecks.
*/
public double getLaenge() {
return this.laenge;
}
/**
* @return Breite des Rechtecks.
*/
public double getBreite() {
return this.breite;
}
/**
* Ermittelt die lange Seite des Rechtecks.
* @return Laengere Seite des Recktecks, wenn diese unterschiedlich lang sind.
*/
public double getLangeSeite(){
return Math.max(this.laenge, this.breite);
}
/**
* Ermittelt die kurze Seite des Rechtecks.
* @return Kuerzere Seite des Rechtecks, wenn diese unterschiedlich lang sind.
*/
public double getKurzeSeite(){
return Math.min(this.laenge, this.breite);
}
/**
* Ermittelt die Diagonale des Rechtecks.
* @return Diagonale des Rechtecks.
*/
public double getDiagonale() {
return Math.sqrt((this.laenge * this.laenge) + (this.breite * this.breite));
}
/**
* Ueberprueft ob es sich bei dem Rechteck um ein Quadrat handelt
* @return true, wenn beide Seiten gleich lang sind.
*/
public boolean isQuadrat(){
return this.laenge == this.breite;
}
/**
* Ermittelt die Flaeche des Rechtecks.
* @return Flaeche des Rechtecks.
*/
public double getFlaeche() {
return this.laenge * this.breite;
}
/**
* Ermittelt den Umfang des Rechtecks.
* @return Umfang des Rechtecks.
*/
public double getUmfang() {
return (2 * this.laenge) + (2 * this.breite);
}
/**
* Gibt Information/en zur Groesse des Rechtecks aus.
* @param einheit Zusaetzliche Einheit zur Ausgabe.
*/
public void printInfo(String einheit){
if (this.isQuadrat()){
System.out.println(String.format("Das Rechteck ist ein Quadrat mit einer Seitenlaenge von %f %s", this.laenge, einheit));
}else{
System.out.println(String.format("Das Rechteck hat eine Länge von %f %s und eine Breite von %f %s", this.laenge, einheit, this.breite, einheit));
}
}
}
Ich hab mir eure Kommentare angeschaut und nachvollzogen. Sie sind alle sehr hilfreich. Ich bin wie gesagt noch am Anfang von Java und bin froh über jegliche Hilfe. Danke vielmal.