2.8、一些乱七八糟的补充

By | 2015年2月6日

代码是描述编程最好的语言,让我们从一段代码开始!

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

/***************************************
*输入三角形的三条边,输出三角形的面积*
*其中用到了海伦公式                   *
*三角形的面积s=√p(p-a)(p-b)(p-c)      *
*其中p为三角形周长的一半              *
*abc为三条边的长度                    *
***************************************/
int main()
{
    double a, b, c;     //三角形的三条边的长度
    double p;           //三角形周长的一半
    double area;        //三角形的面积

    printf("请输入三角形的三个边长,一次输入一个,或用空格隔开\n");
    scanf("%lf %lf %lf", &a, &b, &c);
    p = (a + b + c) / 2;        //计算周长的一半
    area = sqrt(p * (p - a) * (p - b) * (p - c));   //计算面积
    printf("%.3f\n", area);
    return 0;
}

程序的注释里写的很清楚,这个程序可以用来计算三角形的面积

和我们之前学习的程序不同的是,代码第二行多了个#include <math.h>

math.h就是数学库啦,常用的数学函数都在里面,因为程序中用到了计算平方根的函数sqrt(),所以我们需要“包含”这个文件。数学函数将在稍后进行详细介绍

第13-15行定义了一些变量,变量的用途都在注释中给出了。

17行的printf 告诉了用户如何输入数据。

18行的scanf中,多个占位符之间使用空格隔开,这样做的好处是用户可以选择使用空格隔开多个数据一次输入,或者分三次,每次输入一个数据。

第19行就不用说了(如果你看不明白的话,请退回到第二章第一节重新学习相关内容)

20行中出现了一个新的函数sqrt(),前面介绍到它是一个计算平方根的函数

要开方的数作为参数,执行后它将返回平方根。这里也就是我们的面积啦!

下面的printf将它显示了出来。%f的形式我想大家已经比较熟悉了,所以这里故意使用了%.3f这种写法。

中间小数点后的数字指定了数据显示的长度。.3就代表显示小数点后三位(四舍五入),同理.2就是显示小数点后2位。如果直接使用%f的话,会输出默认的位数(6位)

实际上这个程序中还有BUG(漏洞),想想是什么?

没有想出来?没关系,我们运行程序来测试一下,我们输入这样几个数:

1 5 10

回车后显示什么?

对,我们程序中没有对输入数据的有效性进行判断,程序只是一股脑的将用户输入的数据拿来,进行计算然后输出。根本没有考虑到用户输入的数据是否有效,能否构成一个三角形。

要判断用户的输入是否有效,就需要使用到“分支语句”的相关知识,因此我们将在后面对这个程序进行改进!


如果你完成了上一节最后布置的小程序的话,就到了公布答案的时候了

要求是输入两个浮点数并输出他们的和,代码如下

#include <stdio.h>

int main(void)
{
    double a, b;
    scanf("%lf %lf", &a, &b);
    printf("%f", a + b);
    return 0;
}

就是这样,或许你使用的是float,也或许你将scanf拆开为两个写

这些都是正确的答案,需要注意的是scanf后面的变量名前需要加上取址符&

新手还会经常漏掉分号,这没有什么,我在刚刚学的时候也会漏掉分号,大家都会这样。写多了后你应该会养成习惯、“自动”的加上分号

最后需要说一下的是,关于使用double还是float的问题,有些人会很纠结,到底是用double还是float,这没有什么好纠结的,用double就行了。

  1. double比float精度更高,即得到的数据更准确
  2. 尽管double占用的空间是float的一倍,但是和现在动辄几G的内存相比,简直就是九牛一毛,要知道c语言已经有几十年的历史了,在开发之初硬件资源是比较紧张的,所以才有了double和float之分。但是科技在进步,我们用不着挖空心思的去想如何省那么几B的内存了
  3. double比float更快

有的人可能不同意第三点(我之前也不同意),因为double是8字节,理论上应该比4字节的float慢

但是事实与此相反,我的一位网友使用double和float进行几万次相同的运算,统计时间后发现,double和float差比并不大,而且double似乎还比float快一些!

所以读者们,大胆的使用double吧!

发表评论

邮箱地址不会被公开。 必填项已用*标注