文档介绍:第八章函数
教学内容
(1) 函数定义的一般形式;
(2) 函数参数与函数的值;
(3) 函数的调用;
(4) 函数的嵌套和递归;
(5) 数组作为函数的参数;
(6) 局部变量和全局变量;
(7) 变量的存储类别;
(8) 内部函数和外部函数;
基本要求
理解子程序和函数的概念;掌握函数的定义形式、函数的调用、函数的嵌套和递归、变量的作用域和变量的存储类别。
实验四  函数(2学时)
能够编写一般的函数,掌握函数的调用,递归算法等。
先回忆一下C程序结构,用下图表示:
C程序
源程序文件1
源程序文件n
源程序文件2
预处理命令
全局变量声明
函数1
函数n
一个源程序文件又称子程序模块,每一模块用来实现一个特定的功能,功能的实现是靠函数来完成的。一个源程序由若干个函数构成,这些函数中有且仅有一个main函数,其他的函数都是由main函数调用的。除了main 函数其余的函数之间可以互相调用,同一个函数可以被一个或多个函数调用任意多次。但是其他的函数都不能调用main函数。
函数的概念:数学中的函数有自变量和因变量之分,是作为一个独立的成份。而C程序中的函数需要有入口数据,从而改变输出数据,而它只能作为程序的一个部分。
P143函数调用举例。
说明:
一个源程序文件由一个或多个函数组成。系统是以源程序文件为单位进行编译,而不是以函数为单位进行编译。
一个较大的C程序是由若干个子程序模块构成,而各个函数一般是放在各个子程序模块中的,这样可以分别编写,分别编译提高效率。一个子程序模块可以供多个C程序公用。
C程序的执行是从main 函数开始的,又是在主函数中结束整个程序的,其余的函数都是由主函数调用的,调用后返回主函数。
函数之间是相互独立的,即一个函数并不从属于另一个函数,也就是说函数不能嵌套定义。
函数的分类:从用户的角度可分为标准函数和用户自定义的函数。从函数的角度可分的无参函数和有参函数。
函数定义的一般形式
类型标识符函数名()
{声明部分;
语句;
}
“类型标识符”是指定函数值的类型,即函数返回值的类型,一般无参函数不需要返回函数值,因此可以不指定类型标识符。
类型标识符函数名(形式参数表列)
{声明部分;
语句;
}
如main(){int a,b,c;scanf(“%d%d”,&a&b);c=max(a,b);printf(“%d”,c);}
int max(int x,int y){int z;if(x>y) z=x;else z=y; return(z);}
需解释如何传递参数的。
类型标识符函数名(){}
调用此函数什么也不做,没有任何作用吗?(我们在设计一个较大的程序时,第一个阶段先完成基本的功能模块,而其余不很重要的部分可以在以后优化程序中再做,为此,可以事先为以后要增加的模块先占一个位置,这样做,程序的结构清楚,可读性好,以后扩充新功能方便。)
对上例形参声明的改进:int max(x,y)
int x,y;{int z;z=z>y?x:y;return(z);}
对形参的定义不在括号内而在括号外单独指定,这种形式称为传统方式。
函数参数与函数的值
有参函数的特点:主调函数与被调函数之间有数据传递关系。主调函数将实参值传递给被调函数形参,而被调函数可以带回一个函数值供主调函数使用。
形参:在定义函数时函数名后面()中的变量名称为“形式参数”;
实参:在调用函数时函数名后面()中的参数称为“实际参数”;如P146
关于形参与实参的说明:
在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储空间,只有在发生函数调用时,形参才被分配内存单元,在调用结束后,形参所占的内存单元被释放。
实参可以是常量、变量或表达式,但它们要有确定的值。如max(3,a+b)。
在被定义的函数中必须指定形参的类型。
实参与形参类型应相同。如实参与形参的类型不同则按语法出错处理。注意:字符型与整型可以通用。
C语言规定,实参变量对形参变量是“单值传递”的。只能由实参向形参传递参数。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参;调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数实参的值。
C语言允许使用另一种方法对形参做说明,即在列出“形参表列”时,同时说明形参类型。如int max(int x,int y)相当于int max(x,y)int x,y;