# do-while - Sinnvoll?



## Djinndrache (21. Feb 2008)

Hallo,

ich bin zwar in diversen Sprachen schon ein paar Jahre aktiv am schreiben, aber heute haben wir eine Aufgabe bekommen, über die ich schon lange nachdenke, allerdings nie eine wirklich gute Antwort finde.

Gefragt ist nach einem sinnvollen Beispiel für den Gebrauch einer do-while-Schleife.

Das einzige was da einigermaßen in Frage käme (was mir einfällt), wäre das Berechnen einer Fakultät, was allerdings auch mit einer for()-Schleife einfacher wäre..


Wozu also do-while?

Kann ruhig ein komplexeres Beispiel sein, hauptsache es ist wirklich sinnvoll 


Danke im Voraus


----------



## Wildcard (21. Feb 2008)

Eine Schleifenart ist immer ausreichend. Die do-while Schleife ist allerdings komfortabler, wenn du weißt, dass der Code mindestens einmal ausgeführt werden muss.


----------



## maki (21. Feb 2008)

Beispiel habe ich keines,

aber do-while nimmt man immer dann, wenn die Schleife mindestens einmal durchlaufen werden muss.

do-while sieht man im richtigen Leben eher selten, zumindest ime.


----------



## Djinndrache (21. Feb 2008)

Was die Schleife macht, weiß ich auch, nicht nur von Java aus. Allerdings hab ich in all den Jahren nie eine solche Schleife benutzt und brauche jetzt ein Beispiel..

Da bin ich jetzt ratlos 

Am besten ist natürlich ein praktisches Beispiel...


----------



## SlaterB (21. Feb 2008)

wenn testeInput() 10 Sekunden pro Test braucht

dann besser
do {
frage User nach Input
} while (testeInput(input))

statt

input = -1
while (testeInput(input)) {
frage User nach Input
} 
[10 Sekunden unnötig getestet]

oder


input = -1
while (input == -1 or testeInput(input)) {
frage User nach Input
} 
[zusätzliche Abfrage input == -1]

--------

ich würde aber sogar [zusätzliche Abfrage input == -1] wählen,
da die while-Schleife gewohnter ist


----------



## ARadauer (21. Feb 2008)

ich hab in den letzen 2 Jahren ca 40.000 Zeilen Java Code geschrieben und nicht eimal do while verwendet.
(ausser bei studienaufgaben wo es geforder war)


----------



## Djinndrache (21. Feb 2008)

Mh, das mit der unnötigen Performance hört sich ganz gut an, ich denke so in der Art werde ich mir was zusammenschreiben 

Weitere Vorschläge sehe ich natürlich trotzdem gerne, vielleicht kommt ja noch was schönes


----------



## Verjigorm (21. Feb 2008)

Beispiel

"Mensch ärgere dich nicht"-Spiel


int wuerfel;
do {
  wuerfel=(int) (Math.random()*6+1);
} while (wuerfel!=6);

dh. würfele solange, bis eine 6 gefallen ist bzw. andersherum: wiederhole das Würfeln solange, solange das Würfelergebnis nicht 6 ist. 
---> Dabei muss mindestens einmal gewürfelt werden <---



wobei man vermutlich jede do-while in eine while-schleife umformen kann


----------



## SlaterB (21. Feb 2008)

dieses Kurzbeispiel macht sogar mehr Sinn als meins, wo ich nach extralangen 10 Sekunden gesucht habe 

> wobei man vermutlich jede do-while in eine while-schleife umformen kann

das klingt wieder schlechter, bitte 'vermutlich' streichen


----------



## Djinndrache (21. Feb 2008)

Das Beispiel ist echt gut 

Dass man die Schleifen umwandeln kann ist klar, man kann auch jede while() in eine for() umwandeln, wenn man es drauf anlegt


----------



## maki (21. Feb 2008)

> Dass man die Schleifen umwandeln kann ist klar, man kann auch jede while() in eine for() umwandeln, wenn man es drauf anlegt icon_wink.gif


while Schleifen sind entartete for Schleifen


----------



## SlaterB (21. Feb 2008)

Quatsch, for-Schleifen sind entartete while-Schleifen

die Eigenschaft, nach einem bestimmten Test abzubrechen, ist das zentrale Kriterium, und gehört zu while,

dass bei for eine Variable hochgezählt wird, ist ein höheres, zusätzliches Konstrukt,
syntaktischer Zucker


----------



## Djinndrache (21. Feb 2008)

Ich glaub Slater hat recht  Immerhin kann man vor der while int i machen und bevor die while zu ende ist i++ und in die Bedingung i<10 - schon hat man alle Teile einer for()-Schleife zusammen ^^


----------



## HolgerB (21. Feb 2008)

Beispiel Konsolenanwendung:

Nehmen wir ein Quiz, welches z.B. 10 Fragen stellt und am Ende die Frage kommt:
"Wollen Sie nochmal (j/n)?" Wenn Bedingung (j) = true, dann startet das Quiz von vorne, ansonsten Programmende.
Es gibt noch viele weitere Beispiele.

Grüße
Holger


----------



## maki (21. Feb 2008)

SlaterB hat gesagt.:
			
		

> Quatsch, for-Schleifen sind entartete while-Schleifen
> 
> die Eigenschaft, nach einem bestimmten Test abzubrechen, ist das zentrale Kriterium, und gehört zu while,
> 
> ...


Das stimmt nicht, war schon immer so, auch in C/C++ 

Man kommt viel einfacher von einer for Schleife zu einer while Schleife als umgekehrt, muss nur Dinge auslassen.

Folgender Code:

```
package test;

public class LoopTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		forLoop();
		whileLoop();
	}
	
	public static void forLoop() {
		for (int i = 0; i < 5; i++) {
			System.out.println("forLoop()");
		}
	}

	public static void whileLoop() {
		int i = 0;
		while (i < 5) {
			System.out.println("whileLoop()");
			i++;
		}
	}
}
```
Nach dem Kompilieren werden beide Schleifen zu for Schleifen, so wie oft wenn der Compiler ein while findet.
Entweder dass, oder er macht eine do-while schleife draus(optimieren), da die doch spezieller ist und nicht einfach so auf eine for Schleife zurückgeführt werden kann.

while ist nur für Menschen gemacht, als abkürzung, sonst nix.


----------



## SlaterB (21. Feb 2008)

naja, da will man wohl Code sparen und baut die weitere Verarbeitung nur für for,
der einfache while-Fall läßt sich dann leicht als for mit Lücken darstellen

das ist so als wenn man nur für if+else eine Code-Generierung kennt 
und jedes einfache if ohne else dann in if {Code} else {} umoptimiert

also wäre jedes normale if ein entartetes if-else statt andersrum..

nach Compiler-Regeln kann man sowas klassifizieren, mit Logik hat das dann aber nicht viel zu tun


----------



## maki (21. Feb 2008)

Ich verstehe was du meinst mit if-else.

Könnte mich täuschen, aber ich glaube, dass es zumindest in C/C++ so war, dass jede Schleife zu einer eigenen Funktion und deren Aufruf geändert wurde, da war es ein leichtes, Initialisierung und abschliessende Inkrementierung umzusetzen.

Jedenfalls glaube ich nicht das bytecode ein for oder while Konstrukt kennt, sondern einfach nur Zeiger und dann im Code herumspringt.


----------



## Djinndrache (22. Feb 2008)

Ok, danke.

Ich denke das Beispiel mit dem Programm ausführen udn fragen obs nochmal soll ist das beste


----------



## Murray (22. Feb 2008)

maki hat gesagt.:
			
		

> while ist nur für Menschen gemacht, als abkürzung, sonst nix.



Wie letztendlich alle anderen (Java- [oder irgendeine andere (Hoch-)Sprache-])-Befehle auch.

Manche Sachverhalte lassen sich eben einfacher als "wiederhole solange" formulieren als als "wiederhole bis" - letztendlich kann man beides zu einer (entarteten) for-Schleife verallgemeinern - es wurde aber (vor langer Zeit)  die Design-Entscheidung getroffen, trotzdem in der Sprache die anderen Varianten zusätzlich zu unterstützen.


----------



## Guest (22. Feb 2008)

In Assembler sind do-while Schleifen viel häufiger zu finden. Die ganzen bedingten Sprunganweisungen wie JZ, JZE, 
JC etc. sind meist am Ende einer Schleife zu finden.


----------

