2017-03-30 10 views
0

私は、ユーザー定義の配列の中央値を返すプログラムを書いています。私はコード内にいくつかの小切手を入れましたが(配列のサイズは負にすることはできません)、私は単純に修正できない1つの問題にぶち当たっています(文字列とアルファベット文字は使用されません)。浮動小数点コードを壊す

私の入力値はすべて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型と比較して正しい値であることを確認しましたが、それも同様に間違っていました。

は、私は数が nに保存された直後 int(n)よう intキャスト、何かをやってみましたが、それは再びまだ a[n]とに行く前、それはまだ私のコードを破りました。

floatユーザー入力を確認し、intと表示されるまでそれらをループするにはどうすればよいですか?

答えて

3

あなたはintに読んでいる:

int x; 
... 
cin >> x; 

だから、それはそれは、その後、例えばで停止することができるもの読み込みます.を入力し、残りをストリームに残します(ユーザーが「123.4」と入力すると123が表示され、「.4」は入力ストリームから消費されません)。

代わりに、フロートに読むことができる:

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'をうまく食べるでしょう。 –

関連する問題