我遇到了一个问题,它将float作为输入,并检查输入是否在10到100之间,否则再次输入。剩下的问题遵循这个k的值,这很容易解决。但我遇到的真正问题是验证。
scanf("%f",&k);
if(k>10.0 && k<100.0)
scanf("%f",&k);
else
{
......//my code
}但是当我提交的时候,它给出了错误的答案真正的问题在
#Input-10.@
#Input-@因为对于此输入,它不是转到else part,而是转到if part,而不是像这样的输入
#Input-10 是满意的。
谁能给我这个问题的解决方案,在这个范围内的浮点数和整数类型的输入只满足,否则不满足。
发布于 2013-08-19 00:47:37
您混淆了比较运算符(似乎只有在获得有效输入时才重试,而不是无效输入)。此外,您只需重试一次,但我怀疑您希望不断重试,直到得到有效的输入。你可以这样做:
#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-19 00:44:56
你正在以另一种方式检查你的状况。颠倒这些标志,你就会变得很好。像这样:
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);发布于 2013-08-19 03:33:16
编辑,正如Paul指出的,10.0可能不是一个正确的例子来解释这一点。
在使用float时,不能安全地使用== <或>运算符。原因是,当输入为1.1时,当使用非整数类型时,数字不会是1.10000000000000000。因此,定义一个特定的误差阈值Δ,它可以是两个最近浮点数之间的最好分辨率。因此,如果您的10是一个计算值,而不是硬编码的浮点型ten=getXX(某些输入);假设getXX()根据某些计算返回一些结果,浮点型hundred=getXX(某些输入);
然后进行比较,如K>(10-增量) && K< (hundred+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;
}https://stackoverflow.com/questions/18301220
复制相似问题