资源预览内容
第1页 / 共82页
第2页 / 共82页
第3页 / 共82页
第4页 / 共82页
第5页 / 共82页
第6页 / 共82页
第7页 / 共82页
第8页 / 共82页
第9页 / 共82页
第10页 / 共82页
亲,该文档总共82页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,第5章 函数,5.1 函数的基本概念 5.2 库函数的使用方法 5.3 函数定义 5.4 函数调用 5.5 函数说明,5.6 递归函数基础 5.7 函数程序设计实例 5.8 存储类别和作用域 5.9 编译预处理命令简介,2,5.1 函数的基本概念,一个较大的程序一般分为若干个程序模块,每一个模块用来实现一个特定的功能。在C语言中,每一个模块就是一个函数。 函数由一个主函数main和若干个函数构成。程序运行时先执行主函数,再由主函数调用其他函数,其他函数也可以互相调用。 函数调用时一般给出要传送的数据,称为实参;在被调用的函数应有接受这些数据的称为形参。 函数分为用户自编的函数和C语言提供的库函数两种。,3,5.1 函数的基本概念,【例5.1】以下是已知圆柱体的半径和高,求圆柱体体积的程序。 #include void main() double PI = 3.1415926, radius, height, vol; printf(“输入圆柱体的半径和高n“); scanf(“%lf%lf“, ,4,5.1 函数的基本概念,#include /* 求圆柱体体积函数 */ double volume(double radius, double height) double PI = 3.1415926, vol; vol = PI * radius * radius * height; return vol; void main() /*主函数 */ double PI = 3.1415926, r, h, v; printf(“输入圆柱体的半径和高n“); scanf(“%lf%lf“, ,5,5.2 库函数的使用方法,使用库函数的程序,都要在使用前写上包含其头文件的预处理命令。以下是常用的头文件: stdio.h 输入输出库函数 math.h、stdlib.h、float.h 数学库函数 time.h 时间库函数 ctype.h 字符分类和转换库函数 string.h 内存缓冲区和字符串处理库函数 graphics.h 图形处理库函数 malloc.h、stdlib.h 内存动态分配库函数 signal.h、process.h 进程控制库函数,6,【例5.2】产生10个0100之间的随机数,#include /* 输入输出库函数的头文件 */ #include /* 时间库函数的头文件 */ #include /* 数学或内存分配库函数的头文件 */ void main() int k; long now; srand(time( /* 产生10个100以内的随机数 */ ,Rand()函数的返回值:0 32767,7,5.3 函数定义,一般形式: 类型符 函数名(形式参数说明表) 说明和定义部分 语句序列 说明: 1.函数头 (1)类型符:指定函数返回值的类型。当函数执行不返回值时,习惯用void来标记;当函数返回int型值时,类型区分符int可以省略。,8,(2)函数名:只有一个主函数,即main()函数,其他的函数名可以随意命名。 (3)形式参数说明表:当有多个形参时,形参说明之间用逗号分隔,每个形参说明指定形参的类型和形参名。没有形参时圆括号内或空,或写上void,但圆括号不能省略。 对于函数来说,形参是一种局部变量。 形式参数说明表的一般形式如下: 类型符 形参1, 类型符 形参2, 类型符 形参n,5.3 函数定义说明,9,2. 函数体:函数体包含在函数头后一对花括号中,由说明语句(说明和定义部分)和执行语句组成。在函数体内定义的变量称为函数的局部变量,只能在函数体内使用。因此,不同函数中的局部变量可以同名,互不干扰。 3. 函数返回值:函数可以有返回值,也可以没有返回值。有返回值的函数,在函数的出口处必须有带表达式的return语句: return 表达式; /* 返回结果 */,5.3 函数定义说明,10,【例5.3】求两个数中最小值的函数min(),/* 返回 double 型值,有两个形参 */ double min(double x, double y) return x y ? x : y; /* 返回x和y二者中小者的值 */ 说明:上述函数头表明,该函数名是min,它返回double型值,有两个double类型的形参,两个形参的名分别为x和y。,11,【例5.4】求两个正整数最大公约数的函数,两个正整数 a 和 b 的最大公约数有性质: gcd(a-b, b) a b gcd(a, b) = gcd(a, b-a) a b) a -= b; else b -= a; return a; ,12,【例5.4】采用辗转相除法 求正整数a、b的最大公约数,A. 求余数 求 a 除以 b 的余数r; B. 判结束 如 r 等于 0,b 为最大公约数,算法结 束;否则执行步骤C; C. 替换 用 ba,rb,并回到步骤A。 int gcd(int a, int b) int r; while(r = a % b) /* 求余数,并判是否结束 */ a = b; b = r; /* 替换 */ return b; ,13,5.3 函数定义 例5.5、例5.6,【例5.5】输出换行符的函数printnl。 void printnl(void) printf(“n“); 函数printnl()不返回结果,也没有形参。 【例5.6】空函数。 dummy() /* 或 dummy(void) */ ,14,5.4 函数调用,1. 函数调用的一般形式 一般形式: 函数名(实在参数表) 实在参数:按实参出现的顺序与函数定义中的形参一一对应,且类型一致。实参可以是常量、变量、表达式等。 如函数调用: w = min(u, v); 说明:调用函数名为min,提供了两个实参u和v,函数返回时结果存入变量w中。 若调用无形参的函数,调用形式变为: 函数名() 或 函数名(void) 说明:函数名之后的一对圆括号不能省略。,15,5.4 函数调用,2. 函数调用的应用 (1) 函数调用作为独立的语句 在函数调用之后加上一个分号。这种应用不要求函数有返回值,或无视函数的返回值。例如,程序中经常使用的调用格式输入函数scanf()和格式输出函数printf()等。 (2) 函数调用出现在表达式中 函数调用是利用函数的返回值,或对函数的返回值作进一步计算,或直接输出函数的返回值等。例如, minvalue = min(a, min(c, d); /*函数返回值作进一步计算*/ printf(“%fn“, min(u-v, a+b); /*直接输出函数的返回值*/,16,5.4 函数调用,3. 函数调用的执行过程 (1) 为函数的形参分配内存空间; (2) 计算实参表达式的值,并将值赋值给对应的形参; (3) 为函数的局部变量分配内存空间; (4) 执行函数体内的语句序列; (5) 函数体执行完,或执行了函数体内的return语句,释放为这次函数调用分配的全部内存空间; (6) 将函数返回值(如果有)作为函数调用的结果,从函数调用处继续执行。,17,【例5.7】求两个自然数的最大公约数,#include /* 这里是求最大公约数函数gcd(), 函数代码见例5.4 */ void main() /* 主函数 */ int x, y, d; printf(“Enter x, y : “); scanf(“%d%d“, ,18,5.4 函数调用说明,(1)当函数执行return语句或执行完函数体的语句后,函数的这次调用结束,随之将控制返回到函数调用处继续执行。 (2)函数的返回值是通过执行return语句,计算return之后的表达式值而获得的。如果函数不提供返回值,则return语句不应包含表达式。 (3)如果函数有返回值,则函数应有确定的类型,并在函数定义时指明。return语句的表达式类型应与函数定义中指明的返回值类型相一致。例如,函数gcd()的类型是int型,返回值也为int型。 (4)如果函数不提供返回值,应在函数定义时在函数名之前写上void,在函数体内所有的return语句都不应该带表达式。,19,5.4 函数调用,4. 实参向形参传递数据 C语言规定,实参对形参的数据传递是“值传递”,即单向传递。如果实参也是变量,则实参变量与形参是不同的变量,只有实参变量的值传给形参,而不能由形参直接传回给实参(通过指针间接引用除外)。实际上,实参与形参在内存中占用不同的存储单元。在函数执行过程中,形参变量的值可以改变,但这改变对原先与它对应的实参变量没有影响。,即: 实参形参() 形参实参(),20,【例5.8】值传递的示意程序,#include void func(int x, int y) x += 10; y += 10; printf(“ 在func函数中:x = %d, y = %dn“, x, y); void main() int x = 5, y =8; printf(“ 在主函数中x与y的初值是:x = %d, y = %dn“, x, y); func(x, y); printf(“ 调用func函数后返回到主函数时:x = %d, y = %dn“, x, y); ,运行结果,21,5.4 函数调用,5. 函数的嵌套调用 在C语言中,所有函数都是独立的又是平等的。所谓“独立的”是指,一个函数内不能包含另一个函数定义,即不能嵌套定义。所谓“平等的”是指,除程序从主函数开始执行外,所有函数都处于同一层,函数相互之间可以任意调用。 这样从主函数出发,形成了一个长长的调用链,这就是通常所说的函数嵌套调用。,22,函数嵌套调用示图,main函数,a 函数,b 函数,调用a函数,结束,调用b函数,结束,结束,23,【例5.10】函数嵌套调用的示意程序,#include #include /* 判是否可构成三角形函数 */ int istri(float a, float b, float c) if (a+b=c | a+c=b | b+c=a) return 0; /* 不能构成三角形*/ if (a=0 | b=0 | c=0) return 0; /* 不能构成三角形*/ return 1; /* 能构成三角形 */ ,24,【例5.10】函数嵌套调用的示意程序,/* 求三角形面积函数 */ float triangle(float a, float b, float c) float s, area; /* 调用istri()函数,查看是否能构成三角形 */ if (istri(a, b, c) = 0) return 0; /* 返回值为0不能构成三角形 */ s = (a+b+c)/2; area = sqrt(s*(s-a)*(s-b)*(s-c); return area; /* 返回已计算的三角形面积 */ ,25,【例5.10】函数嵌套调用的示意程序,void main() /* 主函数 */ float a, b, c, area; do printf(“请输入三角形三条边a, b, c:“); scanf(“%f%f%f“, ,运行结果,26,调用库函数:在文件开头用#include说明。 调用自定义函数:在调用函数中作如下说明: 类型 标识符(形参类型表); 其中: 类型:该函数返回值的类型。 形参类型表:顺序给出各形参的类型,若没有形参,用void或空表示。 下面两种情况可以不说明: 1. 被调用函数类型为整型或字符型。 2. 被调用函数放在调用函数之前。,5.5 函数说明,27,#include void main() dou
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号