Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   FreePascal for-Schleife -Abbruch (https://www.delphipraxis.net/164489-schleife-abbruch.html)

thomasschaf 15. Nov 2011 13:29

for-Schleife -Abbruch
 
Hallo,

ich möchte in einer for-Schleife gewisse Durchläufe überspringen:

Das könnte ich so machen:
Delphi-Quellcode:
for x:=a to b do begin
  if f(x)>100 then begin
    ...
  end;
end;
Allerdings habe ich viele if-Abfragen, die ineinander verschachtelt sind, doch ich kann sie nicht mit einem AND verknüpfen, da gewisse innere nicht abgefragt werden dürfen, wenn die äußere(n) FALSE liefert.

Ich möchte soetwas wie:
Delphi-Quellcode:
for x:=a to b do begin
  if not (f(x)>100) then Exit;
  ...
end;
Das wäre besser, doch bei mir wird die komplette Schleife beendet. Ich möchte aber nur gewisse Durchläufe überspringen.

Bitte um Hilfe,

Thomas

ChrisE 15. Nov 2011 13:32

AW: for-Schleife -Abbruch
 
Zitat:

Zitat von thomasschaf (Beitrag 1136297)
Ich möchte aber nur gewisse Durchläufe überspringen.

Hi Thomas,

Delphi-Quellcode:
for x:=a to b do begin
  if not (f(x)>100) then continue;
  ...
end;
Gruß, Chris

himitsu 15. Nov 2011 13:51

AW: for-Schleife -Abbruch
 
Delphi-Referenz durchsuchenExit ist eigentlich nicht zum Beenden/Abbrechen von Schleifen gedacht, sondern zum Verlassen ganzer Prozeduren/Funktionen.

Delphi-Referenz durchsuchenBreak für Schleifen und dann eben noch das Delphi-Referenz durchsuchenContinue zum Überspringen.


PS: Ich würde eher den Vergleichsoperator umdrehen und auf das Not verzichten. :angle:

TiGü 15. Nov 2011 14:27

AW: for-Schleife -Abbruch
 
Zitat:

Zitat von thomasschaf (Beitrag 1136297)
Allerdings habe ich viele if-Abfragen, die ineinander verschachtelt sind, doch ich kann sie nicht mit einem AND verknüpfen, da gewisse innere nicht abgefragt werden dürfen, wenn die äußere(n) FALSE liefert.

Anmerkung:
Sobald eine Bedingungen in der if-Abfrage fehlschlägt, werden alle folgenden nicht mehr geprüft. Kannst also schon Schachteln!

Beispiel:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
   if GetAFalseBooleanValue and GetATrueBooleanValue then
    OutputDebugString(PWideChar('Wird niemals erreicht'));
end;

function TForm1.GetAFalseBooleanValue: Boolean;
begin
  Result := False;
  OutputDebugString(PWideChar('False - Siehtste mich???'));
end;

function TForm1.GetATrueBooleanValue: Boolean;
begin
  Result := True;
  OutputDebugString(PWideChar('True - Siehtste mich???'));
end;

thomasschaf 15. Nov 2011 14:37

AW: for-Schleife -Abbruch
 
Ach, so einfach :-D

Ich wusste doch, dass es einen Befehl dafür gibt ^^

Vielen Dank - so sieht mein Programm viel ordentlicher aus !

Thomas


Edit:
Zum "Schachteln" habe ich mich nicht so deutlich ausgedrückt, ich meinte soetwas:

Delphi-Quellcode:
if (a<>'') and (isnumeric(a)) and qx(a) then begin
  s:= a...
end;
Allerdings benütigt die Funktion "qx" schon einen numerischen nichtleeren String "a", ansonsten Fehler.
Daher muss ich machen:

Delphi-Quellcode:
if (a<>'') and isnumeric(a) then begin
  if qx(a) then s:=...
end;
so in der Art...

TiGü 15. Nov 2011 15:18

AW: for-Schleife -Abbruch
 
Zitat:

Zitat von thomasschaf (Beitrag 1136316)
Edit:
Zum "Schachteln" habe ich mich nicht so deutlich ausgedrückt, ich meinte soetwas:

Delphi-Quellcode:
if (a<>'') and (isnumeric(a)) and qx(a) then begin
  s:= a...
end;
Allerdings benütigt die Funktion "qx" schon einen numerischen nichtleeren String "a", ansonsten Fehler.

Nein, musst du nicht.
Bitte mein Beispiel mal ausprobieren!

Für dein Beispiel:
Sobald (a<>'') gleich false liefert, werden alle anderen Bedingungen die zwischen if und then stehen nicht abgefragt!

EDIT:

Würde die Prüfung sowieso in die IsNumeric() Funktion implementieren!

ChrisE 15. Nov 2011 15:32

AW: for-Schleife -Abbruch
 
Zitat:

Zitat von TiGü (Beitrag 1136322)
Nein, musst du nicht.
Bitte mein Beispiel mal ausprobieren!

BTW: Das stimmt nur, solange bei den Compiler-Option nicht die vollständige boolesche Prüfung aktiviert ist.

Gruß, Chris

leddl 15. Nov 2011 15:36

AW: for-Schleife -Abbruch
 
Zitat:

Zitat von thomasschaf (Beitrag 1136316)
Allerdings benütigt die Funktion "qx" schon einen numerischen nichtleeren String "a", ansonsten Fehler.

Dann würde ich an deiner Stelle diese Prüfung allerdings in der Funktion selbst einbauen.

Iwo Asnet 15. Nov 2011 17:02

AW: for-Schleife -Abbruch
 
Warum das Ganze nicht übersichtlich verpacken?

Delphi-Quellcode:
Function OperationIstLegal(KandidatenIndex : Integer) : Boolean;
Begin
  Result := False;
  If KandidatIstLeer(KandidatenIndex) Then Exit;
  If Not KandidatIstNumerisch(KandidatenIndex) Then Exit;
  If KandidatHatRoteHaare(KandidatenIndex) And HeuteIstDienstag() Then Exit;
 // Hier beliebig viele Prüfungen einfügen, anfügen, erklären usw.
 //
 // Und zum Schluss
  Result := True;
End;

Procedure DieEigentlicheSchleife;
Var
  i : Integer;
Begin
  For i:=1 to VerdammtHoheZahl do
    If OperationIstLegal(i) then
      FuehreOperationAus(i);
End;

jaenicke 15. Nov 2011 17:17

AW: for-Schleife -Abbruch
 
Erst schreibst du übersichtlich und dann widersprichst du dir indem du Exit in dieser Art und Weise benutzt... ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.
Seite 1 von 2  1 2      

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