2017-08-27 47 views
-2

我正在試圖製作一個程序,它需要一個循環內的輸入並跟蹤迄今爲止所見最小和最大的一個。 我寫的代碼,但我不知道什麼不對的地方,這是代碼:到目前爲止保持最小和最大的數字

double val = 0; 
    double smaller = 0; 
    double larger = 0; 
    while(cin >> val){ 
     cout << val << '\n'; 
     if(val >= larger){ 
       larger = val; 
       cout << "the larger so far\n"; 
     } 
     else if(val <= smaller){ 
       smaller = val; 
       cout << "the smaller so far\n"; 
     } 
     else 
      cout << "in between\n"; 

,這是輸出;

23 
23 
the larger so far 
1 
1 
WTF 
234 
234 
the larger so far 
23 
23 
WTF 
0 
0 
the smaller so far 
+4

您需要初始化'smaller'。 –

回答

1

您將smaller初始化爲零,但如果您收到的數字大於0但仍是輸入的最小值,則smaller變量將不會更新。

如果所有數字均爲負數(例如,如果輸入爲-1; -3,larger將不會更新),則會出現與larger值相同的問題。

解決這個問題有兩種方法。

  1. 初始化smaller與是保證爲比所有的輸入的和larger較小具有保證爲比所有的輸入的更大的值的值。
  2. 用第一個輸入數字初始化smallerlarger
3
double smaller, larger = 0; 

這是等價的:

double smaller; 
double larger = 0; 

而不是,因爲你可能已經想到:

double smaller = 0; 
double larger = 0; 

這意味着你要離開smaller未初始化的時候你開始使用它,導致未定義的行爲。

+0

這個問題是每行聲明一個變量的好理由。 –

+0

感謝回覆,我編輯它,但仍然是同樣的問題 – kionagi

+0

@kionagi你知道我的水晶球說什麼嗎?你可能將它設置爲0(注意答案沒有提示),而不是任意大的值,最好是'std :: numeric_limits :: max()'。 – HolyBlackCat

0

在這裏,我解決的問題:

double val = 0; 
    double smaller = std::numeric_limits<double>::max(); 
    double larger = std::numeric_limits<double>::min(); 
    while(cin >> val){ 
     cout << val << '\n'; 
     if(val >= larger){ 
       larger = val; 
       cout << "the larger so far\n"; 
     } 
     else if(val <= smaller){ 
       smaller = val; 
       cout << "the smaller so far\n"; 
     } 
     else 
      cout << "in between\n";