【问题标题】:Validate input for the following condition验证以下条件的输入
【发布时间】:2013-08-20 12:10:30
【问题描述】:

我遇到了一个将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 

很满意。

谁能给我这个问题的解决方案,这个范围内的浮点和整数类型的输入只满足,否则不满足。

【问题讨论】:

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


    【解决方案1】:

    已编辑,正如 Paul 指出的那样,10.0 可能不是解释这一点的正确示例。

    在使用浮点数时,您不能不安全地使用 == 运算符。原因是输入为 1.1 的数字在使用非整数类型时不会是 1.10000000000000000。因此,定义一定的误差阈值增量,它可以是两个最近的浮点数之间的最佳分辨率。 因此,如果您的 10 是计算值而不是硬编码, 浮动十=getXX(一些输入);假设 getXX() 根据一些计算返回一些结果 浮动百=getXX(someinput);

    然后像 K > (ten-delta) && K

    我相信这应该足够了。

    所以,千万不要在没有小的纠错系数的情况下对浮点数/双精度数进行关系运算!

    这是一个sn-p来演示它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;
    }
    

    【讨论】:

    • 您所说的某些内容在很多时候都是正确的,但是有很多数字可以精确地表示为浮点数,10 就是其中之一。
    • 好吧,我想说的是,它使代码更可靠。在浮动和喜欢的情况下使用 == 进行比较可能很危险!
    • 我不会说代码因为故意引入不必要的错误而变得“更可靠”。最好在需要时处理实际问题,而不是仅仅害怕浮点并做这样的左右和中心的事情。
    • 保罗,我希望你现在快乐 :)
    【解决方案2】:

    您正在反过来检查您的条件。反转标志,你会很好。喜欢:

    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);
    

    【讨论】:

    • C 标准要求所有浮点数都可以表示为双精度数,即使浮点系统不是 IEEE 754。所以只要 10 和 100 可以表示,k&lt;10.0f &amp;&amp; k&gt;100.0fk&lt;10.0 &amp;&amp; k&gt;100.0 就等价完全一样的浮动。这几乎适用于任何提供浮点的 C 编译器。
    • @EricPostpischil ; 是一个错字。并感谢您的意见。更正了。
    • a && b 的否定是 (!a) || (!b),请使用 ||否则您的条件将永远是错误的。
    • 你能告诉我这是如何工作的吗?你想让我把我之前的 else 查询放在这个 if 中还是把我的 if 部分放在这个里面。如果我在其中加入 if 部分,那么它将无法正常工作,因为我需要在 10 和 100 之间
    【解决方案3】:

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

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

    【讨论】:

    • void main() 是无效的 C++,由于您尚未定义 k,因此无法编译。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2020-03-11
    • 2023-03-10
    相关资源
    最近更新 更多