作者:巨同升
1.引言
在C语言中函数是程序的基本构成要素,是编程时频繁使用的程序单位,其重要性是不言而喻的。但是从教学效果方面来看,多数学生对于函数的理解掌握并不理想。有的学生虽然能够用单独的main函数完成程序,但是要分解为几个函数,就会感觉无从下手[1]。
这其中有C语言自身特点的客观原因,比如C语言的函数同时包含了大多数编程语言中子程序和函数这两种程序单位的功能,在一定程度上提高了编写函数的难度。另一方面也有来自于教材和教学方法方面的原因。综观绝大多数C语言程序设计教材,在讲述如何定义一个函数时,往往都是采用“解释法”[2]。也就是直接将函数写出来,然后再做分析解释。至于这个函数是如何写出来的、为什么这么写,则鲜有分析说明。从而给学习者造成一种神秘、无章可循的感觉。
从讲授者的角度,或许觉得这样编写函数是理所当然的,无需更多的解释,或者只可意会,不可言传。其实如何定义一个函数也是有其内在规律的,甚至可以像数学公式那样一步一步地推导出来。这就要求讲授者能够发现并归纳出其中的内在规律并传授给学生。学生一旦有了编写函数的依据,再来编写函数也就不再感觉神秘、无章可循了[3]。
下面就来介绍两种行之有效的编写函数的方法:分解法和改写法。
2.分解法
所谓分解法,就是首先将整个程序的功能用一个独立main函数实现,然后再将这个main函数分解为主调函数和被调函数[4]。
为了便于理解,我们将无参函数和有参函数的定义和调用的方法分开来介绍。
2.1 无参函数的定义和调用
例1.编写程序,打印出如下图形。
首先,我们编写一个只有main函数的程序来实现上述功能。
#include <stdio.h>
int main(void)
{int i,j;
printf("The first one:\n");
for(i=1;i<=4;i++)
{for(j=1;j<=i;j++)
printf("*");
printf("\n");
}
printf("The second one:\n");
for(i=1;i<=4;i++)
{for(j=1;j<=i;j++)
printf("*");
printf("\n");
}
return 0;
}
我们发现,在这个程序中打印三角形的程序段重复了两次,但是也不方便将这两段合并为一个新的循环。因此,为了提高编程效率,避免重