![]() |
verschachelte for schleifen beenden
Hallo Leute,
ich habe ein kleines Problem: ich habe 3 ineinander verschachelte forschleifen die bei einer bestimmen beidung alle abgebrochen werden sollen. Beispiel
Delphi-Quellcode:
sollte laut Delphihilfe so funktionieren, tut es aber nicht, break bricht nicht alle schleifen ab. Wer kann mir ne Lösung veraten?
for i:= 1 to 1000 do begin;
for j:= 1 to 1000 do begin; for k:= 1 to 1000 do begin; if (fun(i,j,k)=true) then begin; break; break; break; end; end; end; Danke TO |
Re: verschachelte for schleifen beenden
Zitat:
Delphi-Quellcode:
beenden := false;
for i:= 1 to 1000 do begin; for j:= 1 to 1000 do begin; for k:= 1 to 1000 do begin; if (fun(i,j,k)=true) then begin; beenden := true; break; end; if beenden then break; end; if beenden then break; end; end; |
Re: verschachelte for schleifen beenden
Die Formatierung ist ja grausig :)
Entweder wie bereits erwähnt mit nem Flag, oder du lagerst die Schleifen in eine eigene Prozedur aus, und springt dann mit "Exit" raus. Da du, vermute ich mal, i, j und k nachher noch brauchst könnte man sie als var-Parameter übergeben:
Delphi-Quellcode:
und die ganzen begin..end; könnte man sich auch sparen, so wie den Vergleich auf "true":
procedure Schleifchen(var i,j,k: Integer);
begin for i:= 1 to 1000 do begin for j:= 1 to 1000 do begin for k:= 1 to 1000 do begin if (fun(i,j,k)=true) then Exit; end; end; end; end;
Delphi-Quellcode:
Geht auch ;)
procedure Schleifchen(var i,j,k: Integer);
begin for i:= 1 to 1000 do for j:= 1 to 1000 do for k:= 1 to 1000 do if fun(i,j,k) then Exit; end; Gruss, Fabian |
Re: verschachelte for schleifen beenden
Ach: Mit dem Flag das kann man auch noch so machen:
Delphi-Quellcode:
und es ginge sogar in einer Schleife:
i := 1;
j := 1; k := 1; doBreak := false; while (i<=1000) and not doBreak do begin while (j<=1000) and not doBreak do begin while (k<=1000) and not doBreak do begin if fun(i,j,k) then doBreak := true; inc(k); end; inc(j); end; inc(i); end;
Delphi-Quellcode:
Lässt sich nicht mehr so schön lesen, aber möglich ists :D.
i := 1;
j := 1; k := 1; while true do begin if fun(i,j,k) then Break; inc(i); if i>1000 then begin i := 1; inc(j); if j>1000 then begin j := 1; inc(k); if k>1000 then Break; end; end; end; Mir fallen grad noch ein paar mögliche Konstrukte ein... wahrscheinlich deswegen, weil ich eigentlich garnicht ins Bett will, aber muss :? 8) (Und schöner wären die wohl auch nicht... *g*) Also: Gute Nacht! Fabian \\edits: ohoh, die Schlechtschreibung... |
Re: verschachelte for schleifen beenden
Meine Tips werden wohl nicht berücksichtigt werden, weil sie vorerst etwas mühsam sind. Leider habe ich die Programmierung von einem N. Wirth Schüler gelernt. 8) Dessen Tips sind aber auch heute noch hilfreich.
1. Tip : keine gotos 2. Tip : keine unkontrollierten oder unnötigen Sprünge aus einer Schleife raus. 3. Tip : keine Ergebniszuweisung innerhalb einer Schleife, sondern nur am Ende. 4. Tip : "result" und ähnliches vermeiden usw. Ansonsten solle man eben BASIC benutzen und Spaghetticode produzieren. :mrgreen: Das ganze heißt im Klartext : kein EXIT, kein BREAK. Da hat er auch Recht, denn das ist unnötig. Insofern sind die gemachten Vorschläge mit den gemachten Vorgaben nicht vereinbar. Das Flag ist allerdings schon brauchbar (bei mir heißt es : Ende. Ah, ich sehe gerade, Dizzy hat das schon richtig gemacht, aber nur fast. Die Schleifen werden zu oft durchlaufen. Mein Vorschlag eine 3er Schleife möglichst früh zu beenden :
Delphi-Quellcode:
Ob es jetzt genau mit der Programm-Logik übereinstimmt, wer weiß ? :zwinker: Zumindest braucht man keine BASIC Konstrukte wie Exit oder Break. 8) Wer 0.0000000000001 Sek. sparen will, der soll noch INC verwenden statt +.
var i,j,k : integer;
ende : boolean; begin i := 1; j := 1; k := 1; ende := false; while not ende do begin i := i + 1; ende := i = fun (i,j,k); if not ende then while not ende do begin j := j + 1; ende := j = fun (i,j,k); if not ende then while not ende do begin k := k + 1; ende := k = fun (i,j,k); end; end; end; end; |
Re: verschachelte for schleifen beenden
Die "if not ende" kann man aber auch weg lassen, da die while-schleife eh nicht betreten würde ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz