2017-11-04 77 views
0

我试图编写一个程序,它可以通过角度来运行弹射器可以从0-90拍摄的距离,并计算每个导致的距离。当角度比最后一个距离更远时,它应该取代一个名为“bestAngle”的变量中的上一个角度。这是我到目前为止有:如何替换C++循环中的旧值?

#include <iostream> 
#include <cmath> 

using namespace std; 

int main(){ 
    double g = 9.8; 
    double v,a,d,bestAngle; 

    for(a=0; a<=90; ++a){ 
     double rad = a*3.14159/180; 
     if(a<=30){ 
      v=45; 
     }else if(a>30 && a<=60){ 
      v = 40; 
     }else{ 
      v=30; 
     } 

     d = pow(v,2)*sin(2*rad)/g; 
     double bestAngle = 0; 
     double bestAngleRad = bestAngle*3.14159/180; 
     if(d>pow(v,2)*sin(a*bestAngleRad)/g){ 
      bestAngle = a; 
      bestAngleRad = bestAngle*3.14159/180; 
     } 
    } 

    cout << bestAngle << endl; 
} 

我认为这个问题有什么做的最后一个if语句,我认为最好的角度是没有更新。我不希望任何人告诉我该怎么做,但如果有人能指出我错误的位置会有所帮助。

+3

不要在这里发布代码的图片。 – rsp

+4

您有两个名为'bestAngle'的变量。这会让你感到困惑。 –

+0

请给我们一些格式正常的文本格式代码 – Valentin

回答

1

bestAngle没有更新,因为您的外部bestAngle被重新定义的bestAngle所取代,范围在您的for循环中。一旦你退出循环,内部bestAngle超出范围,你回到你的外部bestAngle,它没有改变。重命名你的内部变量,也许使用二分法,因为最大限度地寻找函数是非常无效的。

+0

搜索词:“变量阴影” – user4581301

1

您至少有两个问题

首先是变量bestAngle被定义了两次,这是合法的,但不是很好,在你情况下,第二阴影第一,然后bestAngle的设置是指第二bestAngle在循环的每次迭代中超出范围。当它超出范围时,它被销毁并且新的bestAngle丢失。

第二个问题是,bestAngleRad在循环中定义,然后超出范围,如果您有任何进一步使用它将丢失。

而第三个小细节,则重新计算bestAngleRad的值。

#include <iostream> 
#include <cmath> 

using namespace std; 

int main(){ 
    double bestAngle = 0.0; // (1a first) 

    for(a=0; a<=90; ++a){ 
     double bestAngle = 0; // (1b second) 
     double bestAngleRad = bestAngle*3.14159/180; // (2a) 
     if(d>pow(v,2)*sin(a*bestAngleRad)/g){ 
      bestAngle = a; 
      bestAngleRad = bestAngle*3.14159/180; // (3) 
     } 
     // (1c, 2b second out of scope) 
    } 

    cout << bestAngle << endl; 
} 

我想你打算(注码是未经测试)

#include <iostream> 
#include <cmath> 

using namespace std; 

int main(){ 
    double g = 9.8; 
    double v,a,d; // bad variable names 
    double bestAngle = 0,bestAngleRad = 0.0; // good variable names 

    for(a=0; a<=90; ++a){ 
     double rad = a*3.14159/180; // rad calculated only once 
     if(a<=30){ 
      v=45; 
     }else if(a>30 && a<=60){ 
      v = 40; 
     }else{ 
      v=30; 
     } 

     d = pow(v,2)*sin(2*rad)/g; 
     if(d>pow(v,2)*sin(a*rad)/g){ 
      bestAngle = a; 
      bestAngleRad = rad; 
     } 
    } 

    cout << bestAngle << endl; 
}