Berechnung von Flächen

Woelkchen

Mitglied
Hallo!

ich bin das erste mal hier, da ich von der Uni aus eine Einführung in die Informatik machen muss.
Habe ansonsten überhaupt nichts mit Java zu tun!

Wir werden jetzt einfach ins kalte Wasser geworfen und sollen Aufgaben erledigen, die besonders Mathematik -lastig sind. Dabei sind wir Geisteswissenschaftler :)

Ich hab jetzt die Aufgabe zu 80 % alleine hinbekommen, und die Test zeigen dafür auch alles richtig an. Bei den 3 anderen Teilaufgaben komm ich aber nicht weiter. Die Abgabe würde zwar gezählt werden (gelber Haken) aber ich hätte gerne grün ;)

könnt ihr bitte mal schauen, was ich da falsch gemacht habe?

Aufgabestellung:

Ziel dieser ersten Aufgabe ist es, eine Klasse in Java mit einigen einfachen Funktionen zu erstellen. Es werden in dieser Stufe lediglich Berechnungen und Zuweisungen benötigt. Alle Funktionen können ohne Konstrollstrukturen oder weiterführende Konzepte erstellt werden.
Hinweis: Für manche Funktionen kann es hilfreich sein, auf Methoden der java-Klasse Math zurückzugreifen, die einfache mathematische Berechnungen bereits implementiert.

Erstellen Sie nun die Klasse AusdrueckeUndFunktionen im Paket funktionen.
Diese Klasse soll folgende Funktionen besitzen:

  • public static double rechtecksFlaeche(double x1, double y1, double x2, double y2)
    Berechnet die Rechtecksfläche, die durch die Eckpunkte (x1,y1) und (x2,y2) festgelegt wird.
  • public static double dreiecksFlaeche(double a, double b, double c)
    Berechnet die Fläche eines Dreiecks, welches durch die Seitenlängen a, b und c definiert ist. Hierzu kann die "Heronische Formel" benutzt werden. Diese lautet:
  • public static double dreiecksFlaeche(double ax, double ay, double bx, double by, double cx, double cy)
    Berechnet die Fläche eines Dreickes, das durch die Punkte (ax,ay),(bx,by) und (cx,cy) festgelegt ist.
    Hinweis: Math.hypot kann helfen, aus gegegebenen Eckpunkten eines Dreiecks die Seitenlängen zu berechnen.

Hier mein Code dazu, aber bitte nicht lachen :) wie gesagt, der Rest der Aufgabenstellung funktioniert.

Java:
public static double rechtecksFlaeche(double x1, double y1, double x2, double y2)
	/* verstehe ich einfach nicht . das return ist nur zum testen für das PABS System */
	{
	    return x1;
    }

	public static double dreiecksFlaeche(double a, double b, double c)
	/* 
	 * einfache Wiedergabe der Formel.
	 * */
	{
	double s = (a + b + c) / 0.2d;
        double f = Math.sqrt(s * (s - a) * (s - b) * (s - c));
        return f;
    }
	public static double dreiecksFlaeche(double ax, double ay, double bx, double by, double cx,
        double cy)
	
	{
	    return 0.5 * (ax * (by - cy) + bx * (ay - cy) + cx * (ay - by));
    }

Meine Fehlermeldung:

Testcase: testrechtecksFlaeche took 0 sec
[junit] FAILED
[junit] Wrong area of rectangle (0,0), (1,1) expected:<1.0> but was:<0.0>
[junit] junit.framework.AssertionFailedError: Wrong area of rectangle (0,0), (1,1) expected:<1.0> but was:<0.0>
[junit] at tests.fTests.TestAusdrueckeUndFunktionenFunction.testrechtecksFlaeche(TestAusdrueckeUndFunktionenFunction.java:217)
[junit]
[junit] Testcase: testdreiecksFlaecheSeitenlaenge took 0 sec
[junit] FAILED
[junit] Wrong area of triangle with side lengths (1,1,1) expected:<0.4330127018922193> but was:<202.87927444665215>
[junit] junit.framework.AssertionFailedError: Wrong area of triangle with side lengths (1,1,1) expected:<0.4330127018922193> but was:<202.87927444665215>
[junit] at tests.fTests.TestAusdrueckeUndFunktionenFunction.testdreiecksFlaecheSeitenlaenge(TestAusdrueckeUndFunktionenFunction.java:238)
[junit]
[junit] Testcase: testdreiecksFlaechePunkte took 0 sec
[junit] FAILED
[junit] Wrong area of triangle with corner points (1,1), (1,2), (2,1) expected:<0.5> but was:<-0.5>
[junit] junit.framework.AssertionFailedError: Wrong area of triangle with corner points (1,1), (1,2), (2,1) expected:<0.5> but was:<-0.5>
[junit] at tests.fTests.TestAusdrueckeUndFunktionenFunction.testdreiecksFlaechePunkte(TestAusdrueckeUndFunktionenFunction.java:253)
[junit]
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
aus zwei Punkten kannst du nicht erkennen welches Rechteck gemeint ist und wie die Fläche davon berechnet wird?
das ist doch noch das einfachste unter diesen Aufgaben,

die Formel zur dreiecksFlaeche(double a, double b, double c) habe ich in 5 sec. bei google gefunden,
Dreiecksfläche ? Wikipedia
mit 1, 1, 1 manuell ausgerechnet und komme auf 0.433, dein Programm liefert in der Tat über 200,

hast du überhaupt keine Idee was du dabei machen könntest? z.B. den Code in einem normalen Java-Programm ausführen,
Zwischenwerte wie s oder s * (s - a) * (s - b) * (s - c) ausgeben, mit manueller Rechnung vergleichen?

das Dritte habe ich mir noch nicht angeschaut in Hoffnung auf etwas weitere Eigenarbeit
 

Woelkchen

Mitglied
Hallo

Bin gerade nur am Handy deshalb kann ich nur kurz antworten :)

Wenn ich s=(a+b+c)/2 rechne also 1.5
Und dann f = sqrt(1.5*0.5*0.5*0.5)
Komme ich auch auf 0.433..

Was ist dann im Code falsch?
Das mit dem 0.2d habe ich irgendwo gefunden. Kann ich da einfach 2 schreiben?

Rechteck mach ich ja mit
Return a *b;
Aber da hatte eclipse was gemeckert....
 

faetzminator

Gesperrter Benutzer
Natürlich meckert Eclipse, denn du hast weder [c]a[/c] noch [c]b[/c]. Aber ist nicht schwierig, denn [c]a = |x1-x2|[/c] und [c]b = |y1-y2|[/c] ;)
 
S

SlaterB

Gast
> Das mit dem 0.2d habe ich irgendwo gefunden. Kann ich da einfach 2 schreiben?
was ist das für ein Vorgehen?

und ja, es sei verraten dass /2 und /0.2 was anderes sind, s ist bei dem Code NICHT 1.5

> Bin gerade nur am Handy deshalb kann ich nur kurz antworten
dann lieber gar nicht bis du bereit bist
 

Woelkchen

Mitglied
Aah die Betragstriche!!!!
Ja die hatte ich beim rumprobieren vergessen.

Wie schreibe ich denn in Java die 2. Aufgabe mit den 2 Formeln.
Ich Weiß nicht wie Java da vorgeht beim rechnen und wir haben die begriffe wie math noch nie behandelt (naja und auch alles andere nicht).
 
S

SlaterB

Gast
@faetzminator
naja, | kann man nicht einfach so schreiben.., jedenfalls nicht in dieser Bedeutung
 

faetzminator

Gesperrter Benutzer
@faetzminator
naja, | kann man nicht einfach so schreiben.., jedenfalls nicht in dieser Bedeutung

Klar, ich meinte natürlich auch [c]Math.abs()[/c]. Habs bewusst so geschrieben, damit nicht einfach 1:1 kopiert werden kann - und weil dies der Student wohl auch eher versteht als [c]abs()[/c]. Irgendwie fehlt es hier noch etwas an Eigeninitiative...
 

Woelkchen

Mitglied
So ich bin nun wieder an meinem Laptop und habe mir folgendes überlegt:

Java:
public static double rechtecksFlaeche(double x1, double y1, double x2, double y2)
	
	{
	   
	    double a = Math.abs(x1-x2);
	    double b = Math.abs(y1-y2);
	    
	    return a * b;
    }

	public static double dreiecksFlaeche(double a, double b, double c)
	
	{
	    double s = (a + b + c) / 2;
        double f = Math.sqrt(s * (s - a) * (s - b) * (s - c));
        return f;
    }
	
	public static double dreiecksFlaeche(double ax, double ay, double bx, double by, double cx, double cy)
	
	{
	    /*
	     * P1 = (axay)
	     * P2 = (bxby)
	     * P3 = (cxcy)
	     * */
	    
	    return 0.5 * Math.abs(ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));
    }


was sagt ihr dazu?
Danke schon mal für eure Tipps!
Nach den vielen Stunden gestern hatte ich irgendwann keinen Durchblick mehr.
Wollte auch noch kurz sagen, dass ich Kunstgeschichte studiere :) deshalb kann ich auch kein Java.
Haben es erst seit letzter Woche mal "gesehen"! deshalb kannte ich auch Math.abs() nicht, und "Java ist eine Insel" hab ich gestern das erste mal gesehen und wusste nicht, wo ich das finde was ich brauche, da ich ja nicht weiß, nach was ich suchen kann.

da liefert PABS übrigens auch noch einen Fehler:

Java:
// das ist richtig:
public static boolean zwischenNullUndHundert(double x)
	{
        if (x >= 0 && x <= 100) {
            return true;
        } else {
            return false;
        }
    }
//da ist was falsch: Argument > 100 caused wrong result.
// ich habe es auch schon mit !(x > 0) && !(x < 100) probiert oder eben <= und >= und 101
	public static boolean nichtZwischenNullUndHundert(double x)
	{
        if ((x < 0) && (x > 101)) {
            return true;
        } else {
            return false;
        }
    }
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> und wusste nicht, wo ich das finde was ich brauche, da ich ja nicht weiß, nach was ich suchen kann.
eine Suchfertigkeit würde dir übrigens gewiss auch in Kunstgeschichte und anderen Lebenslagen helfen ;)
'in java rechnen', ''Mathematik', '+' wären irgendwo Anfänge

-----

"if ((x < 0) && (x > 101)) {"
bedeutet nach Adam Riese in deutscher Sprache
"wenn x kleiner 0 ist und außerdem noch x größer 101",
das dürfte für kein x der Welt zutreffen,

was willst du stattdessen ausdrücken?
 
S

SlaterB

Gast
"kleiner als 0 oder größer als 100"
kingt schon nach einer sinnvolleren Prüfung als bei dir quasi implementiert
"kleiner als 0 und größer als 100"

kannst du mit diesem Hinweis deine Probleme lösen?
 
S

SlaterB

Gast
| ist kein gebräuchlicher Operator, wie auch ein einzelnes & nicht,
aber ja, so gehts wohl voran, hättest ruhig auch deinen Test bemühen können
 

stikio

Mitglied
Java:
if (x < 0 | x > 100)
so dann?

Java:
			if(x < 0 || x > 100){
				...
			}
			else{
				...
			}
sollte es "oder" sein, && für "und" ! hier sind die 0 und die 100 die grenzwerte, was heisst, dass etwas getan wird wenn x -unendlich bis -1 annimmt oder x 101 bis unendlich annimmt. alle werte dazwischen werden in der else anweisung behandelt
 

Woelkchen

Mitglied
Juhuuu es geht alles --> grüner Haken!

Vielen Dank für eure schnelle Hilfe, hier mein kompletter aufgearbeiteter Code, falls ihn jemand anschauen will :)
werde ihn aber gleich wieder hier löschen ;)

Java:
[SlaterB: gesamte Lösung auf Wunsch gelöscht]
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Also ich muss den TO mal etwas in Schutz nehmen. Es stimmt zwar, dass er/sie die Suchmaschinen mehr hätte bemühen können, jedoch habe ich hier im Forum schon extrem viele informatik Studenten erlebt, die:
1) Auf Tipps welche gegeben wurden gar nicht eingegangen sind
2) Deutlich weniger Eigeninitiative gezeigt haben
3) Schlechteren Code produziert haben als der/die TO es getan hat obwohl es Fachfremd ist.

In Zukunft vielleicht wirklich etwas mehr googlen aber ich muss sagen hier hat zumindest mal jemand am anderen Ende der Leitung mitgedacht!
 

Woelkchen

Mitglied
Danke kappesf :)

ja ich habe mich daran jetzt insgesamt 10 Stunden versucht, auch mit googeln. Es ist nur eben schwer wenn man nicht weiß wonach man suchen soll. Aber dadurch, dass ich es jetzt alleine gemacht habe, mit euren Tipps, habe ich es verstanden und hoffe, ich bekommen die anderen Aufgaben die folgen auch hin!

PS: ich habe das mit dem || zu spät gelesen und jetzt ein | gelassen, geht aber trotzdem.
PPS: ich bin eine Sie :)
 

faetzminator

Gesperrter Benutzer
if (x < 0 | x > 100)

| ist kein gebräuchlicher Operator, wie auch ein einzelnes & nicht

Normalerweise verwendet man [c]||[/c] bzw. [c]&&[/c]. Unterschied zwischen [c]|[/c] und [c]||[/c] ist, dass bei [c]|[/c] der zweite Ausdruck auch noch geprüft (und dementsprechend ausgeführt) wird, wenn der erste bereits [c]true[/c] ist und die Bedingung somit wahr ist. Umgekehrt natürlich mit [c]&[/c], da wird letzteres noch ausgeführt, auch wenn ersteres [c]false[/c] ist.
Die Idee dahinter ist, dass allenfalls noch irgendwelcher Code durchlaufen muss, auch wenn die Bedingung nicht zutrifft. Als Anfänger ist das aber eher unwichtig, darum verwende einfach [c]&&[/c] und [c]||[/c].
 

Neue Themen


Oben