# Dreieck prüfen



## mediendennis (31. Okt 2010)

Hallo,

lerne gerade Java an der Uni und habe folgendes Problem. 
Die Aufgabe ist es ein Programm zu schreiben, welches die Seitnlängen eines Dreiecks liest und prüft, ob es sich dabei um ein gleichseitiges, gleichschenkeliges, rechtwinkeliges, gültiges oder ungültiges Dreieck handelt. 
Ungülitg halt dann, wenn eine Seiten länge 0 oder negativ ist.

Ich habe es eigentlich hinbekommen, allerdings klappt die Abfrage nicht immer?? Woran kann das liegen??? Wäre über jede Hilfe dankbar.

Hier mein Code: 


```
public class Dreieck {

	public static void main ( String[] args ) {
        
	// Deklarationen der 3 Seitenlängen des Dreiecks
	
	double a;
	double b;
	double c;
	
		// Berechnung und Bildschirmausgabe
        
	    {
		System.out.println ("");
		System.out.println ("Bitte geben Sie die Laengen der 3 Seiten des zu untersuchenden Dreiecks ein.");
		System.out.println ("Bitte verwenden Sie anstelle eines Dezimalkommas einen Dezimalpunkt.");
		System.out.println ("");
		
		a = In.readDouble(); b = In.readDouble(); c = In.readDouble();
		
		
		
			// Überprüfung ob das Dreieck gleichseitig ist
		
			if (a==b&&b==c)
					{
					System.out.println ("Das Dreieck mit den Seitenlaengen " + a + ", "+ b + " und " + c + " ist gueltig und gleichseitig.");
					}
					
				// Überprüfung ob Dreieck gleichschenkelig ist

				else if ((a==b||a==c||b==c))
			
							{
							System.out.println ("Das Dreieck mit den Seitenlaengen " + a + ", "+ b + " und " + c + " ist gueltig und gleichschenkelig.");
							}
					
					// Überprüfung ob das Dreieck rechtwinkelig ist				
					
					else if (Math.pow(a,2)+Math.pow(b,2)==Math.pow(c,2))
		
									{
									System.out.println ("Das Dreieck mit den Seitenlaengen " + a + ", "+ b + " und " + c + " ist gueltig und rechtwinkelig.");
									}
						
						else if (a<=0)				
					
									{
									System.out.println ("UNGUELTIG!");
									}
						else if (b<=0)				
					
									{
									System.out.println ("UNGUELTIG!");
									}
						else if (c<=0)				
					
									{
									System.out.println ("UNGUELTIG!");
					}			
					
	    }
	
	}
	
}
```


Bin gerade in der 3. Vorlesung, also soo viel kann ich noch nicht!

LG dennis


----------



## Marcinek (31. Okt 2010)

*Und wann kappt es nicht?*


Das hier ist falsch: siehe posting drunter
Nur weil die Seiten den Satz von Pytagoras erfüllen, bedeutet es nicht, dass das Dreieck rechtwinklig ist. (Beweis: a= 1, b=1, c= 1 ==> 1^2 + 1 ^2 = 1 ^2 ==> Alle Winkel haben aber ~ 60 grad


----------



## andiv (31. Okt 2010)

1^2 + 1^2 = 2 != 1 = 1^2
=> Beweis widerlegt


----------



## Marcinek (31. Okt 2010)

Verdammt zu kurz gedacht ^^


----------



## Hemme (31. Okt 2010)

Mich würde jetzt auch interessieren, was genau seiner Meinung nach nicht klappt ^^


----------



## XHelp (31. Okt 2010)

Zumal ich fürs erste untersuchen würde, ob es ein Dreick ist... Laut deinem Programm müsste 1,1,100 ein gleichschenkliges Dreieck sein.


----------



## mediendennis (2. Nov 2010)

Danke schonmal für die Antworten.

Die Abfrage klappt an und für sich ja. Aber wenn ich zB den zweiten Wert mit 0 eingebe, klappt manchmal die Ausgabe "Ungültig" und manchmal nicht.

??? Keine Ahnung wieso!


----------



## SlaterB (2. Nov 2010)

ein Programm mit System.in-Eingabe ist immer schlecht (bei dir gar unbekannte Eingabe), 
wenn möglich teste und poste es mit 
> double a = 3;
>	double b= 0;
>	double c = 5;
oder was auch immer und ohne Eingabe, dann können es auch andere nachvollziehen

mit Eingabe kann alles mögliche schiefgehen, 
aber du kannst dein Programm danach debuggen/ loggen,
loggen z.B. mit System.out.println(),
fängt direkt nach der Eingabe an:
System.out.println("a ist .., b ist .. usw"),

dann schreibst du notfalls in jedes einzelnen if/else auch eine Ausgabe, bis du exakt nachvollzogen hast, was passiert,
bei den ersten if/else vielleicht unnötig da die richtigen Ausgaben sowieso eindeutig zeigen, was passiert ist,
aber weiter hinten:

> else if (a<=0)	{
>	System.out.println ("UNGUELTIG! a<=0");
> } else if (b<=0)	 {
>	System.out.println ("UNGUELTIG! b<=0");
> }	else if (c<=0)	{
>  System.out.println ("UNGUELTIG! c <=0");
usw.

wenn gar keine Ausgabe kommt baue ganz am Ende noch ein else rein, gib dort nochmal alle Werte aus,
gib auch die boolean-Vergleiche aus:
System.out.println("ist b <= 0?: "+(b <= 0));

usw.,
jeden einzelne Aktion des Programms kannst du komplett nachvollziehen,
es keinen Grund, dies nicht selber zu machen und andere zu fragen


----------



## Andi_CH (2. Nov 2010)

Das eigentliche Problem ist sicher nicht der Java-code der überprüfung, sondern ein IO Problem
aus diesem Grund meine Lösung 

Solche Funktionalitäten sollten immer in Prozeduren gekapselt werden. Das macht sie wiederverwendbar und vor allem testbar.

(Ach ja Dennis, mach doch bitte JAVA und nicht CODE Tags ...)

Frage an die Profis, eigentlich sind ja Dreiecksseiten keine int.
Ein Dreick mit a=5, b=5 und  c=sqrt(50) ist aber gültig und rechtwinklig. Gibt es einen Zahlentyp oder eine Möglichkeit die Rechtwinkligkeit zu überprüfen (ok. mit Runden hab ichs auch hinbekommen ;-) )


```
public class Dreieck {
	
	public static void main( String[] args ) {
		prüfeDreieck(0, 1, 2);  // ungültiger Wert
		prüfeDreieck(1, 2, 10); // ungültiges Dreieck
		prüfeDreieck(1, 1, 1);  // gleichseitig und gleichschenklig
		prüfeDreieck(5, 5, 3);  // gleichschenklig
		prüfeDreieck(3, 4, 5);  // rechtwinklig
		// ein rechtwinklig gleichschenkliges Dreieck lässt sich IMHO nicht
                // mit Integern bilden umstellen auf double bringt auch nichts,
                // weil dann der Vergleich in prüfeDreieck schief läuft.
		// double x = 3;
		// Math.pow(Math.sqrt(x), 2) == x ist false! 
	}

	public static void prüfeDreieck (int a, int b, int c)
	{
		//Zuerst auf grundsätzliche Gültigkeit überprüfen
		if(a<=0 || b<=0 || c<=0) {
			System.out.println("Einer der Werte " + a + ", " + b + " oder " + c + " ist ungültig");
		} else if ((a+b<c) || (a+c<b) || (b+c<a)) {
			System.out.println("Mit den Längen " + a + ", " + b + " und " + c + " kann kein Dreieck gezeichnet werden");
		} else {
			// Die folgenden Prüfungen sollten sich nicht ausschliessen, denn es
			// gibt auch rechtwinklig gleichschenklige Dreiecke und ein 
			// gleichseitiges Dreieck ist auch gleichschenklig
			//
			// Überprüfung ob das Dreieck gleichseitig ist
			if (a==b && b==c)
			{
				System.out.println ("Das Dreieck mit den Seitenlaengen " + a + ", "+ b + " und " + c + " ist gueltig und gleichseitig.");
			}
			// Überprüfung ob das Dreieck gleichschenklig ist
			if ((a==b||a==c||b==c))
			{
				System.out.println ("Das Dreieck mit den Seitenlaengen " + a + ", "+ b + " und " + c + " ist gueltig und gleichschenklig.");
			}
			// Überprüfung ob das Dreieck rechtwinklig ist	
			if ((Math.pow(a,2)+Math.pow(b,2)==Math.pow(c,2)) ||
					(Math.pow(a,2)+Math.pow(c,2)==Math.pow(b,2)) ||
					(Math.pow(b,2)+Math.pow(c,2)==Math.pow(a,2)))
			{
				System.out.println ("Das Dreieck mit den Seitenlaengen " + a + ", "+ b + " und " + c + " ist gueltig und rechtwinklig.");
			}
		}			
	}
}
```


----------

