# Satz des Pythagoras



## deni100 (15. Dez 2010)

```
package satz;

public class haupt {

	public void eingabe() {
		
		int a;
		int b;
		int c;
		int d;
		int ausgabe ;
		a= 0;
		b =0;
		c =0;
		d = 0;
		ausgabe = c*2;
		
		for (b=0;((a*2)*(b*2)==ausgabe);b++){
				
			
			if (b<=9){
				a++;
				b=0;
				
			}
			if ((a*2)*(b*2)==ausgabe){
			System.out.println (ausgabe);
			
			}
			
			
		}		
		
		
	}

}
```


Hallo ich muss mit einem Algorithmus (Implementation), dabei muss ich den  Satz des Pythagoras anwenden.

also (a*2)*(b*2)==(C*2)

Ich muss also die Triples herausfinden :S.
Was mache ich falsch ?


----------



## XHelp (15. Dez 2010)

Was musst du machen?
Es schadet übrigens nicht dir anzugucken, wie der Satz des Pythagoras richtig lautet

P.S. Klassennamen werden groß geschrieben. Warum lautet deine Methode zur Berechnung 
	
	
	
	





```
eingabe
```
? oO


----------



## deni100 (15. Dez 2010)

XHelp hat gesagt.:


> Was musst du machen?
> Es schadet übrigens nicht dir anzugucken, wie der Satz des Pythagoras richtig lautet





Der Satz des Pythagoras ist 
a2 + b2 = c2, (immer hoch ²)


uppppppppppppppppppppppppppppppppps deswegen kriege ich das net hin . muss plus machen xD


----------



## SlaterB (15. Dez 2010)

zur Sicherheit ob du nicht noch viel mehr falsches eingebaut hast am besten mal testen..
a=3, b=4, c=5 ist immer gute Kombi


----------



## XHelp (15. Dez 2010)

deni100 hat gesagt.:


> muss plus machen xD



Das glaube ich eher weniger...


----------



## SlaterB (15. Dez 2010)

ein Plus schadet durchaus nicht


----------



## XHelp (15. Dez 2010)

Achso, *DA* ein Plus... War jetzt eher auf *2 fixiert


----------



## deni100 (15. Dez 2010)

SlaterB hat gesagt.:


> zur Sicherheit ob du nicht noch viel mehr falsches eingebaut hast am besten mal testen..
> a=3, b=4, c=5 ist immer gute Kombi



Die Aufgabe ist :
Gesucht sind alle Zahlen a, b und c von 1 bis zu einer Obergrenze due eub sikches Tripel erzeugen. 

Ich glaube ich habe die variable c bisschen falsch gemacht und die Obergrenze nicht angesetzt :S


Was denkt ihr, sollte ich lieber versuchen es mit einer Zählerschleife oder mit ner while Schleife zu machen ? Eher Zählerschleife oder nicht ?


----------



## deni100 (15. Dez 2010)

```
package satz;

public class haupt {

	public void Eingabe() {
		
		int a;
		int b;
		int c;
		int d;
		int ausgabe ;
		a= 0;
		b =0;
		c =0;
		d = 0;
		ausgabe = (int) Math.pow(c, 2);
		
		while ((a*2)+(b*2)!=ausgabe){//for (d=0;(a*2)+(b*2)==ausgabe;d++){
			c++;
			if (c<=9){
				b++;
				c=0;
				if (b<=9){
					a++;
					b=0;
				}
				
				}
				
			}
			
		if ((a*2)+(b*2)==ausgabe){
			System.out.println (ausgabe);
			
		}
		
	}
}
```

Was ist wieder falsch daran ?


----------



## XHelp (15. Dez 2010)

wie viel ist 
	
	
	
	





```
9²
```
 ? und wie viel ist 
	
	
	
	





```
9*2
```
?


----------



## deni100 (15. Dez 2010)

XHelp hat gesagt.:


> wie viel ist
> 
> 
> 
> ...



Stimmt , man bin ich heute verwirrt


----------



## deni100 (15. Dez 2010)

deni100 hat gesagt.:


> Stimmt , man bin ich heute verwirrt



Trotzdem funzt mein Code nicht, was mache ich falsch :bahnhof:

Sorry für die Doppelposts, passiert nicht mehr


----------



## XHelp (15. Dez 2010)

Du hast 3 Werte und bei diesen 3 Werten gibt es eine Obergrenze... Trivialste Lösung wäre wohl:

```
for (int a = 1;a<grenzeA;a++) {
  for (int b = 1;b<grenzeB;b++) {
    for (int c = 1;c<grenzeC;c++) {
```


----------



## deni100 (15. Dez 2010)

XHelp hat gesagt.:


> Du hast 3 Werte und bei diesen 3 Werten gibt es eine Obergrenze... Trivialste Lösung wäre wohl:
> 
> ```
> for (int a = 1;a<grenzeA;a++) {
> ...





Ja ,aber die müssen nicht parallel sondern, erst muss c bis 10 , danach wieder auf 0 und b auf 1 und b auf 10 dann wird a 1 und b wieder 0 usw...


----------



## XHelp (15. Dez 2010)

deni100 hat gesagt.:


> erst muss c bis 10 , danach wieder auf 0 und b auf 1 und b auf 10 dann wird a 1 und b wieder 0 usw...



Ja, genau so wie es da steht.


----------



## deni100 (15. Dez 2010)

XHelp hat gesagt.:


> Ja, genau so wie es da steht.



ist for (int b = 1;b<grenzeB;b++) {
dann in der Zählerschleife von b oder kommt sie nach a ?:shock:


----------



## XHelp (15. Dez 2010)

Übrigens: ein Dreick mit Seitenlänge 0 ist ein wenig sinnbefreit.
Es sind 3 verschachtelte Schleifen. Mach doch in der Mitte ein Sysout, wo du a,b und c ausgibst, dann wird es dir vllt klarer.


----------



## deni100 (15. Dez 2010)

XHelp hat gesagt.:


> Übrigens: ein Dreick mit Seitenlänge 0 ist ein wenig sinnbefreit.
> Es sind 3 verschachtelte Schleifen. Mach doch in der Mitte ein Sysout, wo du a,b und c ausgibst, dann wird es dir vllt klarer.



Versuch ich morgen weiter zumachen, danke . Ich glaube ich bin zu müde (deswegen, sehe ich manche Dinge gar net mehr).


----------



## Tain (16. Dez 2010)

habe ich es übersehen oder kam bisher nicht Math.pow vor die man fürs potenzieren benötigt

musst einfach nur Math.Pow(BasisA,Hoch) + Math.Pow(BasisB,Hoch) == Math.Pow(BasisC,Hoch) abfragen


----------



## bone2 (16. Dez 2010)

deni100 hat gesagt.:


> ```
> ausgabe = (int) Math.pow(c, 2);
> ```
> 
> Was ist wieder falsch daran ?



du kansnt keine formeln in einer variable speicher. das wird genau in dem moment ausgerechnet und ausgabe ist damit 0;


----------



## henpara (16. Dez 2010)

leider bischen offtopic, aber:


> Übrigens: ein Dreick mit Seitenlänge 0 ist ein wenig sinnbefreit.



wenn es nur darum geht Lösungen zur Gleichung a^2+b^2=c^2 zu finden geht die 0 als Wert schon klar, ist zwar trotzdem recht sinnbefreit, aber sicherlich eine Lösung, man könnte sie allgemein als "triviale Lösung" extra betrachten 

OT:
die while schleife wird, wie bone2 auch schon angemerkt hat garnicht benutzt, da 0+0 immer = 0 ist.


----------



## mariusbopp (16. Dez 2010)

bone2 hat gesagt.:


> du kansnt keine formeln in einer variable speicher. das wird genau in dem moment ausgerechnet und ausgabe ist damit 0;



ich hätte es aber auch mit math.pow gemacht... wo ist da das problem? wenn doch 2 ein variabler wert zugewiesen ist kommt doch dann nicht 0 raus... seidenn c=0...
oder irre ich mich jetzt


----------



## henpara (16. Dez 2010)

```
int a;
        int b;
        int c;
        int d;
        int ausgabe ;
        a= 0;
        b =0;
        c =0;
        d = 0;
        ausgabe = (int) Math.pow(c, 2);
```
Das ist aus seinem letzten längeren Codeschnipsel.
ich sehe da:
a=b=c=d=ausgabe(0^2)=0
und somit auch a^2+b^2=ausgabe^2. (0+0=0)

siehe hier

```
while ((a*2)+(b*2)!=ausgabe){
```


----------



## mariusbopp (16. Dez 2010)

oO ich steh grade auf dem schlauch

du hast doch nicht nur (int) Math.pow(c, 2) sondern auch (int) Math.pow(a, 2) (int) Math.pow(b, 2)

was auch jeweils nicht 0 wäre oder 

wenn man die werte dann jeweils in ne var schreibt und die dann addiert kommt doch dann auch nicht 0 raus

du hast ja dann eig ausg=(int) Math.pow(a, 2)+(int) Math.pow(b, 2)  und ausg==c wenn es dann so ist


----------



## bone2 (16. Dez 2010)

das letzte was Deni100 geschrieben hat ist logisch völlig sinnbefreit und löst in keinster weise die aufgabe, die lösung wurde ja schon gegeben, mit drei zählschleifen ineinander. schauen wie hoch die zahlen maximal werden sollen und in der mitte ein

```
if (Math.pow(a,2)+Math.pow(b,2) == Math.pow(c,2) {
    system.out.print("tripel " + a + b + c)
}
```


----------



## mariusbopp (16. Dez 2010)

ja genau so seh ich das nämlich auch...deswegen verstehe ich das von "henpara" nicht so...???:L
edit habe die ganze zeit meinem stat seinen gelesen dann macht es natürlich sinn!!!

sorry


----------



## deni100 (19. Dez 2010)

```
package satz;
import grundgeruest.*;
public class haupt {

	public void Eingabe() {
		int grenzeA=20;
		int grenzeB=20;
		int grenzeC=20;		
		int a =1;
		int b =1;
		int c =1;		
		for ( a = 1;a<grenzeA;a++) {					
			
			for ( b = 1;b<grenzeB;b++) {					
				
				for ( c = 1 ;c<grenzeC;c++){
																									
				}				
				
				}				
			
			if ((a*a)+(b*b)==(c*c))
				System.out.println  ("Diese Zahlen sind ein Triple: "+a+"² + "+b+"² = "+c+"²");
					
				       
						
			}
				
	}//Eingabe
		
}//Class
```

Wo ist denn der Fehler ?


----------



## Landei (19. Dez 2010)

bone2 hat gesagt.:


> das letzte was Deni100 geschrieben hat ist logisch völlig sinnbefreit und löst in keinster weise die aufgabe, die lösung wurde ja schon gegeben, mit drei zählschleifen ineinander. schauen wie hoch die zahlen maximal werden sollen und in der mitte ein
> 
> ```
> if (Math.pow(a,2)+Math.pow(b,2) == Math.pow(c,2) {
> ...



Und auch das ist ein fehlerhaftes Idiom, auch wenn es in diesem Fall (für kleine Werte) funktionieren wird. Ein Test wie [c]Math.pow(0.3, 2) == 0.09[/c] geht nämlich in die Hose. Fließkomma-Zahlen sollten nie direkt mit == verglichen werden, sondern man sollte sich immer gegen kleine (auf der Ungenauigkeit der binären Darstellung beruhende) Abweichungen absichern, z.B. mit [c]Math.abs(a-b) < epsilon[/c] wobei epsilon eine kleine positive Zahl wie 0.0000001 ist.

Bei ints treten solche Probleme nicht auf, also ist der Vergleich [c]a*a + b*b == c*c [/c] der Math.pow()-Variante hier eindeutig überlegen (übrigens auch bezüglich der Performance).


----------



## deni100 (19. Dez 2010)

```
package satz;
import grundgeruest.*;
public class haupt {

	public void Eingabe() {
		int grenzeA=20;
		int grenzeB=20;
		int grenzeC=20;		
		int a =1;
		int b =1;
		int c =1;
		int zaehler=1;
		
		for ( a = 1;a<grenzeA;a++) {			
			
			if ((a*a)+(b*b)==(c*c))
				System.out.println  ("Diese Zahlen sind ein Triple: "+a+"² + "+b+"² = "+c+"²");
				zaehler++;
			for ( b = 1;b<grenzeB;b++) {			
				
				if ((a*a)+(b*b)==(c*c))
					System.out.println  ("Diese Zahlen sind ein Triple: "+a+"² + "+b+"² = "+c+"²");
					zaehler++;
				
				for ( c = 1 ;c<grenzeC;c++){
					if ((a*a)+(b*b)==(c*c))
						System.out.println  ("Diese Zahlen sind ein Triple: "+a+"² + "+b+"² = "+c+"²");
						zaehler++;												
					
				}	//For C			
				
			}//For B
			
			      
			
		}//For A		
			System.out.println ("Das waren die Zahlentriple");
			
			
		
			
			
	}//Eingabe
	
	
	
}//Class
```

Habs nun endlich herausgefunden .


----------



## Landei (19. Dez 2010)

Das zählt definitiv falsch, so wäre es richtig:

```
package satz;
import grundgeruest.*;
public class haupt {
 
    public void Eingabe() {
        int grenzeA=20;
        int grenzeB=20;
        int grenzeC=20;     
        int zaehler=1;
        for (int a = 1; a<grenzeA; a++) {            
            for (int b = 1;b<grenzeB;b++) {            
                for (int c = 1 ;c<grenzeC;c++){
                    if ((a*a)+(b*b)==(c*c))
                        System.out.println  ("Diese Zahlen sind ein Triple: "+a+"² + "+b+"² = "+c+"²");
                        zaehler++;                                              
                }
            }
        }
        System.out.println ("Das waren die Zahlentriple");
    }
}
```


----------



## deni100 (19. Dez 2010)

Landei hat gesagt.:


> Das zählt definitiv falsch, so wäre es richtig:
> 
> ```
> package satz;
> ...



Achso okey muss also das nur einmal in der letzten Schleife schreiben


----------

