跳过 for 循环的特定(指定)迭代

Skip particular (specified) iteration of for loop

我是 C++ 的新手,但我在网上找不到解决方法,我觉得可能有一个有趣、优雅的解决方案。

我最终想为行星运动编写一个蛙跳算法。我定义了一个名为 planet

的 class
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 of [(Gm_im_j) /r_ij],其中i和j表示两颗行星,j每次递增,r_ij两者之间的距离。

在我开始整体考虑之前,我正在测试是否可以使用 for 循环来 select 数组中的特定行星和该行星的特定组件,然后打印出来。通过

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

但是,我想尝试排除一个特定的行星,假设我正在计算 j 上的力,其中 j = 2。

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

这个循环在 2 处终止,只打印 p[0] 和 p[1] 的 v0 值(通过 class 定义),而不是 p[3]喜欢。同样,j=1 只为 p[0] 和 p[1] 打印 v0。

有没有方便的方法在 for 循环中放置满足我需要的条件,或者我应该重新考虑我的方法?

只需将检查放在循环内即可:

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

在 for 循环中使用关键字 continue。它强制循环的下一次迭代

if(i==j) continue;

为什么不试试这个

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";
 }

如果您希望循环跳过 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";
    }
}

两种方式实现相同的目标。

如果你真的坚持把它放在 for meta 中(而不是在循环中),试试这个:

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

但是,使用 if (i == j) continue; 可能是最简洁的编写方式。

上面提了很多建议,为什么你的代码不行呢??

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

记住只要循环条件为真,循环就会继续执行;一旦循环条件变为假,循环将退出。你的循环条件是

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

要使此表达式为真,“&&”两边的两个子表达式都必须为真。当 i=j 时

(i<j || i>j) 

表达式为假,因此循环条件为假,循环终止,正如您观察到的那样。