资源预览内容
第1页 / 共43页
第2页 / 共43页
第3页 / 共43页
第4页 / 共43页
第5页 / 共43页
第6页 / 共43页
第7页 / 共43页
第8页 / 共43页
第9页 / 共43页
第10页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第八章 函数,函数定义的一般形式 函数参数和函数的值 函数的调用 数组作为函数参数 函数的嵌套调用 函数的递归调用 局部变量和全局变量 内部函数和外部函数 本章要求及作业,8.1 概 述,函数的分类: 1、根据有无返回值分: 2、根据函数有无参数来分:,8.2 函数定义的一般形式,1.无参函数定义一般形式 类型标识符 函数名 ( ) 说明部分 语句 ,该函数无形式参数列表,2.有参函数定义一般形式 类型标识符 函数名 (形式参数列表) 说明部分 语句 ,3、函数定义的其他形式,1).可以有空函数 dummy() 2).,无形式参数,void,无返回值函数 max (.) .,函数体中无任何语句,称为“空函数,8.3 函数参数和函数的值,一、形式参数和实际参数 形式参数:在定义函数时使用的参数, 简称“形参”。 变量 实际参数:在调用函数时使用的参数, 简称“实参”。 表达式,二、函数的返回值,1、函数中的return语句返回函数的值,一个函数可以有一个以上的return语句,执行到哪一个return语句,哪个return语句就起作用。 例如:max(int x, int y) return (xy? x : y ); 2、定义函数时,应指明函数(返回值)类型 3、如果函数的类型与return语句中表达式的类型不同,以函数的类型为准 4、只要函数定义了返回值类型,无论函数中是否有return语句,函数均返回一个值。下面语句也是合法的: main( ) int a,b,c; a=star( ); b=message( ); c=star( ); printf(“%d,%d,%d”,a,b,c); 5、为了明确规定函数不返回任何值,在函数定义中,“类型标识符”必须声明为void(无类型或称空类型)。,8.4 函数的调用,一、函数调用的一般形式 函数名(实参列表) 二、函数调用的方式 printstar(); /* 函数调用作为一个语句 */ c = 2*max(a,b); /* 函数作为表达式的一部分 */ m = max (a, max(b,c);/* 函数的值作为一个函数的参数 */ printf(%d, max(a,b); /* 函数的值作为一个函数的参数 */,三、对被调函数的说明,在一个函数中调用另一个函数,需要具备那些条件: 1、被调用的函数必须已经存在。 2、使用系统预定义的函数(库函数),必须包含头文件 3、程序员自己定义的函数,在调用前,一般应声明其原型。,例8.5 float add(float x, float y); /* 声明自己写的add函数的原型 */ main () float a,b,c; scanf(%f,%f, ,在文件的开头声明函数原型。,float add(float x, float y );,在main的开头声明函数原型。,不需要函数声明的情况1、返回值为整型的函数。2、被调用函数的定义出现在主调用函数之前。3、在所有函数定义之前,文件的开头,已经作了函数声明。,8.5 函数的嵌套调用,函数的嵌套调用:在一个函数的函数体内调用另一个函数。,调用一个函数过程中又调用了另一个函数,在函数的嵌套调用中,函数的执行采取后调用先返回的原则。即最内层的函数调用最先返回函数值,由内到外依次返回。,求解x3-5x2+16x-80=0的根,解题步骤: 1. 取两个不同点x1,x2 如果f(x1)和f(x2)符号相反, 则x1,x2区间必有一个根, 如果同号,则应改变x1和 x2,直至异号为止 2. 连接f(x1)和f(x2),交x轴于 x点,则 x=x1*f(x2)-x2*f(x1)/f(x2)-f(x1) 3. 求f(x) 4. 若f(x)与f(x1)同号,则(x,x2)有根,此时将x作为x1 若f(x)与f(x2)同号,则(x,x1)有根,此时将x作为x2 5. 重复24的步骤,直至f(x)某个值,视精度要求而定,x1,f(x1),x,x2,f(x2),f(x),*例8_6.c * 函数的调用 * # include float root(x1,x2) float x1,x2; int i; float x,y,y1; y1=f(x1); do x=xpoint(x1,x2); y=f(x); if (y*y10) y1=y; x1=x; else x2=x; while (fabs(y)=0.0001); return (x); ,float xpoint(x1,x2) float x1,x2; float y; y=(x1*f(x2)-x2*f(x1) /(f(x2)-f(x1); return (y); ,/*1. 从以上函数可知,所有函数均是独立的 */ /*2. 所有函数均设为 float */ /*3. 所有函数均在 main() 之前定义 */ main() float x1,x2,f1,f2,x; do printf(input x1,x2:n); scanf(%f,%f, ,float f(float x) float y; y=(x-5.0)*x+16)*x-80; return (y); ,8.6 函数的递归调用,递归调用:一个函数的函数体直接或间接调用该函数本身. int f( int x) int y,z; z = f(z); /* 直接调用该函数本身 */ return (2*z); ,有五个人坐在一起,求第5个人多少岁。 第5个人多少岁? 比第4个人大2岁。 第4个人多少岁? 比第3个人大2岁。 第3个人多少岁? 比第2个人大2岁。 第2个人多少岁? 比第1个人大2岁。 第1个人多少岁? 我10岁。 表达为: age(5) = age(4) + 2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 10; 递归表达式:,例8-7,求解过程:,用一个函数age()来求第n个人多少岁。,main() int age(); /* 声明函数原型 */ printf(%dn,age(5); int age(int n) /* 求第n个人多少岁 */ int c; if (n=1) c = 10; else c = age(n-1) + 2; return c; ,利用递归的方法解决以下问题 1、求斐波那契亚数列的第n项。 2、求n的阶乘。 从例题中可以看到,有些问题,采用递归的方法解决,会变得非常简单,且源程序也很简洁。 一个问题要采用递归的方法解决时,要符合以下条件: 1、可以把一个问题转化为一个新问题,而新问题的解决方案仍与原问题相同,只是问题的规模不同。它们只是有规律的递增或递减。 2、可以通过转化过程使问题得到解决。 3、必须有一个明确的结束递归的条件。,8.7 数组作为函数参数,关于数组要点: 设数组: int a5 1、a0、a1、a2、a3、a4表示每一个 元素 的值。 2、数组名a表示该数组在内存的起始地址。 3、可以用地址运算符 int a6=2,4,6,8,10,10; int i,sum=0; for(i=0;i=5;i+,i+) sum=szadd(ai,ai+1) +sum; printf(sum=%dn,sum); int szadd(int m,int n) m=m+n; return m; ,1、数组元素作为函数的参数。 采用“值传送”即单向传送,即把元素的值传送给形式参数;,2、数组名可作为函数参数 例:8.11有一个一维数组score,内放10个学生成绩,求平均成绩。,float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver); main() float score10,aver; int i; printf(input 10 score:n); for(i=0;i10;i+) scanf(%f, ,3、用多维数组名作函数参数 例8.14 有一个3*4的矩阵,求所有元素中的最大值。,max_value(int array 4) int i,j,k,max; max=array00; for (i=0;imax) max=arrayij; return(max); main() int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(maxvalueis%dn,max_value(a) ); ,8.8 局部变量和全局变量,一、局部变量 局部变量:在函数内部定义的变量,它只在该函数范围内有效(被使用),称为“局部变量”。 二、全局变量 全局变量:在任何函数之外定义的变量, 称为外部变量,从定义它开始,在整个程序(所有函数)内都是有效的(或称为“可见的”,即可以使用)。,1、全局变量从定义它开始,在整个程序中均可以使用。因此,对于多个函数需要使用的共同变量,设计为全局变量。 2、建议少用全局变量。因为: 全局变量在整个程序运行过程中都占内存;局部变量仅在定义局部变量的函数被执行时才占内存,函数执行完释放所占内存。 全局变量使各函数互相关联,结构性差。 降低程序可读性。因为全局变量的值随时可能被其他位置的程序修改,不便于阅读,使程序容易出错。 3、全局变量外部变量:不在函数的开头定义,在引用前要用extern说明. 4.在同一源文件中,若外部变量与局部变量同名,则在局部变量的作用域内,外部变量不起作用。,/*外部变量,全局变量*/ float f1(int a) int b,c; / * 全局变量*/ char f2(int x, int y) int i,j; main() ; /*外部变量*/,int p=1,q=5;,char c1,c2;,int m,n,int a=1,b=5;,extern int a,b;,例、写出下面程序的执行结果。 int k=3;main() int k=7; printf(k=%dn,k); int k=11; printf(k=%dn,k); k+=1; printf(k=%dn,k); printf(k=%dn,k); printf(k=%dn,k); ,k=7 k=11 k=12 k=12 k=7,float max=0, min=0; /* 全局变量,最高分max、最低分min */ float average(float array,int n); main () float ave,score10; int i; for(i=0;i10;i+) scanf(%f, ,例8.15 有一个数组,内放10个学生成绩,写一个函数,求出平均分、最高分、最低分。 把平均分设计为函数average的返回值,最高分max、最低分min在函数average和主函数main中均需要使用,设计为全局变量。,float average(float array,int n) /* 函数,返回值为平均分 */ int i; float aver, sum = array0; max = min = array0; /*average函数内使用全局变量 */ for(i=1;i max) max = arrayi; else if (arrayi
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号