AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein verschachelte for schleifen beenden
Thema durchsuchen
Ansicht
Themen-Optionen

verschachelte for schleifen beenden

Ein Thema von theomega · begonnen am 3. Okt 2004 · letzter Beitrag vom 4. Okt 2004
Antwort Antwort
Benutzerbild von theomega
theomega

Registriert seit: 18. Jun 2002
684 Beiträge
 
#1

verschachelte for schleifen beenden

  Alt 3. Okt 2004, 22:02
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
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: verschachelte for schleifen beenden

  Alt 3. Okt 2004, 22:07
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;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: verschachelte for schleifen beenden

  Alt 4. Okt 2004, 00:49
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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: verschachelte for schleifen beenden

  Alt 4. Okt 2004, 01:04
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 .

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...
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: verschachelte for schleifen beenden

  Alt 4. Okt 2004, 02:46
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. 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ß ? Zumindest braucht man keine BASIC Konstrukte wie Exit oder Break. 8) Wer 0.0000000000001 Sek. sparen will, der soll noch INC verwenden statt +.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: verschachelte for schleifen beenden

  Alt 4. Okt 2004, 07:37
Die "if not ende" kann man aber auch weg lassen, da die while-schleife eh nicht betreten würde
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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