# Schleifen  in Java



## abina (13. Dez 2006)

Hi 

irgendwie habe ich nicht , dass was ich will mit meiner Schleife. 
Mein Programm gibt 2 Werte int p und int q aus. (angenommen p=700 q =500 ) 

In der If Schleife soll er 3 Sachen überprüfen. 

wenn p > q (200) dann soll er Motor.A (+1) 


wenn q < p (-200) dann soll er Motor.C (+1) 


wenn p<q - 15 || q < p < 15 dann stop Motor 



dafür mein Porgramm 


```
while (d != 1) { 
            
            if (p < q) { 
              

            } else if(q < p) { 
                        } 
             if (p - q < 15 || q < p) { 
             
                
            } 

         }
```


Er geht in 2 if else , aber nicht in den 3. 


WIe kann ich 3 Überprüfungen machen in einer While Schleife[/code]


----------



## SlaterB (14. Dez 2006)

dein Problem ist immer noch katastrophal beschrieben,

probiere es selber aus:


```
int p = 700;
int q = 500;
if (p - q < 15 || q < p) {
     System.out.println("drin");          
}
```
wird funktionieren, auf jedem Computer der Welt,
also muss bei dir was anderes los sein,

----

wie schon x mal gesagt gehört vor das if eine Ausgabe:
System.out.println("vor if, p: "+p+", q: "+q);

ich weiß nicht warum du die wieder rausgenommen hast,
ohne solche Ausgaben kommst du nicht weiter

(edit: ok, ist ja doch nicht irgendwie drin, aber dann fehtl eben eine Ausgabe "bin im 3. if drin",
oder eine Ausgabe direkt vor dem dritten if :bae: )

------

wenn du "p<q - 15 || q < p < 15" ausdrücken willst, dann ist das übrigens


```
if (p - q < 15 || (q < p && p <15)) {
     System.out.println("drin");          
}
```

wieder was ganz anderes........


----------



## DaKo (14. Dez 2006)

> In der If Schleife ...



http://www.if-schleife.de/


----------



## Azrahel (14. Dez 2006)

DaKo hat gesagt.:
			
		

> > In der If Schleife ...
> 
> 
> 
> http://www.if-schleife.de/


   :toll:


----------



## Jango (14. Dez 2006)

DaKo hat gesagt.:
			
		

> > In der If Schleife ...
> 
> 
> 
> http://www.if-schleife.de/



Da brauch man sich nicht wundern, wenn keine anständigen Domains mehr zu kriegen sind!! :bloed:


----------



## SnooP (14. Dez 2006)

wieso... wolltest du unbedingt die domain: if-schleife haben?


----------



## abina (14. Dez 2006)

mmm  ich möchte von 2 Zahlen von 1-7 alle Variation in einer  if Frage abfragen lassen.

Zum Beispiel beim ersten Durchláuf   a= 1 ,  b =1,  beim 2 Durchlauf  a=1 , b = 2  usw.

Wo nach muss ich suchen oder wie kann ich sowas machen.   Könnt ihr mir ein Tipp geben wie ich vorgehen muss.

vielen Dank für eure nette Unterschützung


----------



## SlaterB (15. Dez 2006)

Grundlagen zu if stehen in jedem Lehrbuch zu "Grundlagen" oder "Kontrollstrukturen",
aber viel verstehen gibts da ja nicht, wie das grundsätzlich geht müsstet du ja wissen wenn der Code von dir ist,

-------

deine neue Problembeschreibung ist ja mal was ganz neues, 
eine Kombinatorik-Aufgabe, sehr kompliziert wenn man davon nix versteht,
hat mit if übrigens zunächst mal GAR NIX zu tun,

Tipp: arbeite da mit for-Schleifen,
mach dir erstmal eine Schleife die die Zahlen 1-7 einzeln ausgibt


----------



## abina (15. Dez 2006)

diese kleine Code ist schon von mir, ihr hättet bestimmt gut geschrieben.

egal ich muss ja lernen. 

Ok mit If Frage geht es auch jetzt. Nur damit ist meine Aufgabe noch nicht fertig. Es war ja auch nur der Anfang.

So ich muss alle Kombination von der Zahl 1 bis 7 ausgeben, .

Ich habe gegoogelt und das was passende war ARRAY. ich wollte euch fragen, bevor tausend Jahre rumzuprobieren.


Ok ich probiere mit for Schleife.

Eine Frage!!!!!  for(int a; a<=7, a++) &&(for int c; c<=7; c++)

Aber bekommte ich alle Kombination???


----------



## SlaterB (15. Dez 2006)

for(int a; a<=7, a++) &&(for int c; c<=7; c++) 
geht nicht, Schleifen haben mit && nix zu tun


```
for(int a; a<=7, a++) {
  for int c; c<=7; c++)  {
  }
}
```
wäre nicht schlecht, so in der Art musst du zwei Schleifen kombinieren,
gib doch mal so wie es da steht alle Kombinationen von a und c aus


----------



## BrainException (16. Dez 2006)

SlaterB hat gesagt.:
			
		

> for(int a; a<=7, a++) &&(for int c; c<=7; c++)
> geht nicht, Schleifen haben mit && nix zu tun
> 
> 
> ...



		for(int a = 0; a<=7; a++) { 
			  for (int c = 0; c<=7; c++)  { 
			  } 
			} 

Und so kompiliert's sogar noch. ;-)


----------



## BrainException (16. Dez 2006)

Ach ja, so wird die 0 auch  mitausgegeben, bei Bedarf die Variabeln auf 1 initialisieren.


----------



## abina (17. Dez 2006)

super vielen Dank

ihr seid schon eine Hilfe , danke noch mal 

jetzt kann ich alles Kombination ausgeben

jetzt versuche ich folgendes


```
int d =3;
     while(d==1){   
        for(int a = 1; a <=7; a++) {
            for (int c= 1; c<=7; c++)  {
                System.out.println("a="+a+ "c="+c );
               
             if (a==c){
                   System.out.println("Diese sind gleich");
                     d=1;
                  
             }
                
                
            }
        }
```

aber er bricht nicht die while Schleife ab;


----------



## SlaterB (18. Dez 2006)

warum sollte 'er'?

und wieso startet die Schleife überhaupt,
wenn d vorher 3 ist, dann sollte die Schleife gar nicht anlaufen


----------



## hupfdule (18. Dez 2006)

Die while-Schleife könnte er nicht innerhalb der for-Schleifen abbrechen, denn die while-Schleife kommt erst wieder zum Zug, wenn die for-Schleifen vollständig abgearbeitet sind. Was du suchst, geht mit einem break:


```
int d = 3;
     suche:
     while(d==1){    
        for(int a = 1; a <=7; a++) { 
            for (int c= 1; c<=7; c++)  { 
                System.out.println("a="+a+ "c="+c ); 
                
             if (a==c){ 
                   System.out.println("Diese sind gleich"); 
                   break suche;                  
             } 
                
                
            } 
        }
```

Aber, wie slaterB schon geschrieben hat, sehe ich auch keinen Sinn in der while-Schleife.


----------



## abina (18. Dez 2006)

break habe ich getestet , ist gut .

Aber ich möchte etwas anderes ausprobieren, geht nicht!!!

in der erste if geht er nicht rein, ob wohl es zutrifft



```
for (int a = 1; a <= 7; a++) {
			for (int c = 1; c <= 7; c++) {

				
				int rechts = 470;
				int links  = 475;

				if (rechts - links < 15 && rechts - links > -15
						|| links - rechts < 15 && links - rechts > -15) 

					

				 if (links < rechts) 
					
					
				if (rechts < links) 
					
					

				
			

		}
	}
```

bitte


----------



## SlaterB (18. Dez 2006)

abscheulicher Code, ich muss mal wieder bildlich reden 

wie um alles in der Welt kann man if ohne Schleifen bauen?
bitte in welchem Buch oder Anleitung steht das?

es gibt nur ein if:

```
if (bedingung) {
   code;
}
```

alles andere wie 

```
if (bedingung)
   code;
```
verdient eigentlich Strafe,

solche vertrackten Bugs wie bei dir sind dann immerhin sowas ähnliches..



```
a && b  || c && d
```
ist fast noch schlimmer, aber nur fast, 
schreibe

```
(a && b)  || (c && d)
```
oder

```
a && (b  || c) && d
```
alles andere ist ein Skandal, wo lernt man sowas?


-------------

```
if (rechts - links < 15 && rechts - links > -15
                  || links - rechts < 15 && links - rechts > -15)
```

4x fast das gleiche auszurechnen macht übrigens praktisch nie Sinn,
da sollte sofort die innere Alarmglocke klingeln,

verwende besser


```
int abstand = rechts - links;
if (Math.abs(abstand) < 15)
```
bzw. wenn das unbekannt oder nicht gewünscht dann

```
int abstand = rechts - links;
if ((abstand < 15) &&(abstand > -15) )
```


----------



## abina (19. Dez 2006)

Ok schon verständlich , aber ich mache so, denn es ist ja auch richtig.

innerhalb der 2.for schleife , habe ich eine if Frage, aber diese wird nicht ausgeführt.

in der if abfrage , sage ich  wenn es zutriff, soll er den ganze for schleife(also beides) abbrechen.

bin ich hier richtig mit meiner Gedanke??????

 


```
for (int a = 1; a <= 7; a++) {
			for (int c = 1; c <= 7; c++) {

				
				int p_rechts =390;
				int q_links = 380;
				
				// Hier geht er nicht durch
				
				
				if ((p_rechts - q_links) < 15 || (p_rechts - q_links) < -15) {

					break;

				}
				//bis hier 
				else if (q_links < p_rechts) {
					

					
				} else if (p_rechts < q_links)
					
				

			}
			
			}
		}
```


----------



## hupfdule (19. Dez 2006)

Du brichst nur die innere Schleife ab. Um beide abzubrechen, musst du ein Label verwenden, so wie in meinem Beispiel zuvor (Label hieß dort "suche").


----------



## abina (20. Dez 2006)

Mein Problem ist ja, dass er nicht mal den inner For Schleife abbricht, 

wenn es zutrifft.

Um genauer zu sagen alle beide else , falls zutrifft, wird gemacht. Nur der erste If Abfrage , obwohl es zutrifft wird nicht gemacht.

WARUM???????
Ich bekomme keine Fehlermeldung aber es tut sich nicht .


Kannst du mir bitte  sagen warum???


----------



## hupfdule (20. Dez 2006)

Dann trifft die Bedingung halt nicht zu. Mach doch noch ein paar Ausgaben for die if-Anweisung:


```
System.out.println("p_rechts: "+p_rechts);
System.out.println("q_links: "+q_links);
System.out.println("p_rechts - q_links < 15: "+(p_rechts - q_links) < 15);
// etc...
```

Dabei sollte dir auch schon die Unsinnigkeit deiner if-Anweisung auffallen. Wenn p_rechts - q_links kleiner als -15 ist, dann ist es _immer_ auch kleiner als 15.

Und mit der Einstellung 





> aber ich mache so, denn es ist ja auch richtig.


 kommst du nicht weit. Unsinnige Bedingungen erschweren das Lesen des Quellcodes und damit die Fehlersuche.


----------



## abina (20. Dez 2006)

Das ist falsch sagst du? :?: 










```
p = 390
q = 380

p-q=10;
p-q=-10;

if (10 < 15 || 10 > -15) { 

               break; 

            }
```

10 ist kleiner 15, also muss er doch abbrechen!!

Habe ich immer noch nicht verständlich ausgedruckt?? :cry:


----------



## hupfdule (20. Dez 2006)

abina hat gesagt.:
			
		

> Das ist falsch sagst du? :?:


Ich sage nicht, dass es falsch ist, ich sage, dass die Bedingung Unsinn ist, weil nur einer der Vergleiche relevant ist. In deinem letzten Post hingegen kehrst du eine der Bedingungen um. Damit hat es natürlich wieder eine andere Bedeutung.


```
p = 390
q = 380

p-q=10;
p-q=-10;

if (10 < 15 || 10 > -15) { 
     break; 
}
```

Sind das die Ausgaben aus dem Quellcode?
Hast du wirklich alles verfolgt, was zu welchem Zeitpunkt in den variablen stehen und wann deine Bedingung true bzw. false ist?

Du musst unbedingt mehr mit Debug-Ausgaben arbeiten. Vor den Stellen, an denen ein Fehler auftritt alle relevanten Variablen und Vergleiche ausgeben. Dann siehst du, an welcher Stelle der von dir gewünschte Fall nicht eintritt und warum.
Wenn du in einer IDE mit Debugger arbeitest, kannst du auch diesen verwenden. Das ist insbesondere in Schleifen praktischer, da man sich damit Stück für Stück vorarbeiten kann.


----------



## abina (20. Dez 2006)

îch würde gerne mit debugger arbeite, wenn ich wüsste wie??

die p und q variabeln ändenrn sich jedes Mal, wenn sie in for schleife sind.

und sobald der differenz nicht groß sind, kann Programm gestoppt werden.


Kannst du mir genauer sagen, was du mit Label meinst??? Vielen dank


----------



## SlaterB (20. Dez 2006)

Debugger kann durch gute System.out.println ersetzt werden 
oder schreibe die Meldungen in eine Datei wenn du immer nur eine anzeigen kannst,

ein Log von 100 Zeilen zeigt dir viel besser was wann passiert ist


Label:
letztes Post auf Seite 1, definiert mit

suche:

bei break wird dann anscheinend dahin gesprungen,
ist aber aus bestimmter Sicht nicht zu empfehlen,

wenn überhaupt, dann verwende break lieber normal:
bei einem break wird eine Schleife abgebrochen,
in einer Doppelschleife dann eben 2x break,

```
for {
   for {
       break;
   }
   if (ende) {
     break;
   }
}
```


----------



## abina (20. Dez 2006)

super , mit dem Label funktioniert jetzt. 
ABER IMMER das selbe POrblem.   Egal welche WERT er hat , er bricht die for schleife. das soll er nicht.

WAS IST JETZT schon wieder????????????????


```
fit:
for (int a = 1; a <= 7; a++) { 
         for (int c = 1; c <= 7; c++) { 

             
            int i=390; 
            int k= 380; 
             
         
             
             
            if ((i- k) < 15 || k- i) < -15) { 

               break fit; 

            } 
       
            else if (k< i) { 
                

                
            } else if (i< k) 
                
             

         } 
          
         } 
      }
```

das ist meiner code


----------



## SlaterB (20. Dez 2006)

man könnte meinen, das nach dem Sprung zu fit die Schleife wieder begonnen wird,
aber scheint wirklich zu klappen,

deine andere Frage ist wie immer sehr seltsam..
warum wird break ausgeführt?
na weil die Bedingung des ersten if zutrifft?!


----------



## abina (23. Dez 2006)

vielen Dank , endlich klappt es, aber ich .

WIe kann ich den bestimmte Zahlen speichern? 

Angenommen ich möchte von der for schleife ( a= 1. c= 3) speichern, und zum schluß diesen Wert ausgeben.

Ich habe gehört , ist möglich mit Array. habe damit beschäftigt, nur specihern keine ahnung.

könnt ihr mir tipps geben?? Bitte 
oder an einem Beipiel (kleines, die ich verstehe)

danke


----------



## SlaterB (25. Dez 2006)

Variablen vorher deklarieren

dann ich der Schleife in jedem Durchlauf alle Variablen speichern
oder per Abfrage den richtigen Moment abwarten (if a== 1 && ..  speichere ..)

welche Variablen du brauchst hängt davon ab was du wieoft speichern willst,

wenn es nur eine Zahl ist, dann reicht auch eine Variable,
wenn du für 20x10 Durchläufe je zwei Variablen speichern willst,
dann vielleicht zwei 200er-Arrays,
bei unbekannter Menge an Werten hilft ArrayList, da passen beliebig viele rein

genaueres kann man wieder nur bei genaueren Infos sagen,
allgemein:

```
double x = 0;
double[] xy = new double[anzahl];
// Schleife mit Speichern
```


----------



## abina (29. Dez 2006)

ich habe eine Frage, darf man so machen???


```
int[] Note()
   {

   int[] n = new int[6];


    n[0] = sehrgut1;
    n1] =  gut2;
    n[2] =  befriedigend3;
    n[2] =  ausreichend4;
    n[2] =  mangelhaft5;
    n[2] =  durchgefallen6;



   return r;
   }
```

und  

kann ich  in einer if Abfrage eins von den n aufrufen
z.b


```
int punkte = 600;

if (punkte > 500){

System.out.println("Ihre Note ist : ");
return n1;

}
```

ist es möglich?????

danke


----------



## Eldar (30. Dez 2006)

Also erstmal solltest du das mit dem break wieder vergessen. Wenn man gezwungen ist break zu verwenden, sollte man schaun, dass man seine Schleifenbedingungen überdenkt.


----------



## SlaterB (31. Dez 2006)

ist möglich, ein Array zu benutzen ist ja der Sinn von Arrays 

dein Code ist aber nicht wirklich in irgendeiner Hinsicht eindeutig oder korrekt,
wenn du daran gerade arbeitest: Problem/ Aufgabe/ geswünschtes Vorgehen mit deutscher Sprache beschreiben


----------

