2017-10-04 7 views
-2

誰でもデルファイでこのトピックを手伝ってもらえますか?デルファイのいくつかのネストされたループをスキップするには?

私は5つのネストされた "for"ブロックループを変数k1、k2 .. k5で繰り返しています。
別の変数kは、5ループ以上の深度を制御する必要があります。この変数は、実行時に定義されます。

kの 'for'ブロックがコメントされたかのように実行を排除できますか?コードを説明する短いリストはここにある:

kは2に等しいように、私は完全な流れを短く、ループK4とK5(中括弧で終了コードの行)の実行を避けたい、説明更に
k := 2; 
for k1 := 1 to 100 do begin 
    for k2 := 1 to 100 do begin 
     for k3 := 1 to 100 do begin 
     for k4 := 1 to 100 do begin {want to skip this loop} 
      for k5 := 1 to 100 do begin {want to skip this loop} 
       AnywayDoThat; // must execute anyway 
      end; {k5} 
     end; {k4} 
     end; 
    end; 
end; 

プログラム。もちろん、proc AnywayDoThatは実行する必要があります。

私は、Delphi 6

編集使用:悪い言葉遣い '排除' の申し訳ありませんが。その目的は、不必要な反復を避けることでした。ループを一回だけスキップするというトリックは完璧です。したがって、proc AnywayDoThatは、k1、k2、k3のみに従って到達する。

+0

割り当てが正しく理解されていますか? –

+1

(悪いgoto文はこの質問を見ています) –

+1

'if k> 0の場合、k1:= 1〜100はk> 1の場合はk2の場合:= etc ... ' –

答えて

0

あなたはここでの主なアイデアは、それが一度に実行することにより、ループをスキップすることで、次のトリック

Var 
    Maxes: array [1..5] of integer; 
    Eliminators: array [1..5] of integer; // they have to be of same length 
begin 
    SetArray(Maxes, [100, 100, 100, 100, 100]); 
    SetArray(Eliminators, [1, 1, 1, 1, 1]); 

    // Here you set K 
    K := 2; // you need to make sure K <= 5 

    // Set the Eliminators array 

    for I := 1 to K do 
    begin 
     Eliminators[5-I+1] := Maxes[5-I+1]; 
    end; 

    // Now to the loops 

    for k1 := 1 to Maxes[1] div Eliminators[1] do begin 
    for k2 := 1 to Maxes[2] div Eliminators[2] do begin 
     for k3 := 1 to Maxes[3] div Eliminators[3] do begin 
     for k4 := 1 to Maxes[4] div Eliminators[4] do begin 
      for k5 := 1 to Maxes[5] div Eliminators[5] do begin 
      AnywayDoThat; // must execute anyway 
      end; 
     end; 
     end; 
    end; 
    end; 


end; 

を使用することができます。これは、ループをスキップするようにさらに変更することができます。

1

もう1つの方法は再帰を使用することです。これは、現在のインデックスをテキストファイルに書き込むコードに基づいた簡単な例です(申し訳ありませんが、テスト用のDelphi 6はありません)。

var 
    F: Textfile; 

procedure AnywayDoThat(const Index: array of Integer); 
var 
    I: Integer; 
begin 
    for I := Low(Index) to High(Index) do 
    Write(F, Index[I], '.'); 
    Writeln(F); 
end; 

procedure Loop(Level, MaxLevel: Integer; const Index: array of Integer); 
var 
    arr: array of Integer; 
    I: Integer; 
    L: Integer; 
begin 
    if Level < MaxLevel then begin 
    L := Length(Index); 
    SetLength(arr, L + 1); 
    for I := 0 to L - 1 do begin 
     arr[I] := Index[I]; 
    end; 
    for I := 1 to 100 do begin 
     arr[L] := I; 
     Loop(Level + 1, MaxLevel, arr); 
    end; 
    end 
    else begin 
    AnywayDoThat(Index); 
    end; 
end; 

procedure Main(); 
var 
    k: Integer; 
    I: Integer; 
    Index: array of Integer; 
begin 
    AssignFile(F, 'c:\Temp\test.txt'); 
    Rewrite(F); 
    k := 2; 
    SetLength(Index, 1); 
    for I := 1 to 100 do begin 
    Index[0] := I; 
    Loop(1, 5 - k, Index); 
    end; 
    Close(F); 
end; 
関連する問題