2014-09-29 411 views
3

當我運行這個程序的課程時,每當我輸入一個'|'符號時,我都會陷入無限循環中。字符結束while循環。我覺得我失去了一些明顯的東西。陷入無限循環

這個問題在Bjarne Stroustrup的C++編程書籍的第126頁找到,但作爲一個快速簡要介紹,我只是應該找到用戶輸入的最大和最小數字,並在其上返回信息。輸入'|'應該退出循環,以便我可以回到提供有關所有輸入數字信息的部分,但每當輸入該字符(或任何不是數字的字符)時,它就會創建一個無限循環。

這是我的代碼。

int main() 
{ 
    vector<double> nums; 

    while (true) 
    { 
     double current_num; 
     cout << "enter a double \n"; 
     cin >> current_num; 
     if (current_num == '|') 
      break; 
     nums.push_back(current_num); 
     sort(nums.begin(), nums.end()); 
     cout << nums[nums.size()-1] << " is the largest so far.\n"; 
     cout << nums[0] << " is the smallest so far.\n"; 
    } 
    cout << nums[nums.size()-1] << " is the largest number.\n"; 
    cout << nums[0] << " is the smallest number.\n"; 
    cout << "Number of values entered: " << nums.size() << '\n'; 
    double sum = 0; 
    for (int k = 0; k<nums.size(); ++k) 
     sum += nums[0]; 
    cout << "Sum of all values: " << sum << '\n'; 
    for (int j=0; j<nums.size(); ++j) 
     cout << nums[j] << ' '; 
    return 0; 
} 

我在課堂上使用VS13,我是沒有這個問題,但我現在的編碼在記事本+ +和使用膩子在家裏編譯(雖然我懷疑這有什麼用它做)。

+2

'「|」'是不是一個'double',是嗎? – 2014-09-29 04:02:26

+0

爲什麼你將數字存儲在數組中並對它們進行排序?只是保持運行值 – 2014-09-29 04:06:43

回答

6

您有double這裏比較的字符進行比較:

if (current_num == '|') 

而且這種比較永遠不會做你想做的事情。

先讀一個字符,將其與'|'進行比較,然後根據需要進行雙重轉換。


注:

爲您記錄'|'的ASCII值是124,因此,如果您輸入124你的循環將結束......

+0

問題不在於(僅)比較,而是插入到double中的字符串值。比較不會創建無限循環。插入的確如此。 – atlanteh 2014-09-29 04:07:27

2

你正在比較一個字符的數字。

if (current_num == '|') 

current_num包含類型的數量加倍,你試圖用一個char是'|'

+0

爲什麼這個答案downvoted?這是正確的。它與quantdev的答案大致同時給出,大致相同,但quantdev現在是+4,而這個是-1。 – FreeNickname 2014-09-29 04:13:06

+0

我有一些錯誤,我糾正他們:) – 2014-09-29 04:14:07

+0

可能由原來不是那麼確切,但它已經是正確的。即使有人認爲它不值得讚賞,但我不認爲任何人會因此而失望。這就是我很驚訝的原因。很好的暱稱,順便說一句:) – FreeNickname 2014-09-29 04:28:48

2

因爲你試圖插入非數字變成雙。 在你的情況下,你應該將輸入讀入字符串/字符並解析它。

2

問題是在這裏:

if(current_num == '|'){ 
} 

相反讀入std::string和其解析爲雙。

因此,修改後的片段會是這個樣子:

while (true) 
    { 
     string strNum; 
     double current_num; 
     cout << "enter a double \n"; 
     cin >> strNum; 
     if (strNum == "|") 
      break; 
     istringstream strm(strNum); 
     strm >> current_num; 
     nums.push_back(current_num); 
     sort(nums.begin(), nums.end()); 
     cout << nums[nums.size()-1] << " is the largest so far.\n"; 
     cout << nums[0] << " is the smallest so far.\n"; 
    }