repeat-until in C++?
-
Hallo alle miteinander,
unser Prof hat uns heute eine ziemlich merkwürdige Aufgabe gestellt. Wir sollen ein repeat-until-Konstrukt, welches seiner Meinung nach in C++ nicht vorhanden ist mit...
a) ...einer for-Schleife...
b) ...einer while-Schleife...
c) ...einer do/while-Schleife...
...nachbauen, bzw. belegen, dass dies nicht möglich ist. Aber do/while Schleifen sind doch genau das selbe wie repeat-until Schleifen, oder? Ich verstehe den Sinn der Aufgabe nicht. repeat-until ist doch postchecked, genau wie do-while...PS: Sorry wenn ich im falschen Forum gepostet haben sollte aber ich denke eingefleischte C++ler können mir da am besten helfen
.
Bye,
JoLo
-
Hmm, also ich verstehe nicht worauf er hinaus will.
btw: Man sollte nicht leichtsinnig mit Aussagen umgehen, dass es bestimmte Dinge einfach nicht gibt, da sich _meistens_ alles irgendwie realisieren lässt...
-
Ja, denke ich mir auch, dass man alles realisieren kann. Der Prof ist eh ein wenig beschränkt. Aber was genau bewirkt repeat-until denn in anderen Sprachen?
-
repeat
// statements
until blaführt die statements so lange immer wieder aus, bis mal am Ende eines Durchlaufs die Bedingung bla gilt.
x:=10;
repeat
x:=x-1;
until x=0;sollte zumindest halbwegs Pascal-mäßig sein und zieht halt so lange eins ab, bis wir bei 0 sind.
Umformen in C++ kann man das so:
do
{
// Statements
}
while(!bla) // hier das ! beachten. Die Schleife läuft so lange, wie die Bedingung nicht erfüllt ist, bricht also wie gewünscht genau dann ab, wenn die Bedingung erfüllt ist.MfG Jester
-
Im Grunde genommen ist (do-)while/(do-)until/for alles das Gleiche. Man verwendet "for" meistens aus Gründen der Bequemlichkeit, es ist auch bisschen auf ein "index-artiges Durchzählen" (Ich nenne es einfach mal so :p) ausgelegt.
-
Wenn du schon for, while und do/while in einem Atemzug nennen musst, dann solltest du diverse goto-Konstrukte nicht vergessen. Sind im Grunde genommen später alles irgendwelche Jumps und Compares.
-
Jo schon, aber wer will Spaghetti-Code :p
-
simon.phoenix schrieb:
Jo schon, aber wer will Spaghetti-Code :p
Ich rede von der Assembler-Ebene. Da ist das nämlich alles dasselbe. Du hast doch die Weisheit verbreitet, dass die Schleifen im Prinzip alle dasselbe sind. Auf Assemblerebene mag das bedingt stimmen aber nicht auf der Ebene einer Hochsprache. Natürlich kann man jede Schleifenart mit jedem Schleifentyp konstruieren, aber es hat schon einen Sinn, dass es mehrere gibt. Und der Sinn ist sicher nicht nur die Bequemlichkeit.
-
Sorry, in Bezug auf Schleifen hatte ich goto-Konstruktionen nicht miteinbezogen und von Assembler habe ich nicht gesprochen
-
geht mit allen (for und while(){} brauchen eine hilfsvariable um den ersten durchlauf zu forcieren)
-
peterchen schrieb:
geht mit allen (for und while(){} brauchen eine hilfsvariable um den ersten durchlauf zu forcieren)
??? Wieso brauchen die ne hilfsvariable?
Fußgesteuertfor(;true;) { /*code*/ if (Bedingung) break; }
sieht bei der while schleife im prinzip genauso aus.
Wenn du min. einen durchlauf brauchst, baust dir halt was fußgesteuertes mit hilfe von for und while.
ich würd aber ja gern mal wissen was das fürn prof ist, wenn er als aufgabe gibt "REPEAT ... UNTIL" mit "do{ ... }while()" nachzubauen...
-
for(;true;) { // ... if (peterchenEvil) { Bedingung = false; continue; } // ... if (Bedingung) break; }
Ist aber die Frage ob das gehen muß... für reine Repeat-Until-Semantik geht's auch ohne, das it richtig.
-
Ich steh grad aufm Schlauch!
Wenn du bei der for/while Variante n Problem hättest, würdest du s doch genauso bei Repeat until haben.Meinst du jetzt das Continue? Die schleife springt wieder zum kopf, ok, aber das sollte dem programmierer bekannt sein
wenn er in diesem fall beenden will baut er halt ein continue ein, oder an anderer stelle nochmel die if bedingung die zum schleifenabbruch führt.
-
Wenn du bei der for/while Variante n Problem hättest, würdest du s doch genauso bei Repeat until haben
nein, weil continue die (im Schleifenkonstrukt angegebene) Bedingung noch mal testet. Natürlich kannst du
for(;true;) { // ... Bedingung = ...; // Bedingung ändert sich // ... if (peterchenEvil) // Bedingung für continue { if (Bedingung) break; else continue; } // ... if (Bedingung) break; }
schreiben - ist aber m.E. ein deutlicher Nachteil: Es ist keine echte repeat/until Schleife, sondern verhält sich nur in den <i>meisten</i> Fällen so, um sie richtig zu nutzen, muß man die Implementation kennen.
-
ahso. naja, im normalfall würde man ja auch "do...while()" nehmen. In nem vernünftigen quelltext würd ich sowas nie einsetzen (also son for konstrukt) um das erfragte ergebnis zu bekommen
Die Aufgabe hätte das konstrukt wohl dennoch bestanden, da es ein "Repeat...until" konstrukt simuliert, bzw. genau so funktionieren *kann*, wenn man es wie unten einsetzt.@continue Das ist aber kein bestandteil des "ersatzkonstrukts". wird continue aufgerufen/ausgeführt(?), dann wird halt das true im schleifenkopf nochmal interpretiert.
-
ich lese hier mehrfach
for (; true ;)
! dabei sollte bekannt sein, dass man entweder
for (;;)
(IMHO das beste) oder
while (true)
schreibt. naja, das nur am rande.
-
is das nich eigentlich schnurz?
bewirkt beides das selbe. steht eigentlich was darüber im standard?in c++-gepackt steht folgendes:
for(initialisation;condition;increment){ statement block }
demnach dürfte es also alles ok, höchstens unschön.
-
THE_FreaK schrieb:
is das nich eigentlich schnurz?
for(;;)
for(;true;)
while(1)etc.
ist alles das selbe.Aber: for(;true;) schaut verwirrend aus - denn das true ist unnuetz.
Da doch lieber (wie von Mr.N vorgeschlagen) for(;;)
-
Bei while(true){...} meckern manche Compiler und schmeissen ne Warnung. Ich schreibe immer for(;;) auch wenn while(true) besser aussieht.
-
also das beides geht war mir klar, mich würd nur mal interessieren, was der standard dazu sagt. denn die "for(;;){}" müsste dann ja als "for(;true;){}" interpretiert werden (btw: hab auch noch nie das true mitgeschrieben ^^), wobei bei allen anderen dingen ein ein "foo(,,)" doch zum beispiel zur folge hätte, dass 3x 0 übergeben wird (es sei denn es gibt standardparameter).