标题:我遇到了一个if语句问题,请大佬解惑
只看楼主
张仪1997
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2020-3-23
结帖率:50%
已结贴  问题点数:20 回复次数:10 
我遇到了一个if语句问题,请大佬解惑
这个代码里的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编辑过]

搜索更多相关主题的帖子: float break printf int if 
2020-03-23 14:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
这个代码里的if条件满足了以后
你的代码中一共有6个if,你说的是哪个if?

scanf("%f%f%f", &d1,&d2,&r);
执行到这一句时,你让别人怎么办?
2020-03-23 14:21
张仪1997
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2020-3-23
得分:0 
回复 2楼 rjsp
对不起少打了。。。是for循环里的if,你可以看着图片里的那几个数字打。对不起对不起
2020-03-23 14:22
张仪1997
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2020-3-23
得分:0 
回复 楼主 张仪1997
for循环里的if有时会执行有时不会执行
2020-03-23 14:22
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:10 
if(c==dd[i])

浮点数不能用等号比较。
你可以改成
if(c>(dd[i]-0.0001)&&c<(dd[i]+0.0001))
收到的鲜花
  • lin51616782020-03-23 14:55 送鲜花  5朵  
  • 张仪19972020-03-23 15:05 送鲜花  1朵  

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-03-23 14:35
张仪1997
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2020-3-23
得分:0 
回复 5楼 纯蓝之刃
谢谢大佬!!!终于没问题鸟。我现在去看看为什么会这样
2020-03-23 14:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
当你输入 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

因为你用的是 浮点数
2020-03-23 14:49
张仪1997
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2020-3-23
得分:0 
回复 7楼 rjsp
所以如果我把输入的小数点限制在两位数的话,他就可以出来正确的结果了!我刚刚试了下他确实出来了正确的结果,但是不知道这样有没有其他毛病?
2020-03-23 15:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
所以如果我把输入的小数点限制在两位数的话,
跟输入没关系,浮点数是 有限个有效二进制位的科学计数法

你把你要的 十进制数 写成 二进制形式,看看有效位是不是超过24位(float),或超过53(double),若超过,则没法还原为原先的数。
对于你这道题目,要想精确相等,那就别用浮点数,用分数;若不要求精确相等,那你设个允许误差就行了。
2020-03-23 15:39
张仪1997
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2020-3-23
得分:0 
回复 9楼 rjsp
哦哦哦 原来是这样 谢谢大佬啊
2020-03-23 16:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-500531-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022487 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved