Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   verschachelte for schleifen beenden (https://www.delphipraxis.net/31069-verschachelte-schleifen-beenden.html)

theomega 3. Okt 2004 21:02


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:
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;
sollte laut Delphihilfe so funktionieren, tut es aber nicht, break bricht nicht alle schleifen ab. Wer kann mir ne Lösung veraten?

Danke
TO

Union 3. Okt 2004 21:07

Re: verschachelte for schleifen beenden
 
Zitat:

Zitat von theomega
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:
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; // Der springt...
break;
break;
end;
// ... hierher
end;
end;
sollte laut Delphihilfe so funktionieren, tut es aber nicht, break bricht nicht alle schleifen ab. Wer kann mir ne Lösung veraten?

Danke
TO

Schon das erste break überspringt die anderen. Du machst das am besten mit einem booleschen flag:
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;

dizzy 3. Okt 2004 23:49

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:
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;
und die ganzen begin..end; könnte man sich auch sparen, so wie den Vergleich auf "true":
Delphi-Quellcode:
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;
Geht auch ;)


Gruss,
Fabian

dizzy 4. Okt 2004 00:04

Re: verschachelte for schleifen beenden
 
Ach: Mit dem Flag das kann man auch noch so machen:

Delphi-Quellcode:
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;
und es ginge sogar in einer Schleife:
Delphi-Quellcode:
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;
Lässt sich nicht mehr so schön lesen, aber möglich ists :D.

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...

Hansa 4. Okt 2004 01:46

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:
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;
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 +.

dizzy 4. Okt 2004 06:37

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 23:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz