6.12 使用库函数
所谓库函数是指随编译器一起发行的一些已经编译好的以库文件形式存在的函数。拥有编译器的同时也拥有了库函数,就如同买了汽车也同时拥有了车轮一样。
标准库函数是C语言标准规定的C语言编译器必须提供的一系列函数,这些函数大体上分为处理字符和字符串、输入与输出、数学计算、时间与日期、动态存储等几个方面。
使用库函数之前同样首先需要对所要使用的函数的函数名这个标识符作出说明性的描述,即写函数原型。这些函数的函数原型分别写在若干个以“.h”为文件扩展名的文件中,所以只要在代码中增加一行编译预处理命令#include<相应的头文件>就可以达到这个目的。
有些编译器对个别标准库函数不要求必须写函数原型(比如对printf(),有的编译器就可以不写函数原型),这样的确可以使写代码变得稍微省事一点,然而在另一方面却抑制了一种良好、严谨的编程习惯的养成。为每一个标识符说明其含义应该是代码书写者的一个本能。
通常编译器提供的库函数都多于C语言标准的要求,使用时应认真阅读这些编译器所附带的参考手册。
本节给出一个使用标准库函数的例子。
题目:求正弦曲线y=sin(x)在[0,π]区间与x轴构成的面积S的近似值。
分析:sin(x)的最大值为1,因此所求面积在(0,0)、(0,π)、(1,π)、(1,0)四个点所在的矩形之内。在这个矩形之内随机地布上一些点(比如M个),假如落在所求面积之内的点的个数为N个,那么N/M的值应近似地等于S与矩形面积(π×1)之比,也就是
而且可以确信布置的点数越多,所求得的数值越精确。这种求面积的方法叫Monte Carlo方法。这个名字是冯·诺依曼在美国研制原子弹的时候给取的,Monte Carlo是一个著名赌城的名字。这种方法在许多领域都有重要的应用。
使用这种方法的关键是用计算机模拟随机布点的过程。C语言标准库中的rand()函数可以随机地给出一系列伪随机数,这些伪随机数的范围是0~RAND_MAX,RAND_MAX是一个int类型的符号常量,在各个编译器中可能不同,但C语言要求最小为0x7FFF。这样表达式(double)rand()/(double)RAND_MAX就可以给出0~1之间的伪随机数,那么0~π之间的伪随机数也就不难得到了。用产生一系列0~1之间的伪随机数和0~π之间的伪随机数分别作为Y、x坐标可以模拟布置点的过程。
rand()产生的伪随机数序列依赖于一个所谓的“种子数”,当“种子数”确定时,rand()产生的伪随机数序列也是确定的。这个“种子数”可以通过srand()函数设置(如果不设置则种子数为0)。所以若希望rand()产生一个“随机”的伪随机数序列,需要首先通过srand()函数为rand()函数设置一个“随机”的种子数。
为了达到这个目的,可以把当前的时间作为一个“随机”的种子数。当前的时间可以通过调用time()函数求出,所得到的值的意义是从以前的某个固定的时间开始到现在过了多少秒。
time()函数的最简单的调用格式是time(NULL),这个实参NULL是在stdio.h中定义的一个符号常量,本质上就是0。time()的返回值的类型是long。
srand()函数的函数原型是
可以看到它需要一个unsigned类型的实参。
而rand()函数的函数原型是
rand()和srand()的函数原型都写在stdlib.h中。
此外需要调用sin()函数,这个函数的原型是
这个函数原型写在math.h中Dev-C++的math.h中还给出了圆周率的宏定义
这个M_PI同样可以直接拿过来使用(只要#inc1ude<math.h>)。下面是程序的源代码。
程序每次运行结果都不尽相同,不过大致在2左右。
练习
1.求指数曲线y= ex在[0,1]区间内与x轴构成的面积的近似值。
2.一家著名的IT公司在面试的时候曾经给出过类似下面的源代码,问这段程序的功能是什么?如果你去面试能通过吗?