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
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.
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...
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)
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
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 ^^
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.
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:
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.
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
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.
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.
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.