0

float入力として受け取り、入力が10から100の間にあるかどうかを確認する質問に出くわしました。そうでない場合は、もう一度入力します。問題の残りの部分は、簡単に解決できるこの k の値に従いました。しかし、私が得た本当の問題は検証でした。

   scanf("%f",&k);   
   if(k>10.0 && k<100.0)
   scanf("%f",&k);
   else
   {
   ......//my code
   }

しかし、私が提出したとき、それは間違った答えを出しました。本当の問題は

      #Input-10.@
      #Input-@

この入力は、else部分ではなく、if部分に行ったのですが、

       #Input-10 

満足しました。

この範囲内の浮動小数点型と整数型の入力のみが満たされるというこの問題の解決策を誰かに教えてもらえますか。

4

3 に答える 3

2

比較演算子が混同されています (無効な入力ではなく、有効な入力を取得した場合にのみ再試行しているようです)。また、再試行は 1 回だけですが、有効な入力が得られるまで再試行を続けたいと思われます。これを行う方法は次のとおりです。

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
  double k;
  do{
    cin>>k;
  }while(k<=10||k>=100);

  //the rest of your code goes here
  return 0;
}
于 2013-08-18T16:47:36.660 に答える
0

Paul が指摘したように、10.0 はこれを説明する正しい例ではない可能性があります。

float を使用する場合、== < または > 演算子を安全に使用することはできません。その理由は、1.1 として入力された数値は、非整数型を使用すると 1.10000000000000000 にならないからです。したがって、特定のエラーしきい値デルタを定義します。これは、最も近い 2 つのフロート間の最も細かい解像度になる可能性があります。したがって、10 がハードコーディングされた値ではなく計算された値である場合、float ten=getXX(someinput); getXX() がいくつかの計算に基づいて何らかの結果を返すとします。

次に、K > (10 デルタ) && K < (100+デルタ) のような比較を行います。

これで十分だと思います。

したがって、小さなエラー修正係数なしで、float/double に対してリレーション演算を実行しないでください。

これを示すスニペットを次に示しますhttp://ideone.com/dxS9OI

#include <stdio.h>

int main(void) {

    float eleven=11.0;
    float one_dot_1=1.1;
    float elevenUsingSummation = 0;
    int i=0;
    for(i=0; i<10; i++)
    {
        elevenUsingSummation+=one_dot_1;
    }
    printf("------------------------------\n"
        "Floating point testing example \n"
    "one_dot_1(2.10)=%2.10f, one_dot_1(2.20)=%2.20f\n"
    "eleven(2.10)=%2.10f, eleven(2.20)=%2.20f\n"
    "elevenusingsubmission(2.10)=%2.10f, elevenusingsubmission(2.20)=%2.20f\n"
    "(elevenUsingSummation==eleven) evaluates to %s\n",
    one_dot_1, one_dot_1, eleven, eleven, elevenUsingSummation, elevenUsingSummation,
    elevenUsingSummation==eleven?"True":"False"
    );

    return 0;
}
于 2013-08-18T19:33:16.047 に答える