验证以下条件的输入

时间:2013-08-18 16:24:35

标签: c++ c floating-point conditional-statements floating-point-precision

我遇到了一个问题,它将float作为输入并检查输入是否介于10和100之间,否则再次输入。问题的其余部分遵循k的值,这很容易解决。但我得到的真正问题是验证。

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

但是当我提交时,它给出了错误的答案,真正的问题是在

      #Input-10.@
      #Input-@

因为对于这个输入,而不是去其他部分,它通过像

这样的输入去了
       #Input-10 

很满意。

任何人都可以给我这个问题的解决方案,其中只满足此范围内的float和integer类型的输入,否则不会。

3 个答案:

答案 0 :(得分:2)

你的比较运算符已经混淆了(似乎只有在获得有效输入而不是无效输入时才会重试)。此外,你只尝试一次,但我怀疑你想继续重试,直到你得到有效的输入。这就是你如何做到的:

#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;
}

答案 1 :(得分:1)

你正在检查你的条件。反转标志,你会很好。像:

if(k<=10.0 || k>=100.0) //if(k<10.0 || k>100.0) If you want to include 10 and 100
    printf("invalid input range");

或简化程序

do
{
    scanf("%f",&k);
}while(k<=10.0 || k>=100.0);

答案 2 :(得分:0)

编辑,保罗指出10.0可能不是一个正确的例子来解释这一点。

你不能不使用==&lt;或者&gt;操作员使用浮动时安全。原因是输入为1.1时的数字在使用非整数类型时不会是1.10000000000000000。因此,定义一个特定的错误阈值delta,它可以是两个最近的浮点数之间的最佳分辨率。 所以,如果你的10是计算值而不是硬编码, float ten = getXX(someinput);假设getXX()根据某些计算返回一些结果 float hundred = getXX(someinput);

然后进行比较,如K&gt; (十三角)&amp;&amp; K&lt; (百名+ DELTA)

我相信这应该足够了。

所以,永远不要在没有小错误修正因子的情况下对浮点数/双打进行关系运算!

以下是展示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;
}