2014-02-09 95 views
0

好吧,所以我應該計算,如果我以一定的速度和持續時間以光速行進,需要多少時間。是的,這是作業。我大部分時間都在計算,但是當我輸入40和60的時候,當我得到50時,我得到了0.008305。怎麼回事?沒有從等式中得到正確的答案。此外,無限循環

此外,do while循環無法正常工作。無論我如何回答並忽略cout和cin語句,都會重複執行整段代碼,導致它在評估v1時給我提供錯誤。我該如何解決?

#include <iostream> 
#include <iomanip> 
#include <conio.h> 
#include <cmath> 

const int c = 299792458; 

int main() 
{ 
    int loopCheck = 'y'; 

    do 
    { 
     int tm = 0; 

     std::cout << "Enter time of travel: " << std::endl; 
     std::cin >> tm; 

     if (tm < 0) 
     { 
      do 
      { 
       std::cout << "You have entered an incorrect value. " 
          << "Please enter a value greater than 0." 
          << std::endl; 
       std::cin >> tm; 

      } while (tm < 0); 
     } 

     double v1 = 0; 

     std::cout << "Enter velocity: " << std::endl; 
     std::cin >> v1; 

     if (v1 <= 0 || v1 >= 100) 
     { 
      do 
      { 
       std::cout << "You have entered an incorrect value. " 
         << "Please enter a value between 0 and 100." 
         << std::endl; 
       std::cin >> v1; 

      } while (v1 <= 0 || v1 >= 100); 
     } 

     double v2 = (v1/100) * c; 
     double ts = tm/(sqrt((1 - (v2 * v2))/(c * c))); 

     std::cout << v2 << " " << c << std::endl; 

     std::cout << std::fixed << std::setprecision(6) << ts 
       << std::endl << std::endl; 

     std::cout << "Would you like to enter more data? (y/n)" << std::endl; 
     std::cin >> loopCheck; 
    } while (loopCheck == 'y'); 

    _getch(); 
    return 0; 
} 
+2

gcc給出以下警告:a.cpp:48:52:警告:表達式[-Woverflow]中的整數溢出。它是'double ts = tm ...(c * c)));' –

回答

2

循環重複始終,因爲你輸入一個字符ynloopCheck聲明

int loopCheck = 'y'; 

這意味着,

std::cin >> loopCheck; 

尋找一個整數,但無法找到一。取決於編譯器的版本,loopCheck將保持不變或設置爲零,請參閱`std::basic_istream::operator>>。如果將其更改爲

char loopCheck = 'y'; 

它應該按預期工作。

要解決的整數溢出問題

double ts = tm/(sqrt((1 - (v2 * v2))/(c * c))); 

你可以聲明cdouble,例如

const double c = 299792458; 

更新:

有,式中的附加誤差。你有

sqrt((1 - v2²)/c²) 

它給出了一個負數,因此是錯誤的。卸下括號

sqrt(1 - v2²/c²) 

它轉換爲

double ts = tm/(sqrt(1 - (v2 * v2)/(c * c)); 

給出正確的輸出。

+0

我做了這些修改,他們修復了循環,但是輸出現在說-1。#IND00。那是什麼意思? – Brandon

+0

不是'int loopCheck ='y''評估爲'int loopCheck = 121'嗎? 而char只是一個8位無符號整數。 因此更改爲char不會改變行爲。 – lightandlight

+0

@lightandlight int loopCheck的問題不是'y'轉換爲'121',而是'std :: istream'需要一個整數。請參閱最新的答案。 –

1

你有一些類型強制轉換錯誤:

double v2 = (v1/100.f) * c; 
double ts = tm/(sqrt((1 - (v2 * v2))/(double)(c * c))); 

的無限循環,這是一個其他類型的錯誤:改變INT爲char。

如果使用C++ 11,你可以聲明C作爲:

constexpr int c = 299792458; 
+0

constexpr在const上會做什麼? – codah

1

小心整數除法。如果某個操作首先導致兩個整數相除,則結果將舍入到最接近的整數。因此,例如25/10 * 10會得到20的結果。如果結果將是浮點型或雙精度型,則最好在執行除法之前將該整數轉換爲浮點型或雙精度型,例如25 /編譯器將執行浮點操作,10.0 * 10將會正常。

當中間結果的範圍變得太大時,您也會遇到整數問題。例如,在大多數系統中,由於整數溢出,100000 * 100000/50000不會給您預期的結果。再次,轉換爲浮點數或雙精度值是解決方案。

要調試這些類型的問題,請嘗試逐行逐行瀏覽代碼並確認變量包含您期望的值,或者打印每個操作的結果並與計算器的結果進行比較,以便縮小範圍哪裏出問題了。

0

循環問題:

int loopCheck = 'y'相同int loopCheck = 121,因此while循環將檢查值121使用cin >> loopCheck似乎設置loopCheck爲零。我想這是因爲operator>>算術版本只解析數字,而不是字符轉換成它們的ASCII值,因此輸入非數字返回0

你應該叫loopCheck = cin.get()獲得流中的第一個字符,然後cin.ignore()放棄它後面的換行符。

+0

當您使用C++ 11時,它將'loopCheck'設置爲零。當你擁有C++ 03或更早的版本時,它不會改變'loopCheck'。 –

+0

gnu ++ 03(gnu C++ 98)將其設置爲零。 這就是說,我真的需要改變我的編譯器標誌。 – lightandlight

相關問題