2015-02-24 118 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,并且循环终止,就像您观察到的一样。