版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第八章第八章 函数函数8.1 概述概述8.2 函数定义的一般形式函数定义的一般形式8.3 函数参数和函数的值函数参数和函数的值8.4 函数的调用函数的调用8.5 函数的嵌套调用函数的嵌套调用8.6 函数的递归调用函数的递归调用8.7 数组作为函数参数数组作为函数参数8.8 局部变量和全局变量局部变量和全局变量8.9 变量的存储类别变量的存储类别8.10 内部函数和外部函数内部函数和外部函数8.5 函数的嵌套调用函数的嵌套调用main( )调用函数调用函数a终了终了a函数函数b函数函数调用函数调用函数b函数定义不可嵌套,但可以嵌套调用函数函数定义不可嵌套,但可以嵌套调用函数例例 求三个数中最大数
2、和最小数的差值求三个数中最大数和最小数的差值#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d); int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int
3、r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); main( )调用函数dif输出终了dif函数max函数调用函数max调用函数minmin函数例例8.6用弦截法求方程用弦截法求方程x3-5x2+16x-80=0的根。的根。方法如下方法如下:(1) 取两个不同点取两个不同点x1,x2,如果如果f(x1)和和f(x2)符号相符号相反反,那么那么(x1,x2)区间内必有一个根。如果区间内必有一个根。如果f(x1)与与f(x2)同符号同符号,则应改变则应改变x1,x2,直到
4、直到f(x1)、f(x2)异号为止。注意异号为止。注意x1、x2的值不应差太大的值不应差太大,以保以保证证(x1,x2)区间内只有一个根。区间内只有一个根。(2) 连接连接f(x1)和和f(x2)两点两点,此线此线(即弦即弦)交交x轴于轴于x,见图见图8.6。x点坐标可用下式求出点坐标可用下式求出:x=x1f(x2)-x2f(x1)f(x2)-f(x1)再从再从x求出求出f(x).(3) 若若f(x)与与f(x1)同符号同符号,则根必在则根必在(x,x2)区间内区间内,此时此时将将x作为新的作为新的x1。如果。如果f(x)与与f(x2)同符号同符号,则表示根在则表示根在(x1,x)区间内区间内
5、,将将x作为新的作为新的x2。图图8.6图图8.7(4) 重复步骤重复步骤 (2) 和和 (3) , 直到直到 f(x) 为止为止, 为一为一个很小的数个很小的数, 例如例如 10-6. 此时认为此时认为 f(x)0.根据上述思根据上述思路画出路画出N-S流程图流程图,见图见图8.7。分别用几个函数来实现各部分功能分别用几个函数来实现各部分功能:(1) 用函数用函数f(x)来求来求x的函数的函数: x3-5x2+16x-80(2) 用函数用函数xpoint (x1,x2)来求来求f(x1)和和f(x2)的连线与的连线与x轴的交点轴的交点x的坐标。的坐标。(3) 用函数用函数root (x1,x
6、2)来求来求(x1,x2)区间的那个实根。区间的那个实根。显然显然,执行执行root函数过程中要用到函数函数过程中要用到函数xpoint,而执行而执行xpoint函数过程中要用到函数过程中要用到f函数。函数。请读者先分析下面的程序。请读者先分析下面的程序。 #include #include * 定义定义f函数,以实现函数,以实现f(x)x3-5x2+16x-80 * float f(float x) float y; y(x50)*x160)*x800; returny);); *定义定义xpoint函数,求出弦与函数,求出弦与x轴交点轴交点 */ float xpoint(float x1
7、,float x2) float y; y=(x1*fx2)x2*fx1)()(fx2)fx1);); returny);); /*定义定义root函数,求近似根函数,求近似根 * float rootfloat x1,float x2) int i; float x,y,y1; y1fx1);); do xxpointx1,x2);); yfx);); ify*y10) fx与与fx1同符号同符号 * y1y; x1x; else x2x; whilefabsy)00001);); returnx);); void main()() /*主函数主函数*/ float x1,x2,f1,f2,
8、x; do printf(input x1,x2:n);); scanf(“f,f”,x1,x2);); f1fx1);); f2fx2);); whilef1*f20);); xrootx1,x2);); printf( root of equation is84f,x);); 运行情况如下:运行情况如下:input x1,x2:2,6 root of equation is50000从程序可以看到:从程序可以看到:(1) 在定义函数时,函数名为在定义函数时,函数名为f、xpoint、root的的3个函数是互相个函数是互相独立的,并不互相从属。这独立的,并不互相从属。这3个函数均定为实型。个
9、函数均定为实型。(2) 3个函数的定义均出现在个函数的定义均出现在main函数之前,因此在函数之前,因此在main函数中函数中不必对这不必对这3个函数作类型说明。个函数作类型说明。(3) 程序从程序从main函数开始执行。先执行一个函数开始执行。先执行一个do-while循环,作用循环,作用是:输入是:输入x1和和x2,判别,判别fx1和和fx2是否异号,如果不是异是否异号,如果不是异号则重新输入号则重新输入x1和和x2,直到满足,直到满足fx1与与fx2异号为止。然异号为止。然后用函数调用后用函数调用rootx1,x2求根求根x。调用。调用root函数过程中,要函数过程中,要调用调用xpoi
10、nt函数来求函数来求fx1与与fx2连线的交点连线的交点x。在调用。在调用xpoint函数过程中要用到函数函数过程中要用到函数f来求来求x1和和x2的相应的函数值的相应的函数值fx1和和fx2)。这就是函数的嵌套调用。见图)。这就是函数的嵌套调用。见图8.8。图图8.8(4) 在在root函数中要用到求绝对值的函数函数中要用到求绝对值的函数fabs,它是,它是对实型数求绝对值的标准函数。它属于数学函数库,对实型数求绝对值的标准函数。它属于数学函数库,故在文件开头用故在文件开头用include即把使用数即把使用数学库函数时所需用到的有关信息包含进来。学库函数时所需用到的有关信息包含进来。函数直接
11、或间接的调用自身函数直接或间接的调用自身 叫函数的递归调用叫函数的递归调用f( )调调f调调f2调调f1f1( )f2( )int f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);8.6 函数的递归调用函数的递归调用阐明阐明C编译系统对递归函数的自调用次数编译系统对递归函数的自调用次数没有限制没有限制每调用函数一次,在内存堆栈区分配每调用函数一次,在内存堆栈区分配空间,用于存放函数
12、变量、返回值空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能等信息,所以递归次数过多,可能引起堆栈溢出引起堆栈溢出例例 求求n的阶乘的阶乘) 1()!1() 1 , 0(1!nnnnn/*ch7_8.c*/#include int fac(int n) int f; if(n0) printf(n%cn,getone,putone); void hanoi(int n,char one,char two,char three) if(n=1) move(one,three); else hanoi(n-1,one,three,two);move(one,three);hanoi(n
13、-1,two,one,three); void main() int m; printf(Input the number of disks:); scanf(%d,&m); printf(The steps to moving %3d disks:n,m); hanoi(m,A,B,C);8.7 数组作为函数参数数组作为函数参数数组元素作函数实参数组元素作函数实参 值传递值传递数组名做函数参数数组名做函数参数 地址传递!地址传递!例例8.10 两个数组大小比较两个数组大小比较a a和和b b为有为有1010个元素的整型数组个元素的整型数组比较两数组对应元素比较两数组对应元素变量变量n
14、,m,kn,m,k记录记录aibi, ai=bi,aibi, ai=bi,aibiaik,nk,认为数组认为数组abab 若若nk,nk,认为数组认为数组abab 若若n=k,n=k,认为数组认为数组a=ba=b 数组元素作函数实参数组元素作函数实参 值传递值传递432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2#include void main() int a10,b10,i,n=0,m=0,k=0; printf(Enter
15、array a:n); for(i=0;i10;i+)scanf(%d,&ai); printf(Enter array b:n); for(i=0;i10;i+)scanf(%d,&bi); for(i=0;iy) flag=1; else if(xy) flag=-1; else flag=0; return(flag); 数组名作函数参数数组名作函数参数 地址传递地址传递 在主调函数与被调函数分别定义数组在主调函数与被调函数分别定义数组,且类型应一致且类型应一致 形参数组大小形参数组大小(多维数组第一维多维数组第一维)可不可不指定指定 形参数组名是地址变量形参数组名是地址
16、变量例例 求学生的平均成绩求学生的平均成绩 #include float average(int stu10, int n); void main() int score10, i; float av; printf(Input 10 scores:n); for( i=0; i10; i+ ) scanf(%d, &scorei); av=average(score,10); printf(Average is:%.2f, av); float average(int stu10, int n) int i; float av,total=0; for( i=0; in; i+ )
17、total += stui; av = total/n; return av; 实参用数组名实参用数组名形参用数组定义形参用数组定义, int stu .2109score562312.88stu例例 数组元素与数组元素与 数组名数组名 作函数参数比较作函数参数比较12a调用前调用前a0a112a调用调用a0a112xy21xy交换交换12a前往前往#include void swap2(int x,int y) int z; z=x; x=y; y=z;main() int a2=1,2; swap2(a0,a1); printf(a0=%dna1=%dn,a0,a1);值传递值传递12a调用前调用前12ax调用调用21ax交换交换21a前往前往#include void swap2(int x) int z; z=x0; x0=x1; x1=z;main() int a2=1,2; swap2(a); printf(a0=%dna1=%dn,a0,a1);地址传递地址传递例例 数组元素与数组元素与 数组名数组名 作函数参数比较作函数参数比较例例 数组排序数组排序-选择法排序选择法排序void sort(int array,int n) int i,j,k,t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度美容院员工社会保险缴纳合同样本4篇
- 课题申报参考:面向2035年高等教育布局结构研究
- 民政局2025年离婚协议书起草与备案流程指导4篇
- 2025年度门头房屋租赁合同含租赁用途及经营方向限制4篇
- 河南省周口中英文学校高三上学期期中考试语文试题(含答案)
- 2025年度个人二手房交易反担保合同规范2篇
- 2025年度个人汽车货运风险分担合同范本
- 2025年度门禁监控设备生产与销售合同8篇
- 2025年度水电工程合同履约监管承包协议4篇
- 2025年度木结构建筑绿色施工与环保验收合同4篇
- 乔迁新居结婚典礼主持词
- 小学四年级数学竞赛试题(附答案)
- 鲁科版高中化学必修2全册教案
- 人口分布 高一地理下学期人教版 必修第二册
- 子宫内膜异位症诊疗指南
- 教案:第三章 公共管理职能(《公共管理学》课程)
- 诺和关怀俱乐部对外介绍
- 玩转数和形课件
- 保定市县级地图PPT可编辑矢量行政区划(河北省)
- 新苏教版科学六年级下册全册教案(含反思)
- 天然饮用山泉水项目投资规划建设方案
评论
0/150
提交评论