# Berechnung von Flächen



## Woelkchen (20. Dez 2011)

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.


```
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]


----------



## SlaterB (20. Dez 2011)

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 (20. Dez 2011)

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 (20. Dez 2011)

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]


----------



## SlaterB (20. Dez 2011)

> 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 (20. Dez 2011)

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).


----------



## SlaterB (20. Dez 2011)

siehe auch mein Posting zwischendurch,

alles kann in Suchmaschinen eingegeben werden oder mit etwas Durchschauen der Kapitel + Index bestimmt in einem Lehrbuch wie
Galileo Computing :: Java ist auch eine Insel - index
(edit: 18.3 Die Eigenschaften der Klasse Math)


----------



## faetzminator (20. Dez 2011)

Woelkchen hat gesagt.:


> 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).



Genau gleich wie du von Hand.
1. Von links nach rechts
2. Punkt vor Strich
3. Klammerung ist oft hilfreich


----------



## SlaterB (20. Dez 2011)

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


----------



## faetzminator (20. Dez 2011)

SlaterB hat gesagt.:


> @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 (20. Dez 2011)

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


```
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:


```
// 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;
        }
    }
```


----------



## Gast2 (20. Dez 2011)

Entweder >100 oder >=101 

So wie es da steht ist 101 noch drin!


----------



## SlaterB (20. Dez 2011)

> 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?


----------



## Woelkchen (20. Dez 2011)

So lautet die Aufgabe:

Prüft, ob das übergebene x nicht zwischen 0 und 100 (kleiner als 0 oder größer als 100) ist.


----------



## SlaterB (20. Dez 2011)

"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?


----------



## Woelkchen (20. Dez 2011)

if (x < 0 | x > 100)

so dann?


----------



## SlaterB (20. Dez 2011)

| 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 (20. Dez 2011)

> ```
> if (x < 0 | x > 100)
> ```
> so dann?




```
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 (20. Dez 2011)

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 


```
[SlaterB: gesamte Lösung auf Wunsch gelöscht]
```


----------



## Gast2 (20. Dez 2011)

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 (20. Dez 2011)

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 (20. Dez 2011)

Woelkchen hat gesagt.:


> if (x < 0 | x > 100)





SlaterB hat gesagt.:


> | 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].


----------

