判断是否为三角形并计算面积

u3t9:
编写一个程序,输入3个实数,判断这些值能否作为一个三角形的三条边的长,如果能够成三角形,要求输出三角形的面积。
我写的代码如下:

#include <stdio.h>
#include<math.h>
int main()
{
    double a,b,c,s;//这里用了double,后文中我做了改动
    printf("请输入三边长:\n");
    scanf("%f%f%f",&a,&b,&c);
    if((a+b>c)&&(a+c>b)&&(b+c>a))
        {
            s=sqrt((a+b+c)*(a+b-c)*(a-b+c)*(b+c-a)/16.0);
            printf("可以。面积为:%f",s);
        }
    else printf("不可以。");
    return 0;
}

用3 4 5检验得到结果却是“不能”
在这里插入图片描述
但是如果把上面的double换成float,得到的结果就是对的了

#include <stdio.h>
#include<math.h>
int main()
{
    float a,b,c,s;//这里我把double换成了float!!!
    printf("请输入三边长:\n");
    scanf("%f%f%f",&a,&b,&c);
    if((a+b>c)&&(a+c>b)&&(b+c>a))
        {
            s=sqrt((a+b+c)*(a+b-c)*(a-b+c)*(b+c-a)/16.0);
            printf("可以。面积为:%f",s);
        }
    else printf("不可以。");
    return 0;
}

在这里插入图片描述
或者,如果我把上面的%f变成%lf,答案也是对的,如下

 double a,b,c,s;//这里仍然用double
    printf("请输入三边长:\n");
    scanf("%lf%lf%lf",&a,&b,&c);//这里把f改成了lf!

为什么会这样?

----------------------------------------分界线----------------------------------------------------------

类似的题:编写程序,输入3对实数,若每对实数分别作为平面坐标系中点的坐标,判断这3个点是否能构成一个三角形。若能构成三角形,判断这个三角形的特征:是直角三角形、等边三角形、等腰三角形还是普通三角形等。
我写的代码如下:

#include <stdio.h>
#include<math.h>

int main()
{
    double x1,y1,x2,y2,x3,y3,l12,l23,l13;
    int sign=1;
    printf("请输入第一个点的x,y:\n");
    **scanf("%lf%lf",&x1,&y1);**
    printf("请输入第二个点的x,y:\n");
    **scanf("%lf%lf",&x2,&y2);**
    printf("请输入第三个点的x,y:\n");
    **scanf("%lf%lf",&x3,&y3);**
    l12=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    l13=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3));
    l23=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
    if(l12+l23>l13&&l23+l13>l12&&l12+l13>l23)
    {
        printf("可以。\n");
        if(l12*l12+l23*l23==l13||l23*l23+l13*l13==l12*l12||l12*l12+l13*l13==l23*l23)
            {printf("而且是直角三角形。\n");sign=0;}
        if(l12==l23==l13)
            {printf("而且是等边三角形。\n");sign=0;}
        else if(l12==l23==l13)
            {printf("而且是等腰三角形。\n");sign=0;}
        if(sign==1)
        printf("是普通三角形。\n");
    }
    else printf("不能。"\n);
    return 0;
}

结果是正确的。
但是如果把%lf改成%f,即从原来的:

 printf("请输入第一个点的x,y:\n");
    **scanf("%lf%lf",&x1,&y1);**
    printf("请输入第二个点的x,y:\n");
    **scanf("%lf%lf",&x2,&y2);**
    printf("请输入第三个点的x,y:\n");
    **scanf("%lf%lf",&x3,&y3);**

变成:

 printf("请输入第一个点的x,y:\n");
    **scanf("%f%f",&x1,&y1);**
    printf("请输入第二个点的x,y:\n");
    **scanf("%f%f",&x2,&y2);**
    printf("请输入第三个点的x,y:\n");
    **scanf("%f%f",&x3,&y3);**

用345直角三角形检验却是“不能构成三角形”,如下:

在这里插入图片描述
于是在输出“不能”的那行加了一行命令来输出三边长:

else printf("不能。l12=%f,l23=%f,l13=%f\n",&l12,&l23,&l13);

(或者上面的%f应该写成%lf吗?我不知道TuT)//不要这么做!
结果如下:
在这里插入图片描述
在这里插入图片描述


已解决:对printf()来说不管是float还是double都用%f;对scanf()来说float用%f,double用%lf (っ•̀ω•́)っ✎⁾⁾

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值