# Wann for und wann while??



## Tombery (30. Okt 2009)

Hallo,

1.Frage:

wann benutzt man eigentlich eine while-schleife und wann eine for-schleife?


2. Frage:

wir müssen in einer aufgabe nun von einer gegebenen zahl, alle int-Zahlen (von 1 bis 9999) ausgeben lassen, deren summe die gegebene zahl ergibt. (Quersumme)

aber....es funktioniert einfach nicht, obwohl die formeln alle richtig sein müssten!


```
public class Quersumme {
public static void main (String[]args){
//die eingegebene Zahl wird in der Kommandozeile eingelesen
int zahl = Integer.parseInt(args[0]);
//wenn die eingegebene Zahl zwischen 1 und 36 ist
if((zahl>0)&&(zahl<=36)){
int eineStelle;
int zweiStellen;
int dreiStellen;
int vierStellen;
int summe;
for (int i = 1; i <= 9999; i++){
eineStelle = (zahl%10);
zweiStellen = ((zahl/10)+(zahl%10));
dreiStellen = ((zahl/100)+(zahl/10%10)+(zahl%10));
vierStellen = ((zahl/1000)+(zahl/100%10)+(zahl/10%10)+(zahl%10));
summe = eineStelle + zweiStellen + dreiStellen + vierStellen;
if(summe == zahl){
System.out.println(summe);
}
}
}
}
}
```

Freue mich auf Antworten :toll:


----------



## Leroy42 (30. Okt 2009)

Und was funktioniert nicht?

Was erwartest du denn für welchen Eingabewert von zahl?


----------



## Tombery (30. Okt 2009)

also...z.B. wenn ich 36 eingebe, müsste herauskommen:

9999

(weil ja 9+9+9+9 = 36)

oder für 10:

4420, 2440, 0244, 0442, 4402, 2224, 4222, 2422, 2242, 3340 usw.

als ausgabe kommen die zahlen, die als Quersumme, die eingebene zahl haben.

aber bisher kommt einfach NICHTS raus....


----------



## pixelbug (30. Okt 2009)

zuerst einmal ist es zu empfehlen den Code einzurücken. 

Das nichts ausgegeben wird liegt daran, das wenn die Zahl im Bereich zwischen ]0 und 36] liegt, du vergleichst ob zahl == summe, und weil das nie erfüllt ist wird auch nix ausgeben


----------



## Tombery (30. Okt 2009)

was? aber wieso?

das programm berechnet ja VORHER die summe...und wenn die summe mit der eingegebenen zahl übereinstimmt (summe entspricht zahl, summe == zahl), dann soll diese summe ausgegeben werden....


----------



## Schandro (30. Okt 2009)

deine Berechnung der Quersumme stimmt nicht (da u.a. immer mindestens 4 rauskommt) UND du berechnest die Quersumme von zahl statt von i


----------



## Tombery (30. Okt 2009)

hm....aber wenn man nicht (summe == zahl) machen darf...wie kann man dann zeigen, dass die summe aber der zahl entsprechen muss?

sonst..kann er ja jede summe von jeder zahl ausgeben...


----------



## max40 (30. Okt 2009)

das mit 
	
	
	
	





```
summe == zahl
```
war schon richtig!
Aber deine Stellenberechnung ist falsch!
was sollen diese ganze additionen?
Benutzt du Eclipse oder ähnliches? Wenn ja, dann debuge es, dann siehst du gleich was falsch läuft!
Ich gehe davon aus das du dies zum lernen von Java machst, ansonsten sag bescheit und ich kann dir den fertigen Code geben!


----------



## Tombery (30. Okt 2009)

nein ich benutze keine entwicklungsumgebung, wobei ich mich iwann mal in netbeans bzw. eclipse einarbeiten wollte. 

die stellenberechnung ist falsch?
*überleg*...
ich...brauche die summe garnicht....weil ich ja schon alles addiert habe....dann....brauche ich eigentlich nur das hier, oder:

summe = ((i/1000)+(i/100%10)+(i/10%10)+(i%10));


----------



## max40 (30. Okt 2009)

jepp, sieht gut aus!
Empfehle dir, falls du den aufbau einer java-source verstanden hast, dich demnächst mit eclipse, netbeans oder anderen Werkzeugen zu beschäftigen!
Und wenn du dann auch noch das debug-Werkzeug einsetzt wirst du besser vorankommen und hättest vor 2 Stunden schon die Lösung gehabt!


----------



## Tombery (30. Okt 2009)

hm...es kommen immernoch falsche ergebnisse raus...


----------



## max40 (30. Okt 2009)

was gibst du ein und was kommt raus?


----------



## Murray (30. Okt 2009)

Erklär doch mal bitte deine Quersummenformel in Zeile 10


----------



## Tombery (30. Okt 2009)

bei 1:

1
1
1
1

bei 22:

22
22
22
22
22
22
22
22
usw.

bei 36:

36

???:L


----------



## Tombery (30. Okt 2009)

summe = ((i/1000)+(i/100%10)+(i/10%10)+(i%10))??

summe = 1.stelle + 2.stelle + 3.stelle + 4.stelle 

also mit stellen meine ich die zahlenstellen.

bei 333 also 0 + 3 + 3 + 3

und man soll ja die quersummen errechnen und mit der eingebenen zahl vergleichen


----------



## max40 (30. Okt 2009)

Visuell hat gesagt.:


> bei 1:
> 
> 1
> 1
> ...



Ja ist doch richtig! du gibst ja auch immer nur die Summe aus!



```
if ((zahl > 0) && (zahl <= 36)) {
	int eineStelle;
	int zweiStellen;
	int dreiStellen;
	int vierStellen;
	int summe;
	for (int i = 1; i <= 9999; i++) {
		eineStelle = (i % 10);
		zweiStellen = ((i / 10) % 10);
		dreiStellen = ((i / 100) % 10);
		vierStellen = i / 1000;
		summe =  vierStellen + dreiStellen + zweiStellen +  eineStelle;
		if (summe == zahl) {
			// sollte noch auf StringBuilder oder so umgestellt werden!
			System.out.println(summe + " > " + vierStellen + dreiStellen + zweiStellen + eineStelle);		
        }
	}
}
// ansonsten ist die Zahl ungültig
else {
	System.out.println("Zahl ungültig");
}
```


----------



## H26 (31. Okt 2009)

For-schleifen nur benutzen, wenn du genau weisst, wie oft du die Iteration ausführen möchtest..ansonsen while benutzen..


----------



## Tombery (31. Okt 2009)

habs jetzt richtig ^^

wir müssen ein programm für die Berechnung eines Schnittpunkts zweier Geraden, die jeweils durch 2 Punkte definiert werden, programmieren, doch der compiler zeigt mir immer wieder auf den "y_Schnittpunkt" aber ich weiß nicht was da falsch ist?


----------



## max40 (31. Okt 2009)

in Zeile 32 fehlt ein 
	
	
	
	





```
;
```


----------



## Tombery (31. Okt 2009)

ah danke! wieder blöder leichtigkeitsfehler 

aber die 3.aufgabe ist echt schwer....
da soll man so einen teppich ausgeben......der aus lauter quadraten besteht....
bestimmt braucht man schleifen...


----------



## max40 (31. Okt 2009)

Visuell hat gesagt.:


> ah danke! wieder blöder leichtigkeitsfehler



Wie schon gestern gesagt, ich würde mich mit eclipse oder netbeans beschäftigen! Der hätte dir die Zeile sofort angemeckert!


----------



## hdi (31. Okt 2009)

> da soll man so einen teppich ausgeben


Du meinst wohl Tepich


----------



## Tombery (31. Okt 2009)

leider nicht 

unser "tepich" ist viiieeeel komplizierter...

der besteht iwie aus ne vielzahl von quadraten, die jeweils so ein rautenmuster haben. 
das blöde ist, dass da auf dem zettel nichtmal ein einziger ansatz steht...

ich verstehe halt nicht, wie man mit JAVA ein muster ausgeben kann..der auf der zeile und als spalte sich sozusagen vervielfacht. 

wie z.B.:

QUADRAT,QUADRAT,QUADRAT
QUADRAT,QUADRAT,QUADRAT
QUADRAT,QUADRAT,QUADRAT

ich denke mal..dass man erstmal einen Quadrat durch system.out.println´s definiert....und dieses...muss dann iwie durch ne schleife so oft wiederholt werden wie es halt mit der zahl in der kommandozeile angegeben wurde...


----------



## hdi (31. Okt 2009)

Ja, man muss sich das halt überlegen. Die Lösung ist eine Kombination aus
1) System.out.print()
2) System.out.println()
3) Schleife(n)
4) Hilfsvariablen, um herauszufinden ob du zB grad die obere Kante von einem Quadrat ausgeben musst, oder eine Seite usw.


----------



## Tombery (31. Okt 2009)

also...ich habe es schonmal geschafft, die zeilen von dem Teppich zu erzeugen. 


```
public class Teppich {
   public static void main (String[]args){
   int anzahl_kreuze = Integer.parseInt(args[0]);
   int anzahl_quadrate = Integer.parseInt(args[1]);
   for(int i = 1; i <= anzahl_quadrate; i++){
   //Zeilen
   System.out.println(". . . . . . .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   }
}
}
```

aber ich verstehe nicht, wie ich die Spalten hinbekomme...also sodass diese genau nebeneinander wiederholt werden, sodass nachher ein großes Quadrat entsteht...

ich habs versucht drunter nochmal dasselbe nur mit print´s hinzukopieren, aber da kommt nur chaos raus. und wenn ich es direkt daneben kopiere, gehen die quadrate ineinander.


----------



## Landei (31. Okt 2009)

Ich würde enfach ein char[][] Array in der Größe des Teppichs machen, dahinein alles fertig "malen", und erst ganz am Ende ausgeben. String zu char[] geht mit "meinString".toCharArray(); char[] zu String mit new String(myArray);


----------



## Tombery (31. Okt 2009)

wir haben leider noch keine "char" "arrays" usw. gemacht :bahnhof:

nur if-anweisungen und schleifen.


----------



## Landei (31. Okt 2009)

Na mit dem args-Array wurstelst du doch schon fleißig rum


----------



## Tombery (31. Okt 2009)

ja  aber nicht mit arrays an sich, wo man das gezielt anwendet. 
wir machen das bisher nur mit diesen eingaben von der kommandozeile, sonst nicht.


----------



## Tombery (1. Nov 2009)

die spalten funktionieren nicht <.<


```
public class Teppich {
   public static void main (String[]args){
   int anzahl_kreuze = Integer.parseInt(args[0]);
   int anzahl_quadrate = Integer.parseInt(args[1]);
   for(int i = 1; i <= anzahl_quadrate; i++){
   //Zeilen
   System.out.println(". . . . . . .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   }
   //Spalten
   for(int j = 1; j <= anzahl_quadrate; j++){
   System.out.print(". . . . . . .");
   System.out.print(".           .");
   System.out.print(".           .");
   System.out.print(".           .");
   System.out.print(".           .");
   System.out.print(".           .");
   }
}
}
```


----------



## Landei (1. Nov 2009)

Ungetestet:

```
public class Teppich {
 public static void main (String[]args){
   int anzahlZeilen = 5;
   int anzahlSpalten = 4;

   String[] muster = {". . . . . . .",
        ".           .",
        ".           .",
        ".           .",
        ".           .",
        ".           ."};

   for(int zeilen = 0; zeilen  < anzahlZeilen;zeilen ++){
        for(int m = 0; m < muster.length; m++) {
             for(int spalte = 0; spalte < anzahlSpalten; spalten++) {
                System.out.print(muster[m]);
             }
             System.out.println();
        }
   }
}
}
```


----------



## Tombery (1. Nov 2009)

naja...das ist ja die schwierigkeit, dass man bei der kommandozeile NUR die anzahl der quadrate angeben kann für eine seite...
für 5, also 5 quadrate lengs und 5 quadrate hoch (für ein 5x5 quadrat)

habs mir so überlegt jetzt:


```
public class Teppich {
   public static void main (String[]args){
   int anzahl_kreuze = Integer.parseInt(args[0]);
   int anzahl_quadrate = Integer.parseInt(args[1]);
   if(anzahl_quadrate == 1){
   System.out.println(". . . . . . .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(". . . . . . .");
   }
   else{
   for(int i = 1; i <= anzahl_quadrate; i++){
   System.out.println(". . . . . . . . . . . . .");
   System.out.println(".           .           .");
   System.out.println(".           .           .");
   System.out.println(".           .           .");
   System.out.println(".           .           .");
   System.out.println(".           .           .");
   }
   for(int j = 1; j <= anzahl_quadrate; j++){
   System.out.print(". . . . . . ");
   }
   }
   }
}
```

aber das klappt ja auch nicht, dass ich für jede einzelne zahl ein bild hinmache....also für 2 die zwei quadrate nebeneinander, für 3 einfach 3 quadrate nebeneinander.....für 100 z.B. wird das ja schön mühselig 100 quadrate nebeneinander einzuzeichnen...

und wenn man versucht die seiten EINZELN zu definieren landen die wieder untereinander, statt nebeneinander...


```
public class Teppich {
   public static void main (String[]args){
   int anzahl_kreuze = Integer.parseInt(args[0]);
   int anzahl_quadrate = Integer.parseInt(args[1]);
   for(int i = 1; i <= anzahl_quadrate; i++){
   System.out.println(". . . . . . .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   System.out.println(".           .");
   }
   for(int k = 1; k <= (anzahl_quadrate*6); k++){
   System.out.print("            .");
   System.out.printf("%n");
   }
   for(int j = 1; j <= anzahl_quadrate; j++){
   System.out.print(". . . . . . ");
   }
   }
}
```


----------



## hdi (1. Nov 2009)

Also hier mal meine Lösung, sie ist sicherlich nicht sonderlich schön, aber wenigstens mal etwas das funktioniert. Ohne Arrays o.ä. kommt man halt nicht drumrum die Logik und die Ausgabe in einem zu machen.


```
public class Quadrate {

	public static void main(String[] args) {
		int quadrate = Integer.parseInt(args[0]);
		int kantenLaenge = 6;

		/* Quadrat-Reihen: */
		for (int r = 1; r <= quadrate; r++) {
			/* Die obere Kante der Quadrate in dieser Reihe (Spalten) */
			for (int i = 1; i <= quadrate; i++) {
				for (int k = 1; k <= kantenLaenge; k++) {
					System.out.print(".");
				}
			}
			System.out.println(".");

			/* Die vertikalen Kanten der Quadrate für diese Quadrat-Reihe */
			for (int i = 1; i <= kantenLaenge / 2; i++) {
				for (int j = 1; j <= quadrate; j++) {
					System.out.print(".");
					for (int k = 1; k <= kantenLaenge - 1; k++) {
						System.out.print(" ");
					}
					if (j == quadrate) {
						/*
						 * Die Quadrate in der letzten Spalte sind noch nicht
						 * durch eine rechtsseitige Kante abgeschlossen
						 */
						System.out.print(".");
					}
				}
				System.out.println();
			}
		}
		/* Die letzte Reihe ist unten noch nicht mit einer Kante abgeschlossen */
		for (int i = 1; i <= quadrate; i++) {
			for (int k = 1; k <= kantenLaenge; k++) {
				System.out.print(".");
			}
		}
		System.out.println(".");
	}
}
```


----------



## Landei (2. Nov 2009)

Visuell hat gesagt.:


> naja...das ist ja die schwierigkeit, dass man bei der kommandozeile NUR die anzahl der quadrate angeben kann für eine seite...
> für 5, also 5 quadrate lengs und 5 quadrate hoch (für ein 5x5 quadrat)



Und das bekommst du ehrlich nicht hin? Ersetze einfach in meiner Lösung jedes anzahlZeilen und anzahlSpalten durch anzahlQuadrate, und dann sollte es laufen.


----------



## Tombery (2. Nov 2009)

es läuft, es sind nur die striche doppelt und unten fällt ein strich.
und das andere ist wohl zu klein XD

aber jetzt setzt setzt die aufgabe noch die krone drauf:

in jedem quadrate sind diese kreuze (#) und auch die muss man per kommandozeile anpassen. die anzahl der kreuze muss immer ungerade sein UND sie darf die form des quadrats nicht verändern.

ungefähr so (ein leeres kreuz in der mitte):

. . . . . . . 
.##### .
.##  ## .
.#      # .
.##  ## .
.##### .

einfach unglaublich, was man sich so einfallen lassen kann.


----------



## Unregistriert (2. Nov 2009)

Hast du es schon geschafft kreuze in den Teppich zu bringen?


----------

