注册 登录
编程论坛 C语言论坛

我遇到了一个if语句问题,请大佬解惑

张仪1997 发布于 2020-03-23 14:13, 2047 次点击
这个代码里的if条件满足了以后有时会执行但有时不会,我检查了好几遍感觉没问题啊。。请问哪位能教教我,图在下面
#include<stdio.h>
int main()
{
const float a[6][10]={{2.59,2.40,2.33,2.21,2.09,2.00,1.88,1.80,1.72,1.61},
                {1.88,1.80,1.73,1.68,1.62,1.59,1.53,1.49,1.44,1.36},
                {1.64,1.59,1.55,1.52,1.48,1.46,1.42,1.38,1.34,1.26},
                {1.49,1.46,1.44,1.42,1.39,1.38,1.34,1.31,1.27,1.20},
                {1.39,1.37,1.35,1.34,1.33,1.31,1.29,1.27,1.22,1.17},
                {1.32,1.31,1.30,1.29,1.27,1.26,1.25,1.23,1.20,1.14}
               };
const float dd[10]={6.0,3.0,2.0,1.50,1.20,1.10,1.05,1.03,1.02,1.01};
const float rd[6]={0.04,0.10,0.15,0.20,0.25,0.30};

float d1=0;
float d2=0;
float r=0;

float c,d;
int i,j;
    int p=0;
    int q=0;

printf("enter:D1,D2,r:");
scanf("%f%f%f", &d1,&d2,&r);

c=d1/d2;
d=r/d2;

for(i=0;i<10;i++)
    {
    if(c==dd[i])
        {
            p=i;
            break;
        }
    else if(i>=10)
        {
            break;
        }
    }
for(j=0;j<6;j++)
    {
    if(d==rd[j])
        {
            q=j;
            break;
        }
    else if(j>=6)
        {
            break;
        }
    }
    if(p==i)
    {
        if(q==j)
            printf("a=%.2f\n",a[q][p]);
        else
            printf("There have no a compared\n");
    }
    else
        printf("There have no a compared\n");
    printf("i=%d\nj=%d\np=%d\nq=%d\nc=%.2f\nd=%.2f\n",i,j,p,q,c,d);
    return 0;
}
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录

大概就是这样,这两个算出来的结果是c和d,然后都在上面的矩阵里,所以我就搞不懂到底错在哪。。有大佬可以帮我看看吗..

[此贴子已经被作者于2020-3-23 14:20编辑过]

10 回复
#2
rjsp2020-03-23 14:21
这个代码里的if条件满足了以后
你的代码中一共有6个if,你说的是哪个if?

scanf("%f%f%f", &d1,&d2,&r);
执行到这一句时,你让别人怎么办?
#3
张仪19972020-03-23 14:22
回复 2楼 rjsp
对不起少打了。。。是for循环里的if,你可以看着图片里的那几个数字打。对不起对不起
#4
张仪19972020-03-23 14:22
回复 楼主 张仪1997
for循环里的if有时会执行有时不会执行
#5
纯蓝之刃2020-03-23 14:35
if(c==dd[i])

浮点数不能用等号比较。
你可以改成
if(c>(dd[i]-0.0001)&&c<(dd[i]+0.0001))
#6
张仪19972020-03-23 14:47
回复 5楼 纯蓝之刃
谢谢大佬!!!终于没问题鸟。我现在去看看为什么会这样
#7
rjsp2020-03-23 14:49
当你输入 3.15 3 0.45 后

d1 = 3.150000095367431640625
d2 = 3.0
r = 0.449999988079071044921875

c = 1.05000007152557373046875
dd[6] = 1.0499999523162841796875

d = 0.14999999105930328369140625
rd[2] = 0.1500000059604644775390625

因为你用的是 浮点数
#8
张仪19972020-03-23 15:01
回复 7楼 rjsp
所以如果我把输入的小数点限制在两位数的话,他就可以出来正确的结果了!我刚刚试了下他确实出来了正确的结果,但是不知道这样有没有其他毛病?
#9
rjsp2020-03-23 15:39
所以如果我把输入的小数点限制在两位数的话,
跟输入没关系,浮点数是 有限个有效二进制位的科学计数法

你把你要的 十进制数 写成 二进制形式,看看有效位是不是超过24位(float),或超过53(double),若超过,则没法还原为原先的数。
对于你这道题目,要想精确相等,那就别用浮点数,用分数;若不要求精确相等,那你设个允许误差就行了。
#10
张仪19972020-03-23 16:13
回复 9楼 rjsp
哦哦哦 原来是这样 谢谢大佬啊
#11
maomao123452020-03-23 19:06
我建议将大括号打在if语句括号的后面,这样不会看花眼
1