数组作函数参数、函数嵌套与递归调用、变量作用域.doc

上传人:豆**** 文档编号:17614031 上传时间:2022-05-25 格式:DOC 页数:11 大小:255.50KB
返回 下载 相关 举报
数组作函数参数、函数嵌套与递归调用、变量作用域.doc_第1页
第1页 / 共11页
数组作函数参数、函数嵌套与递归调用、变量作用域.doc_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《数组作函数参数、函数嵌套与递归调用、变量作用域.doc》由会员分享,可在线阅读,更多相关《数组作函数参数、函数嵌套与递归调用、变量作用域.doc(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流数组作函数参数、函数嵌套与递归调用、变量作用域.精品文档.C语言程序设计教案19-数组作函数参数、函数嵌套调用、变量作用域 教师姓名 韩晓翠 授课班级 授课形式边讲边练 授课日期 年 月 日 第 周 授课时数 授课章节第7章 用函数实现模块化程序设计7.5 函数嵌套调用7.6 函数递归调用7.7 数组名作函数参数7.8-7.11 变量作用域教学目的熟练掌握数组元素作函数参数熟练掌握数组名作函数参数掌握函数的嵌套调用熟悉变量的作用域教学重点数组元素作函数参数数组名作函数参数教学难点数组名作函数参数变量的作用域教学内容授课要点数组元素作函数参数数

2、组名作函数参数函数的嵌套调用变量的存储类别和作用域一、数组元素作函数参数数组元素作函数参数和普通变量作函数参数效果和用法一样问题1:调用函数输出数组元素的值。问题1解决:#includevoid myfun(int x,int y,int z);main() int a3=1,2,3; myfun(a0,a1,a2);void myfun(int x,int y,int z) printf(%d,%d,%dn,x,y,z); 运行结果:1,2,3注:数组元素作函数参数实现的是“值传递”。如:#include void swap1(int x,int y) int z; z=x; x=y; y=

3、z;main() int a2=1,2; swap1(a0,a1); printf(a0=%dna1=%dn,a0,a1);12a调用前FFAAFFAE12x调用时yFF01FAAC21x交换yFF01FAAC12a返回FFAAFFAE二、数组名作函数参数数组名作函数参数地址传递C语言规定,不带任何下标的数组名代表数组的首地址,即第一个元素的地址 例如,有定义语句int num10;那么,数组名num和&num0的意义是相同的。采用数组名作为函数参数就是将数组的首地址作为函数参数传递给被调用的函数。例如,以下程序段是把数组num的地址传给函数sort():main() int num10; s

4、ort(num);接收数组num的函数既可以定义为:void sort(int arr10)也可以定义为:void sort(int arr)即使定义为:void sort(int arr20)程序编译时也不会报错。因为C编译程序产生的代码是令函数sort( )接收数组num的首地址,并不生成具有20个元素的数组arr,也不进行下标边界检查。为了避免发生错误,向函数传递数组时,最好同时再用一个参数传递数组的长度。例如,对于上面的例子可以写程序:main() int num10; sort(num,10);void sort(int arr,int n)问题2:实现两个整型变量的值的互换。(假设

5、两个整型变量是一个长度为2的整型数组的元素)问题2解决-自定义函数#include void swap2 (int x2) /形参用数组定义, 等价于int x int z; z=x0; x0=x1; x1=z;main() int a2=1,2; swap2(a,2); printf(a0=%dna1=%dn,a0,a1);12a调用前12ax调用21ax交换21a返回问题3:定义一个函数,求全班学生的某门课程总分,并将总分返回到主函数中输出。问题3解决-自定义函数求总分#include float sum(float stu, int n); void main() float score

6、10;int i; float total; printf(Input 10 scores:n); for( i=0; i10; i+ ) scanf(%f, &scorei); total=sum(score,10); /实参用数组名 printf(sum is:%fn, total);float sum(float stu , int n) /形参用数组定义 int i; float total=0; for( i=0; in; i+ ) total += stui; return total;数组名作函数参数总结 数组名作函数参数地址传递 在主调函数与被调函数分别定义数组,且类型应一致,

7、实参用数组名,形参用数组定义 形参、实参数组名是地址变量模仿练习1、输入10个整数保存到数组中,定义函数求最大元素和该数是第几个数。2、在主函数输入8个整数保存到数组中,自定义函数对数组元素排序,并在主函数中将排序后的数组输出。参考程序:1.P193例7.92.P196例7.12讨论并总结1. 数组元素作函数参数时,实参和形参间的传递方式是什么?2. 数组名作函数参数时,实参和形参的写法有什么不同?结论1:数组元素作函数参数时,实参与形参间单向值传递。结论2:数组名作函数参数时,实参和形参间发生地址传递;在主调函数与被调函数分别定义数组,且类型应一致;形参数组大小(多维数组第一维)可不指定,形

8、参数组名表示地址;实参写数组名,形参为数组定义。学以致用寻找你身边的一个实际问题,用到数组名作函数参数。 例如:定义一个函数,实现10个同学身高的比较,从中找出最高身高,并返回到主函数中输出。P193例7.9三、函数的嵌套调用问题4问题3延续:定义两个函数,分别求全班学生(假设10名学生)的某门课程总分和平均分,并将总分和平均分返回到主函数中输出。问题4分析:float aver(float stu , int n) int i; float total=0; for( i=0; in; i+ ) total += stui; return total/(float)n; 求总分和平均分int

9、 sum(float stu, int n) int i; float total=0; for( i=0; in; i+ ) total += stui; return total;问题4解决函数嵌套调用 C规定:函数定义不可嵌套,但可以嵌套调用函数main( )调用函数a结束b函数a函数调用函数b自定义aver函数:#include float sum(float stu, int n);float aver(float stu , int n);void main() float score10,average,total; int i; printf(Input 10 scores:n

10、); for( i=0; i10; i+ ) scanf(%f, &scorei); total=sum(score,10); average=aver(score,10); printf(sum is:%f, aver is:%fn,total, average);float sum(float stu, int n) int i; float total=0; for( i=0; in; i+ ) total += stui; return total;float aver(float stu , int n) float total; total = sum( stu , n); ret

11、urn total/n;*自学内容:问题5:求三个数中最大数。自定义函数mymax3()和mymax2(),分别求出3个参数的最大值和2个参数的最大值,在mymax3()中两次调用mymax2()求出3个参数的最大值将值返回给主函数,输出该结果。函数首部为: float mymax3(float x, float y, float z) float mymax2(float x, float y)问题5解决函数嵌套调用#includefloat mymax3(float x, float y, float z);float mymax2(float x, float y);void main(

12、)float ino1,ino2,ino3,max; printf(请输入三个数:); scanf(%f%f%f,&ino1,&ino2,&ino3); max=mymax3(ino1,ino2,ino3); printf(max=%fn,max);float mymax3(float x, float y, float z) float max2,max3; max2=mymax2(x,y); max3=mymax2(max2,z); return max3;float mymax2(float x, float y) if(xy)return x; elsereturn y;四、函数的递归

13、调用1、定义:函数直接或间接的调用自身叫函数的递归调用直接递归过程: 间接递归过程:main() num1(); num1() num1(); main() num1(); num1() num2(); num2() num1(); 2、说明C编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出例:用递归法求n的阶乘(设n为小于15的正整数,由键盘输入)。#include int rfact(int n);main() int n,fact; printf(Input a integer number(1

14、5):); scanf(%d,&n); fact=rfact(n); printf(%d! =%d,n,fact);int rfact(int n) if(n=0|n=1) return 1; else return(n*rfact(n-1);练习:对于以下递归函数f,调用f(4),其返回值为:int f(int n) if(n) return f(n-1)+n; else return n;A、10 B、4 C、0 D、以上均不是参考答案:A模仿练习函数嵌套调用:求三个数中最大数和最小数的差值。自定义函数max ()和min(),求出3个参数的最大值和最小值,然后定义函数 dif(),调用m

15、ax() 和min(),求出3个参数中的最大值和最小值的差值,将值返回给主函数,输出该结果。函数首部为: float max(float x, float y, float z) float min(float x,float y , float z) float dif(float x,float y , float z)#include float dif(float x,float y,float z);float max(float x,float y,float z);float min(float x,float y,float z);void main() float a,b,c

16、,d; scanf(%f%f%f,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%fn,d);float dif(float x,float y,float z) return max(x,y,z)-min(x,y,z); float max(float x, float y,float z) float r; r=xy?x:y; return(rz?r:z);float min(float x,float y,float z)float r; r=xy?x:y; return(rz?r:z);随堂实践1、在主函数中输入一个整数,打印它的平方值和立方值,求平方

17、值和立方值分别用两个自定义函数完成。参考程序:#include int pingfang(int x);int lifang(int x);void main()int n,pf,lf;printf(输入数n:);scanf(%d,&n);pf=pingfang(n);lf=lifang(n); printf(%d的平方为%dn,n,pf);printf(%d的立方为%dn,n,lf);int pingfang(int x)return x*x;int lifang(int x)return(x*x*x);2、在主函数中输入一int型数字,要求自定义函数求出这个数的每一位数字并输出,但每两个数

18、字之间空一空格,如在主函数输入2003,则输出2 0 0 3。参考程序:#include void print(int x);void main()int n;printf(输入数n:);scanf(%d,&n);print(n);void print(int x)int i,j,a10;for(i=0;x!=0;i+)ai=x%10;x=x/10;for(j=i-1;j=0;j-)printf(%d ,aj);printf(n);五、变量的存储类别和作用域问题6变量存储类别#include void prt();void main() int x; for(x=1; x=5; x+)prt(

19、);void prt()static int y=0; y+;printf(%d, y);输出结果:12345去掉static后的结果为多少?11111问题6分析变量存储类别C程序运行时用户占用空间分为三部分: 程序区 静态存储区 动态存储区变量存储类别: 静态存储静态变量:用static关键字表示 动态存储自动变量:用auto关键字表示寄存器变量:用register关键字表示 自动变量:用auto关键字表示 如auto int p, f; /p,f为两个动态变量 在C中,默认的变量定义就是定义为动态变量 即上述的p,f变量定义与 int p, f; 是完全等价的。 静态变量:用static关

20、键字表示 在程序运行过程中一直有效。 注意,如果静态变量出现在函数中,不会因为函数的调用结束而丢失这个变量的值变量的作用域内部变量与外部变量的作用区域是不一样的。int a,b,c; /外部变量定义main() int x, y; /内部变量x, y, f的有效区域 float f; /内部变量 /其他语句a,b,c的有效区域int sum(int n) /内部变量s,i的有效区域 int s=0, i; /内部变量 /语句总结1变量的存储类型计算机的存储器分为内存和外存。还有一个小小的临时存储器称为寄存器,用以存储一些反复被加工的数据。C语言允许程序员区分是在内存还是在寄存器中开辟变量的存储

21、空间。2变量的生存期(1)在编译时分配存储单元。这种变量的生存期为程序执行的整个过程,在该过程中占有固定的存储空间,称为永久存储。(2)只在程序执行的某一段时间内存在。比如在函数的执行过程中存在。这种存储方式称为动态存储。3变量的作用域变量的可用域也分为全局可用和局部可用。C语言中,用“存储属性”来表示以上三个方面的属性,如表所示。名称寄存器变量自动变量静态变量外部变量存储属性registerautostaticextern存储位置寄存器主存生存期动态生存期永久生存 期作用域局部局部或全局全局模仿练习1、写出以下程序的运行结果:fun(int a)/a为形参,自动型局部变量 auto int

22、b=0; /b是自动型局部变量 static int c=3; /c是静态型局部变量,初始化仅进行一次 b+=1; c=c+1; return a+b+c;main() int a=2,i; /a和i都是自动型局部变量 for(i=0;i3;i+) printf(%dt,fun(a);2、写出以下程序的运行结果:int sum(int n); /函数声明int a=4,b=5,c=6; /外部变量定义main() int x=1, y=2; float f=3.0; x=sum(10); printf(x=%d,y=%d,f=%fn, x, y, f); printf(a=%d,b=%d,c=

23、%dn, a, b, c);int sum(int n) int s=0, i; for(i=1; i=n; i+) s = s+i; printf(s=%d, i=%dn, s, i); printf(a=%d,b=%d,c=%dn, a, b, c); return s;讨论并总结 1、函数的功能应该尽量保持相对独立还是依赖函数外的数据为好 ? 2、怎样使一个函数具有更大的通用性? 3、函数参数的值传递有哪些特点?学以致用 寻找你身边的一个实际问题,编写解决问题的程序,要求用到函数调用、参数传递。 例如:踢足球的时候,裁判要求换人,比如要用8号换下18号,请用函数模拟换人,并在主函数中调用。 作业每人必做将“控制流程”阶段完成的“小型计算器”功能改写为函数,并在主函数中调用,注意参数的类型定义及传参过程。作业选做学以致用:寻找你身边的一个实际问题,编写解决问题的程序,要求用到函数调用、参数传递。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁