2022年C语言教案-第十二周 .pdf
名师精编优秀教案第十二节函数1:通过本节课学习, 使学生理解函数的嵌套是什么并能够调用,学习局部变量和全局变量。1.1 学习目的:1. 理解函数的嵌套调用2. 理解数组作为函数参数3. 灵活使用局部变量和全局变量1.2 学习内容:1. 函数的嵌套调用2.数组作为函数参数3.局部变量与全局变量13 学习重点:局部变量与全局变量的应用14 教学方法:讲授法、举例15 学习方法:练习、总结16 学习时间第十八周2:回顾上一节 : 10 分钟 举例:实参与形参3:课程知识点讲解:名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 名师精编优秀教案具体知识点 1:函数的嵌套调用 25 分钟 知识讲解:函数的嵌套调用案例讲解:计算 s=22!+32! 。编程分析:可用两个函数,实现求解。一个是用来计算平方值的函数f1 ,另一个是用来计算阶乘值的函数f2 。主函数先调f1 计算出平方值,再在 f1 中以平方值为实参, 调用 f2 计算其阶乘值,然后返回 f1 ,再返回主函数,在循环程序中计算累加和。程序如下:long f1 (int p ) /*定义求平方值的函数 */ int k; long r; long f2(int ); k=p*p; r=f2(k); return r; long f2 (int q ) /*定义求阶乘值的函数 */ long c=1; int i; for(i=1;i=q;i+) c=c*i; return c; main() /*主函数 */ int i; long s=0; for (i=2;i=3;i+) s=s+f1(i ); /*调用函数,进行累加,参数为i*/ printf(ns=%ldn,s); 程序运行结果: s=362904 具体知识点 2:数组作为函数参数20 分钟知识点讲解:数组可以作为函数的参数使用,进行数据传送。数组用作函数名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 名师精编优秀教案参数有两种形式, 一种是把数组元素 (下标变量)作为实参使用;另一种是把数组名作为函数的形参或实参使用。数组元素作函数实参 : 数组元素就是下标变量,它与普通变量并无区别。因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。数组名作为函数参数 : 多维数组也可以作为函数的参数案例讲解:void nzp (int a8) int i; printf(nvalues of array are:n); for(i=0;i8;i+) if(ai0 )ai=0; printf(%d ,ai); main() int b5,i; printf(input 5 numbers: ); for(i=0;i5;i+) scanf(%d,&bi); printf(initial values of array b are:n); for(i=0;i5;i+) printf(%d ,bi); nzp(b); printf(nlast values of array b are:n); for(i=0;i5;i+) printf(%d ,bi); 程序运行结果: input 5 numbers: 1 3 5 7 9 initial values of array b are: 1 3 5 7 9 values of array are: 1 3 5 7 9 0 292 3522 last values of array b are: 1 3 5 7 9 老师提问:问题 1:按址传递会影响原始变量的值吗?问题 2:按值与按址的区别?具体知识点 3:局部变量与全局变量20 分钟 知识点讲解 : 局部变量名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 3 页,共 5 页 - - - - - - - - - 名师精编优秀教案在一个函数内部或复合语句内定义的变量,这些变量只在本函数或本复合语句内才能使用,所有形参都是局部变量。 auto(默认)所在函数调用结束时,其值自动消失。局部变量 register 如不赋初值,取不确定值为初值。 static 所有函数调用结束,其值仍保留。案例讲解:判断程序运行结果。main() int a=2,i; clrscr(); for (i=0;i3;i+) printf(%4d,f (a) ); f (int a) int b=0;static int c=3; b+;c+; return a+b+c; 程序运行结果: 7 8 9 程序运行分析: a i b c f(a)2 0 01 4 7 2 1 0 1 5 8 2 2 0 1 6 9 知识点讲解 : 全局变量 10 分钟一个源文件可以包含一个或若干个函数,在函数内定义的变量是局部变量,而在函数之外定义的变量称为全局变量。全局变量可以为本文件中其他函数共用。 extern(默认)允许本源文件中其他函数及其他源文件使用。全局变量 static 只限本源文件中使用。案例讲解:定义两个外部变量,判断程序运行结果。extern int x,y; /*可以省略 int 。如果没有此句,编译就会出错*/ main( ) clrscr( ); printf(x=%d,y=%dn,x,y ); x=100,y=200; 名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 名师精编优秀教案老师提问:问题 1:请举出局部变量和全局变量定义的关键字。4 本节总结 5 分钟考核点考核点 1:数组名和数组元素作为参数的异同考核点 2:全局变量与局部变量的定义及使用测试题测试题 1:写一个程序打印出2 的顺序各次幂。让它打印出2 的前 30 个幂, 看看会出现什么情况。用一个条件为真的循环打印2 的各次幂,看看会出现什么情况。测试题 2:从键盘输入两个正整数,然后求这两个数的最大公约数。扩展部分:扩展部分1:变量的存储类型扩展部分2:函数的递归调用学生问题汇总:问题 1:问题 2:作业:习题 1: 请到查出银行一年定期存款的利率和5 年定期存款的利率。假定现在要存入100元钱, 存款到期后立即将利息与本金一起再次存入。请写出程序, 计算按每次存一年和按照每次存5 年,总共存50 年后两种存款方式的得款总额。对两种情况都每隔 5 年输出一次当时的总金额。习题 2: (1)不用函数, 直接写一个主程序计算并输出直径为100 毫米和 150 毫米的金、银、铜、铁、锡球的重量(以kg 为单位输出)。(2)重新完成上面程序,先定义一个带有两个参数的函数,它能求出直径为x的比重为y 的圆球的重量, 而后在主程序里调用这个函数完成所需工作。将这样得到的解与不用函数的解比较,比较它们的长度、容易出错的程度。假设现在要求修改所用圆周率的精度,考虑用两种方式写程序的修改难度。(3)请写程序,求出边长为100 毫米和 150 毫米的金、银、铜、铁、锡立方体的重量。你可以利用前面的程序吗?是否很容易修改前面程序,完成这一计算?比较不用函数的解法和使用函数的解法在易修改和重复使用方面的效用。名师归纳总结 精品学习资料 - - - - - - - - - - - - - - -精心整理归纳 精选学习资料 - - - - - - - - - - - - - - - 第 5 页,共 5 页 - - - - - - - - -