私は、ユーザー定義の配列の中央値を返すプログラムを書いています。私はコード内にいくつかの小切手を入れましたが(配列のサイズは負にすることはできません)、私は単純に修正できない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
と表示されるまでそれらをループするにはどうすればよいですか?
これは素晴らしいアイデアです(と私はこの状況で使用します)ので、浮動小数点値でintを読み取ることは不可能だと言っていますか?あるいは、この簡単な修正を考えれば、解決策はそれを回避するだろうか? – Podo
うわー!問題が見つかりました。ユーザーは配列のサイズの浮動小数点値を入力することができます。それはコードを破る:/他の考え? – Podo
@JeffreyDilley「浮動小数点値を入力する」という行に沿って考えるのを止めれば、混乱することはありません。フロートを入力していません。あなたは一連の文字を入力しています。 float/int /などは、それが解析されるまでは何もありません。したがって、 '3'、' '、' 1'、 '4'を入力して' int'として解析すると '3'が得られるので、それが涼しいわけではないのでそこに止まって、そこに川が残っています。一方、 'float'として解析すると、' .'、 '1'、' 4'をうまく食べるでしょう。 –