我对C ++很陌生,但我无法在网上找到解决方法,我觉得可能会有一个有趣,优雅的解决方案。
我最终试图为行星运动编写一个蛙跳算法。我已经定义了一个名为planet
的类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上计算了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循环中,还是应该重新考虑我的方法?
答案 0 :(得分:4)
把支票放在循环中:
for (int i=0; i<4; ++i) {
if (i!=j) {
cout << planets[i].getvx() << "\n";
}
}
答案 1 :(得分: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";
}
答案 2 :(得分: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";
}
}
两种方式都达到了同样的目标。
答案 3 :(得分:2)
上面提出了很多建议,但为什么你的代码没有工作?
for(int i=0; (i<j || i>j) && i<4; ++i){
cout << planets[i].getvx() << "\n";
}
请记住,只要循环条件为真,循环就会继续执行;一旦循环条件变为假,循环就会退出。你的循环条件是
(i<j || i>j) && i<4
对于这个表达式来说,&#34;&amp;&amp;&#34;两侧的两个子表达式都是真的。必须是真的。当i = j时
(i<j || i>j)
表达式为false,因此循环条件为false并且循环终止,就像您观察到的那样。
答案 4 :(得分:1)
在for循环中使用关键字continue。它强制循环的下一次迭代
if(i==j) continue;
答案 5 :(得分:1)
如果确实坚持在for meta中使用它(而不是在循环中),请尝试以下操作:
for (int i = 0; i < 4; i + 1 == j ? i++ : i += 2)
但是,使用if (i == j) continue;
可能是编写它的最简洁方法。