第六章 函 数
【教学目的】
理解“函数”概念,学会构造程序模块
掌握函数的定义和调用
掌握函数之间的信息传递
掌握函数的递归调用
熟悉 C 标准库中常见的库函数
【教学内容】
正确定义函数及其声明
函数的调用的方式及其返回值
函数的参数,两种重要的传递方式——传值调用和传址调用
命令行参数
函数的递归调用
【教学重点和难点】
掌握函数的定义,在实际问题中如何构造函数这样的程序模块。
掌握函数的传值调用和传址调用,特别是传址调用。注意两种方式的区别,什么情况下
用哪一种方式更高效,更方便。
主函数带参数的情况,参数如何传递,程序如何执行。
掌握递归算法,包括递归的基本概念,递归函数的动态执行过程,递归程序的编写方法。
【问题的提出】
在前五章中所出现的程序都只有一个 main 函数,当开发和维护大型程序时,程序往往很
大,用一个 main 函数编写的程序会很长,不利于多人合作开发大型程序(或软件),也不利
于程序的阅读和调试。在这种情况下提出了一种好的办法,就是用更容易管理的小程序块 (即
模块)来建立程序,这种程序设计技术称为“细化”(divide and conquer) 。
从组成上看,各个功能模块彼此有一定的联系,功能上各 自独立,从开发过程上看,可
能不同的模块由不同的程序员开发,怎样将不同的功能模块连接在一起,成为一个程序,怎
样保证不同的开发者的工作既不重复,又能彼此衔接,这就是模块化设计。在 C 语言中,用
函数实现功能模块的定义,一个文件中可以包含多个函数。
C 语言的程序通常是用程序员编写的新函数和 C 标准库中的函数写成的。C 标准库中提
供了丰富的函数集,这些函数能够完成常用的数学计算、字符串操作、字符操作、输入/输
出以及其它许多有用的操作。这些函数给程序员提供了很多必要的功能,减少了程序员的工
作量,节省了开发时间,使程序具有更好的可移植性。标准库函数存放在不同的头文件中,
使用时只要把头文件包含在用户程序中,就可以直接调用相应的库函数了。即在程序开始部
分用如下形式: #include 或: #include "头文件名"。
用户可根据自己的需要,编写完成指定任务的函数,这些函数称为“自定义函数”。函数
的使用是通过函数调用实现的,函数调用指定了被调用函数的名字和调用函数所需的信息(参
数) 。
【教学要点】
1. 函数定义、声明、调用及返回值
【例 6.1 】定义一个函数,用于求两个数中较大的数。
分析: 根据题意,需要自定义一个函数实现求大数的功能;而在 main( ) 中实现两数的
输入、调用自定义函数及输出功能。
源程序如下:
main()
{ float max(float n1, float n2) ; /* 在 main( ) 中对被调用函数max( )进行声明 */
float num1,num2,m ;
printf("input two numbers:\n") ;
scanf("%f%f", &num1, &num2) ; /* 输入两个数 */
m=max(num1,num2); /* 调用 max( ) 函数,返回后的较大值存于m 中 */
printf("max=%f\n",m) ; /* 输出较大数 */
getch();
}
float max(float n1, float n2) /* 定义一个函数 max( )求较大数,其返回值为 float 型*/
{ return (n1>n2?n1:n2) ; /* 返回表达式的值 */
}
说明:
1. 任何一个函数都是由函数说明和函数体两部分组成。根据函数是否需要参数,可将
函数分为无参函数和有参函数两种。在本例中定义一个函数 max( )是有参函数,调
用有参函数时,调用函数将赋予这些参数实际的值。为了与调用函数提供的实际参
数区别开,将函数定义中的参数表称为形式参数表,简称形参表。本例中将实参num1 、
num2