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

Skip particular (specified) iteration of for loop

本文关键字:指定 迭代 for 循环 跳过      更新时间:2023-10-16

我对C++很陌生,但我在网上找不到解决办法,我觉得可能有一个有趣、优雅的解决方案。

我最终试图为行星运动编写一个蛙跳算法。我定义了一个名为行星的类

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

在我开始将其作为一个整体进行思考之前,我正在测试是否可以使用for循环从数组中选择一个特定的行星,以及从该行星中选择特定的组件,并打印出来。通过运行良好

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值(通过类定义),而不是我希望的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";
 }

这是我能想到的最简单的方法,不需要尝试任何复杂的东西。您只需要在循环中检查i是否等于j。如果i不等于j,则给出输出。

如果你不想这样,那么你可以像其他答案中建议的那样使用continue

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

只需将检查放入循环中即可:

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

上面提出了很多建议,但为什么您的代码不起作用??

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

记住,只要循环条件为true,循环就会继续执行;一旦循环条件变为false,循环将退出。您的环路条件为

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

若要使此表达式为true,"&&"两边的两个子表达式都必须为true。当i=j时,

(i<j || i>j) 

表达式为false,所以循环条件为false,循环终止,正如您所观察到的那样。

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

if(i==j) continue;

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

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

然而,使用if (i == j) continue;可能是最干净的编写方法。

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

两种方式都能达到相同的目标。