2015-02-24 220 views
2

我很新的C特定(指定)迭代++,但我無法找到這個網上一種變通方法,我覺得有可能是一個有趣的,優雅的解決方案成爲可能。跳過的for循環

我最終想要的代碼行星運動越級算法。我定義一個類中調用地球

Planet(double mass, double x0, double x1, double v0, double v1) 

和我有一個數組存儲爲4個不同星球的信息:

Planet planets[] = { 
Planet(2.0, -0.5, 0, -0.94, 0.65), 
Planet(1.0, -0.6, -0.2, 1.86, 0.7), 
Planet(1.0, 0.5, 1.0, -0.44, -1.40), 
Planet(0.4, 0.6, 0.3, 1.15, -1.50) 
}; 

我將要計算的力由於重力每個行星上的每個行星。這涉及實現用於上行星上的力的數學公式I:F_i =對i總和= j的[(G M_I m_j)/ r_ij],其中i和j表示兩個行星,j是每次遞增,並且r_ij兩者之間的距離。

之前,我開始思考,作爲一個整體,我是測試如果我可以使用一個for循環,選擇從數組中的特定地球,並從地球特定組件,並打印。這很好地通過

for(int i=0; i<4; ++i){ 
cout << planets[i].getvx() << "\n"; 
} 

但是,我想嘗試排除一個特定的星球,說我計算j = 2的力量。

for(int i=0; (i<j || i>j) && i<4; ++i){ 
cout << planets[i].getvx() << "\n"; 
} 

該循環終止於2中,僅打印p的V0的值(如通過類定義)[0]和P [1],而不是P [3]以及我所希望的。同樣,j = 1僅爲p [0]和p [1]打印v0。

有沒有把內部的一個條件環路符合我的需要,或者我應該重新考慮我的做法的便利方式?

+0

你放在for循環中的條件表示它什麼時候結束,因此當我到達2時,它會結束(2 <2 == false)。這就是爲什麼它只能打印p [0]和p [1]。 – Jcao02 2015-02-24 04:49:17

回答

4

的下一次迭代爲什麼不試試這個

for(int i=0; i<4 ; ++i) 
{ 
    if(i != j) 
    cout << planets[i].getvx() << "\n"; 
} 

這是一個沒有嘗試任何複雜的我能想到的最簡單的方法。你只需要檢查循環內的i是否等於j。如果i不等於j,則給出輸出。

如果你不希望這樣,那麼你可以使用像continue它已經在其他的答案被提出。

for(int i=0; i<4 ; ++i) 
{ 
    if (i == j) 
    continue; 
    cout << planets[i].getvx() << "\n"; 
} 
4

只要把檢查內循環:

for (int i=0; i<4; ++i) { 
    if (i!=j) { 
     cout << planets[i].getvx() << "\n"; 
    } 
} 
1

使用關鍵字continue在for循環中。它迫使循環

if(i==j) continue; 
2

如果您希望循環跳過內行爲時i == j,然後利用continue關鍵字:

for (int i = 0; i < 4; i++) { 
    if (i == j) { 
     continue; 
    } 
    cout << planets[i].getvx() << "\n"; 
} 

這將導致循環體被跳過。另一種方式是隻執行的內在邏輯時i != j

for (int i = 0; i < 4; i++) { 
    if (i != j) { 
     cout << planets[i].getvx() << "\n"; 
    } 
} 

兩種方式達到同樣的目標。

+0

「使for循環返回到開始」。我會考慮重新說明這一點。它聽起來像'我'會回到'0'。 – Jon 2015-02-24 04:51:03

1

如果你真的堅持在爲元(如循環反對),試試這個有它:

for (int i = 0; i < 4; i + 1 == j ? i++ : i += 2) 

但是,使用if (i == j) continue;大概是寫它的最徹底的方法。

1

上面提出了很多建議,但爲什麼你的代碼沒有工作?

for(int i=0; (i<j || i>j) && i<4; ++i){ 
    cout << planets[i].getvx() << "\n"; 
} 

只要循環條件爲真,循環將繼續執行;一旦循環條件變爲false,循環將退出。您的循環條件是

(i<j || i>j) && i<4 

對於這種表達是真實的兩個子表達式上的「& &」必須是真實的兩側。當我= j時

(i<j || i>j) 

表達式爲false,因此循環條件爲false,並且循環終止,就像您觀察到的一樣。