2017-11-04 114 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; 
}