
5-1 函数的引入
还记得数学家高斯小时候的故事吗:老师让高斯他们计算从1加到100的值,高斯找到了一个巧妙的方法,很快就写出了答案,而他的同学还在老老实实的计算。
如果我们今天让计算机来计算,完全可以编写如下程序:
【示例5-1】求从1加到100的值。
代码如下:


这个方法虽然老实而笨拙,但是计算机具有运算速度快的特点,所以也没有关系。但是如果老师怕各位同学互相抄袭,让有的同学从1加到66,有的加到77……这个程序的通用性就差了一点。
于是就有了下面的求从1加到任意一个数n的通用程序,使用sum()函数来计算所有从1加到n,只不过在主程序中,调用它来满足不同的需求。
【示例5-2】求从1加到n的值。
代码如下:

在这个程序中,我们第一次地使用了函数这样的结构。这是C语言和大多数高级语言都提供的一种代码集成机制,可以把特定的功能集中由函数(function)来完成。
函数完成固定的、规划好的功能,在程序编写中如果需要使用这样的功能即可通过调用这个函数来实现。不管这个函数实现的功能有多复杂,调用它只需要很少的语句,而且调用形式(接口)是固定不变的。
C语言中引入函数这样的结构有很多的好处,一是提高程序的通用性;提高代码的复用率;强化了程序的分工;还提高程序的可读性。
相比较而言,有人说Basic语言的一个语句就是一个函数,真的是很有道理。
函数的重要意义在于接口和实现的分家,这给开发大型程序、分工合作带来了可能。
程序员各自开发各自的模块,只需要约定好互相调用的接口即可。C语言的函数就是起到接口的作用,我们只需要使用函数,而不需要知道函数的内部是如何实现的。例如上面的程序可以改用高斯先生的算法,如下面示例所示。
【示例5-3】求从1加到n的值(高斯算法)。
代码如下:

高斯先生果然聪明,采用他的算法,程序也可以简单很多。我们也很聪明,从两段程序的对比中会发现有很多不同:
(1)函数可以使用一个原型先声明,实现可以在其他任何地方;
(2)接口不变,实现变了,不影响程序的执行。
实际开发中也是如此,确定各个模块的接口后,在优化程序的时候,修改各个函数模块的内部实现即可,不用对整个系统“大动干戈”。函数的功能结合一定的程序设计方法,在求解问题的时候逐步细化,逐步到最简单的、最底层的函数,然后逐一实现,这给软件开发带来了极大的便利。