2010-04-28 157 views
1

我最近解決了一個問題。但是我有這樣一段代碼,我不使用for循環初始化和條件檢查。 For循環看起來有點奇怪。我想將它轉換爲while循環。請幫我做。我嘗試了很多次,但有些地方丟失了東西。需要將此循環轉換爲while循環

for(;;current =(current+1)%n){ 
    if(eliminated[current%n]){ 
     continue; 
    }else{ 
     inkiPinki++; 
     if(inkiPinki == m){ 
      eliminated[current%n] = true; 
      printStatus(eliminated, people); 
      remainingGuys--; 
      break; 
     } 
    } 
} 

在上面的代碼中去掉[index]是一個布爾值。

編輯:感謝Geoff爲我提供的解決方案,我進一步將此解決方案最小化。

while(eliminated[current] || ++inkiPinki != m) 
    current = (current+1) % n; 
eliminated[current] = true; 
printStatus(eliminated, people); 
remainingGuys--; 
+0

爲什麼你需要這樣的'while'?也許你只想簡化這個循環? – SergGr 2010-04-28 16:26:05

+0

@iPhone beg:是的 – bragboy 2010-04-28 16:28:02

+0

從您的編輯,我不知道你想要什麼?這段代碼肯定屬於循環內部? – Geoff 2010-04-28 16:29:25

回答

1

嘗試

while(true) { 
    if(!eliminated[current]) { 
     if(++inkiPinki == m) { 
      break; 
     } 
    } 
    current = (current+1) % n; 
} 
eliminated[current] = true; 
printStatus(eliminated, people); 
remainingGuys--; 

它應該是邏輯上等同。

+0

這個我試過了,但最後一行當前=(當前+ 1)%n執行不會發生,如果遇到繼續 – bragboy 2010-04-28 16:25:49

+0

是的,對不起,我修好了。 – Geoff 2010-04-28 16:26:07

+0

嗨,請參閱我的編輯 – bragboy 2010-04-28 16:27:45

1

我會怎麼做:

while (inkiPinki < m) { 
    if (!eliminated[current % n]) { 
     inkiPinki++; 

     if (inkiPinki == m) { 
      eliminated[current % n] = true; 
     } 
    } 

    if (inkiPinki < m) { 
     current = (current + 1) % n; 
    } 
} 

printStatus(eliminated, people); 
remainingGuys--; 

這段代碼正好完成同樣的事情,你原來的for循環,但是它使用的邏輯測試,以確定它是否應該繼續循環。不需要continuebreak。如果您發現自己使用這些語句中的任何一個,那麼可能會有一些重構應該完成。

+0

嘗試了你的代碼。它不工作。 – bragboy 2010-04-28 16:36:18

+0

你可以請求合格的「它不工作」?另外,請問現在的修訂是否可以再試一次? – 2010-04-28 16:41:03

+0

嗨,我現在嘗試仍然失敗..謝謝你的努力 – bragboy 2010-04-28 16:50:32

2

所有環可被轉換,同時使用以下模式循環,以:

for (..xxx..; ..yyy..; ..zzz..) { 
    ..aaa.. 
} 

變得

...xxx... 
while (...yyy...) { 
    ..aaa.. 
    ..zzz.. 
} 

記住

for (;;) { 
    ..aaa.. 
} 

相當於

for (nop; true; nop) { 
    ..aaa.. 
} 

其中「nop」表示無操作。

在你的榜樣,這使得你的循環:

for(;;current =(current+1)%n){ 
    if(eliminated[current%n]){ 
     continue; 
    }else{ 
     inkiPinki++; 
     if(inkiPinki == m){ 
      eliminated[current%n] = true; 
      printStatus(eliminated, people); 
      remainingGuys--; 
      break; 
     } 
    } 
} 

相當於

// no initialzation needed 
while(true) { 
    //if(eliminated[current%n]){ 
    // continue; 
    //}else{ 
    if(!eliminated[current%n]){ 
     inkiPinki++; 
     if(inkiPinki == m){ 
      eliminated[current%n] = true; 
      printStatus(eliminated, people); 
      remainingGuys--; 
      break; 
     } 
    } 
    current =(current+1)%n; 
} 

從那裏,你可以進一步簡化它,如果你想。

+1

循環體中的「繼續」不會打破你的轉換嗎? – 2010-04-28 17:48:19

+0

要注意,繼續不會導致跳過更新時轉換爲另一個循環;我糾正了代碼,因爲它糾正了它是最好的答案,因爲它最接近於原始代碼,我想加註它。 – 2010-04-28 18:26:09

+0

感謝您的更新。是的,循環體的繼續打破了轉變。我在寫這篇文章時肯定需要一杯額外的咖啡,並且再次感謝修正。 – 2010-04-29 12:56:41

0

我似乎有過多偏愛使用布爾爲整數:

for (;inkiPinki<m; inkPinki += !eliminated[current]) 
    current = (current + 1) %n; 

eliminated[current] = true; 
printStatus(eliminated, people); 
remainingGuys--; 

我也改變了current%n在幾個地方根本current,因爲%n已經完成,其中電流遞增,所以current應該已經減少模n

如果我這樣做,我可能會改變感覺,這樣反而eliminated,它是像remaining

for (;inkiPinki<m; inkPinki += remaining[current]) 
    current = (current + 1) %n; 

remaining[current] = false; 
printStatus(remaining, people); 
remainingGuys--;