秦九域 发表于 2019-10-30 08:34:04

各位大佬,我想问一下为什么这个函数用sqrt表根号会显示错误呢。(s算的是三角形面...

#include <stdio.h>
#include <math.h>
int main()
{    int a,b,c,p,s;
         a=3;
               b=4;
               c=5;


p=(1.0/2)*(a+b+c);

s=sqrt(p*(p-a)*(p-b)*(p-c));

printf("a=%d,b=&d,c=%d,p=%d,s=%d",a,b,c,p,s);

}

yuweb 发表于 2019-10-30 08:56:22

本帖最后由 yuweb 于 2019-10-30 09:00 编辑

1、p,s用double存储,除非你能保证p=(a+b+c)/2;始终是整除才用int
2、int main()添加return 0;防止警告
3、printf("a=%d,b=&d,c=%d,p=%d,s=%d \n",a,b,c,p,s);中b=&d错了,应该是b=%d
改成printf("a=%d,b=%d,c=%d,p=%lf,s=%lf \n",a,b,c,p,s);

#include <stdio.h>
#include <math.h>
int main()
{
        int a,b,c;
        double p,s;
        a=3;
        b=4;
        c=5;
       
       
        p=(a+b+c)/2;
       
        s=sqrt(p*(p-a)*(p-b)*(p-c));
       
        printf("a=%d,b=%d,c=%d,p=%lf,s=%lf \n",a,b,c,p,s);
       
        return 0;
}

bin554385863 发表于 2019-10-30 08:56:49

本帖最后由 bin554385863 于 2019-10-30 09:06 编辑

楼上说的没错,
眼花了233

yuweb 发表于 2019-10-30 09:01:07

bin554385863 发表于 2019-10-30 08:56
你试图对一个负数在实数域内开平方,你是存心刁难编译器么→_→
p=4 c=5
p-c=-1

p=6

秦九域 发表于 2019-10-30 09:04:23

yuweb 发表于 2019-10-30 08:56
1、p,s用double存储,除非你能保证p=(a+b+c)/2;始终是整除才用int
2、int main()添加return 0;防止警告
3 ...

会啦会啦,谢谢大哥!!!

秦九域 发表于 2019-10-30 09:05:13

bin554385863 发表于 2019-10-30 08:56
你试图对一个负数在实数域内开平方,你是存心刁难编译器么→_→
p=4 c=5
p-c=-1

发现问题啦,谢谢哥

bin554385863 发表于 2019-10-30 09:05:59

yuweb 发表于 2019-10-30 09:01
p=6

晕,看错了(⊙o⊙)

秦九域 发表于 2019-10-30 09:15:50

秦九域 发表于 2019-10-30 09:04
会啦会啦,谢谢大哥!!!

我还想问一下%d和%f和%lf的是用场合分别是什么呀?

bin554385863 发表于 2019-10-30 10:58:44

秦九域 发表于 2019-10-30 09:15
我还想问一下%d和%f和%lf的是用场合分别是什么呀?

%d对应int
%f对应float
%lf对应double
%ld对应long
%lld对应long long

yuweb 发表于 2019-10-30 11:55:54

1、%d用于int
2、关于%f和%lf
%f和%lf在printf中使用没有区别,因为当printf函数当遇到float类型时会自动转化为double
在scanf中double应该用%lf,而float用%f,这个不能随便写,否则会出错的

秦九域 发表于 2019-11-11 23:38:09

yuweb 发表于 2019-10-30 11:55
1、%d用于int
2、关于%f和%lf
%f和%lf在printf中使用没有区别,因为当printf函数当遇到float类型时会自动 ...

好的好的,谢谢啦!
页: [1]
查看完整版本: 各位大佬,我想问一下为什么这个函数用sqrt表根号会显示错误呢。(s算的是三角形面...