1、第七章 函数,内容: 1.函数的定义 2.函数参数 3.函数的调用4.函数的嵌套调用 重点: 1.函数的定义 2.函数参数 3.函数的调用要求: 掌握函数定义的一般形式;实际参数与形式参数之间的传递关系以及函数的返回值;能正确进行函数调用和嵌套调用;能正确阅读递归函数。,为使程序易于维护和提高程序段的利用率,一个较大的程序一般应分为若干个程序模块,每一个模块用来实现一个特定的功能。模块的功能,在C语言中,由函数完成。一个C程序可由一个主函数main和若干个函数构成。一个C程序的执行:从主函数开始,在main函数中调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。
2、,7.1 概述,例1: int max(int x,int y) int z;if (xy) z = x ; else z = y ;return (z); main( ) int a,b,c;scanf(“%d%d” , ,说明:,(2)一个源程序文件由一个或多个函数组成。,(1)一个C程序可由一个或多个源程序文件组成。,(3)C程序的执行从main函数开始,调用其他函数后流程回到 main函数,在main函数中结束整个程序的运行。,(5)从用户使用的角度看,函数有两种:A)标准函数,即库函数。printf函数等等。B)用户自己定义的函数。 max函数等等。,(6)从函数的形式看,函数分两类
3、:A)无参函数。在调用无参函数时,主调函数并不将 数据传送给被调用函数,一般用来执行指定的一组 操作。getchar()函数B)有参函数。在调用函数时,在主调函数和被调用 函数之间有数据传递。putchar(ch)函数,(4)所有函数都是平行的,即在定义函数时互相独立;一 个函数并不从属于另一个函数,即函数不能嵌套定义,函 数间可以互相调用,但不能调用main函数。,一、函数定义的一般形式 1、无参函数的定义形式 类型标识符 函数名( ) 声明部分语句 ,例2: void print_message( ) printf(“This is a example of C program!n”);
4、函数名取名规则同变量名。,7.2 函数的定义,2、有参函数定义的一般形式 类型标识符 函数名(形式参数表列) 声明部分语句 例3:int max ( int a , int b) int c;if (a b ) c = a ; else c = b ;return ( c ) ;,3、“空函数” 它的形式为: 类型说明符 函数名( ) 例4:null_hanshu( ) 调用该函数时,什么工作也不做。为今后程序的设计预设位置,可使程序的结构清楚,可读性好。,二、函数参数和函数的值,1、形式参数和实际参数在调用函数时,主调函数向被调函数有数据传递,函数名后面括弧中的变量名称为“形式参数”。在主调
5、函数中,函数名后面括弧中的参数(可以是一个表达式)称为“实际参数”。,关于形参与实参的说明:(1)在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。只有在发生函数调用时,函数的形参才被分配内存单元。在调用结束后,形参所占的内存单元将被释放。,int max(int x,int y) int z;if (xy) z = x ; else z = y ;return (z); main( ) int a,b,c;scanf(“%d%d” , ,(2)实参可是常量、变量或表达式,但要求它们有确定的值。在调用时将实参的值赋给形参。 C语言规定,实参变量对形参变量的数据传递是“值传
6、递”,即单向传递,只由实参传给形参,而不能反传。在内存中,实参单元与形参单元对应不同的存储单元。,int max(int x,int y) int z;if (xy) z = x ; else z = y ;return (z); main( ) int a,b,c;scanf(“%d%d” , ,例5: #include “stdio.h” void swap(int x,int y) int z;z=x; x=y; y=z; main( ) int a,b;scanf(“%d%d”, ,输入:1 2 运行结果: a=1 , b=2,(3)在被定义的函数中,必须指定形参的类型。,(4)实参与
7、形参的类型、个数应一 一对应。,1、 在函数定义时对形参说明有以下两种方式:1)对形参的传统声明方式:int max(x,y) /*指定形参x,y*/int x , y ; /*对形参指定类型*/一般把这种方法称为形参的传统声明方式。,2)对形参声明的现代方式:int max(int x , int y) /*指定形参x , y并对形参指定类型*/ int z;z=xy?x:y;return(z);,、函数的返回值通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值。(1)函数的返回值是通过被调函数中的return语句获得的。return语句将被调函数中的一个确定值(只有一个
8、)带回主调函数中去。格式:return 表达式;如果不需要从被调用函数带回函数值可以不要return语句。一个函数中可以有一个以上的return语句。,例6: int sign_function(int x) if (x0) return 1 ;else if (x = = 0 ) return 0 ;else return -1; ,、函数执行结束()return语句()函数体的右花括号,(2)函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。,int max(int x,int y) int z;if (xy) z = x ; else z
9、 = y ;return (z); main( ) int a,b,c;scanf(“%d%d” , ,C语言规定,凡不做函数值类型说明的函数,函数值一律自动按整型处理。,在定义函数时对函数值类型的说明,一般应该和return语句中的表达式类型一致。,例7:void print_message( ) printf(“This is a example of C program!n”);,(3)如果函数值的类型和return语句中表达式的不一致,则以函数 型为准。 (4)如果被调用函数中没有return语句,带回的是不确定的值。 (5)为了明确表示“不带回值”,可以用“void”定义“无类型”。
10、,一、函数调用的一般形式函数名(实参表列);例:printf() ;各参数间用逗号隔开(如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略)。实参与形参的个数应相等,类型应一致。实参与形参按顺序一一对应传递数据。 二、函数调用的方式按函数在程序中出现的位置来分,可以有以下三种函数调用方式:,7.3 函数的调用,、函数语句把函数调用作为一个语句。 print_message( ) printf(“This is a example of C program!n”); 则调用方式为: print_message( );这时不要求函数带回值,只要求函数完成一定的操作。、函数表达式函数出现在一
11、个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。例:c=2*max(a,b);、函数参数函数调用作为一个函数的实参。例:m=max(a,max(b,c);实质上也是函数表达式调用的一种,因为函数的参数本来就要求是表达式形式。,三、对被调用函数的声明和函数原型 在一个函数中调用另一函数需要具备哪些条件呢? 、首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。 、如果使用库函数,一般还应该在本文件开头用#include命令将调用有关库函数时所需用到的信息“包含”到本文件中来。 例如: 使用scanf和printf等函数时,文件开头要有#in
12、clude使用gets 和 strlen等函数时,文件开头要有#include等等。,、如果使用自定义的函数,则该函数应与主调函数在同一个文件中;一般还应该在主调函数中对被调函数作声明。 简单地照写已定义的函数的首部,再加一个分号,就成为了对函数的“声明”例:int max(int x , int y);,int max(int x,int y) int z;if (xy) z = x ; else z = y ;return (z); main( ) int a,b,c;int max(int x,int y);scanf(“%d%d” , ,说明:(1)如果被调用函数的定义出现在主调函数之
13、前,可以不必加 以声明,注意:对函数的“定义”和“声明”不是一回事。“定义”是指对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。“声明”的作用则是把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查。在函数声明中也可以不写形参名,而只写形参的类型:例:int max(int , int );在C语言中,以上的函数声明称为函数原型,它的一般形式为: 1、函数类型 函数名(参数类型1,参数类型2); 2、函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,);例:int max(int
14、x , int y);,一、函数的嵌套调用C 语言的函数定义都是互相平行、独立的。C 语句不能嵌套定义函数,但可以嵌套调用函数。 例8: void print_max( int x ) printf(“maxinum number is %dn” , x ) ; void max(int x,int y) int z;if (xy) z = x ; else z = y ;print_max(z); main( ) int a,b,c;scanf(“%d%d” , 输入:1 2,7.4 函数的嵌套调用,运行结果:maxinum number is 2,程序执行流程:,main( ) max(a
15、,b);,max(int x,int y ) print_max(c);,print_max( int x) printf();,二、函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C 语言的特点之一就在于允许函数的递归调用。,例: 函数ab1如下: ab1() ab2() ,函数ab2如下: ab2() ab1() ,例: 函数ab1如下: ab1() ab1() ,例9: #include “stdio.h”void abc(int n) int j;if (n= = 1) printf(“*n”);else abc(n-1);for (j=1;j
16、=n;j+)printf(“*”);putchar(n); main( ) abc(3); ,void abc(int n) int j;if (n= =1) printf(“*n”);elseabc(n-1);for (j=1;j=n;j+)printf(“*”);putchar(n); ,void abc(int n) int j;if (n= = 1) printf(“*n”);else abc(n-1);for (j=1;j=n;j+)printf(“*”);putchar(n); ,3,2,1,*,*,*,本课小结:,1 概述 2 函数的定义 3 函数的调用 4 函数的嵌套调用,P145 第一、二题,作 业,