2017-10-04 9 views
-2

누구든지 Delphi에서이 주제를 도와 줄 수 있습니까?델파이에서 중첩 된 루프를 건너 뛰는 방법은 무엇입니까?

나는 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 실행해야합니다. '제거'나쁜 표현에 대한 죄송합니다 :

나는 델파이 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

또 다른 방법은 재귀를 사용하는 것입니다. 이것은 텍스트 파일에 현재 색인을 쓰는 코드를 기반으로하는 아주 단순한 예제입니다 (미안, 테스트 용 델파이 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;