2017-03-30 41 views
0

我寫了一個程序,返回用戶定義數組的中值。雖然我在代碼中放了一些檢查(數組大小不能爲負數),但我仍然遇到了一個我無法修復的問題(爲了清楚起見,假定不使用字符串和字母字符)。浮動破壞我的代碼

我的所有輸入值都是int但是用戶可以輕鬆地輸入浮點數。當他們這樣做(無論是數組大小還是輸入元素)都會破壞我的代碼。我已經嘗試了多種方法來試圖捕獲這個問題,但是看起來我的程序獲得的價值不能及時捕獲。

#include <iostream> 
using namespace std; 

void sort(int * a,int n) 
{ 
    for(int i=0;i<n;++i) 
     for(int j=i+1;j<n;++j) 
     { 
      if(a[i]>a[j]) 
      { 
       int tmp = a[i]; 
       a[i] = a[j]; 
       a[j] = tmp; 
      }\ 
     } 
    return; 
} 

int main() 
{ 
    int n; 
    int check; 
    int x; 
    cout<<"Enter length of array:"; 
    cin>>n; 
    if (n < 0){ 
     while (n < 0){ 
     cout << "Please enter a length greater than 0" << endl; 
     cin >> n; 
     } 
    } else if (n % 1 != 0){ 
     while (n % 1 != 0){ 
      cout << "Whole numbers only! Try again" << endl; 
      cin >> n; 
     } 
    } 
    if (n == 0){ 
     cout <<"You try to enter numbers, but there's no place to put them." << endl; 
     cout << ":("; 
     return 0; 
    } 
    int a[n]; 
    cout<<"Enter values one by one:\n"; 
    for(int i=0;i<n;++i){ 
     cin >> x; 
     a[i] = int(x); 
    } 
    sort(a,n); 
    if (n % 2 == 1){ 
    cout<<"Median is:"<<a[n/2]<<endl; 
    } 
    else{ 
    float z = (float(a[n/2]) + float(a[(n/2)-1]))/2; 
    cout << "Median is:" << z << endl; 
    } 




    return 0; 
} 

我想第一件事情是抓住浮像這樣

`if (n % 1 !=0){ 
    while(n % 1 !=0){ 
     cout << "Enter a whole number" 
     cin >> n 
    } 
}` 

這仍然打破了我的計劃。奇怪的是我輸入了float,然後打印出n的值,它只顯示int值。

我嘗試使用typeid.n()#include <typeinfo>並將其與int類型進行比較以檢查它是否是正確的值,但是也滑過了。

我試圖做一個int投,像int(n)後立即號碼存儲在n但在此之前它進入a[n]並再次,它仍然打破了我的代碼。

我如何檢查float用戶輸入並循環它們,直到他們給我一個int

回答

3

你正在閱讀到int

int x; 
... 
cin >> x; 

所以它會讀什麼可以,然後停在如一個.並留下其餘的流(如果用戶輸入「123.4」,你會得到123,然後「.4」不會從輸入流中消耗)。

相反,你可以讀入一個float:

float x; 
... 
cin >> x; 

並做相應的數學。

或者你可以讀入一個字符串,並將其解析爲一個浮點數。這樣你就不會卡在信件等等。

而最後的選項是讀入int,但處理任何錯誤並跳過錯誤的輸入,這在How to handle wrong data type input詳細,所以我不會在這裏重現它。

你選擇哪一個選項真的取決於你希望程序的行爲是什麼以及你想要驗證輸入的嚴格程度(例如,如果輸入「2.5」,但是整數是預期的,則舍入與失敗,怎麼做你想處理「xyz」作爲輸入,等等)。

+0

這是一個奇妙的想法(和一個我會在這種情況下使用),所以你說這是不可能的讀入一個浮點數值的int?或者考慮到這個簡單的解決方案,解決方案可以避免長而毫無意義。 – Podo

+0

哦!發現問題。用戶仍然可以輸入數組大小的浮點值。這打破了代碼:/任何其他想法? – Podo

+0

@JeffreyDilley如果你停止思考「輸入浮動值」的話,我認爲事情會變得更加混亂。你沒有輸入一個浮點數。您正在輸入一系列字符。除非像這樣解析,否則什麼都不是float/int /等等。所以如果你輸入'3','.','1','4',但是嘗試把它解析爲一個'int',你會得到'3',因爲這很酷,那麼你會碰到'然後在那裏停下來,因爲那不是很酷,那麼這個流就停留在那裏。另一方面,如果你嘗試將它解析爲'float',它會吃掉'.','1','4'就好了。 –