代码是描述编程最好的语言,让我们从一段代码开始!
#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就行了。
- double比float精度更高,即得到的数据更准确
- 尽管double占用的空间是float的一倍,但是和现在动辄几G的内存相比,简直就是九牛一毛,要知道c语言已经有几十年的历史了,在开发之初硬件资源是比较紧张的,所以才有了double和float之分。但是科技在进步,我们用不着挖空心思的去想如何省那么几B的内存了
- double比float更快
有的人可能不同意第三点(我之前也不同意),因为double是8字节,理论上应该比4字节的float慢
但是事实与此相反,我的一位网友使用double和float进行几万次相同的运算,统计时间后发现,double和float差比并不大,而且double似乎还比float快一些!
所以读者们,大胆的使用double吧!