第十二节函数
1:通过本节课学习,使学生理解函数的嵌套是什么并能够调用,学习局部变量和全局变量。
1.1学习目的:
1.理解函数的嵌套调用
2.理解数组作为函数参数
3.灵活使用局部变量和全局变量
1.2学习内容:
1.函数的嵌套调用
2.数组作为函数参数
3.局部变量与全局变量
1.3学习重点:
局部变量与全局变量的应用
1.4教学方法:
讲授法、举例
1.5学习方法:
练习、总结
1.6学习时间
第十八周
2:回顾上一节: [10分钟]
举例:实参与形参
3:课程知识点讲解:
具体知识点1:函数的嵌套调用[ 25分钟]
知识讲解:函数的嵌套调用
案例讲解:
计算s=22!+32!。
编程分析:可用两个函数,实现求解。一个是用来计算平方值的函数f1,另一个是用来计算阶乘值的函数f2。主函数先调f1计算出
平方值,再在f1中以平方值为实参,调用 f2计算其阶乘值,
然后返回f1,再返回主函数,在循环程序中计算累加和。程
序如下:
long f1(int p) /*定义求平方值的函数*/
{ int k;
long r;
c语言用递归函数求n的阶乘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=%ld\n",s);
}
程序运行结果:s=362904
具体知识点2:数组作为函数参数[20分钟]
知识点讲解:数组可以作为函数的参数使用,进行数据传送。数组用作函数
参数有两种形式,一种是把数组元素(下标变量)作为实参使用;
另一种是把数组名作为函数的形参或实参使用。
数组元素作函数实参: 数组元素就是下标变量,它与普通变量并无区别。因
此它作为函数实参使用与普通变量是完全相同的,在发
生函数调用时,把作为实参的数组元素的值传送给形
参,实现单向的值传送。
数组名作为函数参数:多维数组也可以作为函数的参数
案例讲解:
void nzp(int a[8])
{ int i;
printf("\nvalues of array are:\n");
for(i=0;i<8;i++)
{ if(a[i]<0)a[i]=0;
printf("%d ",a[i]);
}}
main()
{ int b[5],i;
printf("input 5 numbers: ");
for(i=0;i<5;i++)
scanf("%d",&b[i]);
printf("initial values of array b are:\n");
for(i=0;i<5;i++)
printf("%d ",b[i]);
nzp(b);
printf("\nlast values of array b are:\n");
for(i=0;i<5;i++)
printf("%d ",b[i]);
}
程序运行结果: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 29
2 3522
last values of array b are:
1 3 5 7 9
老师提问:
问题1:按址传递会影响原始变量的值吗?
问题2:按值与按址的区别?
具体知识点3:局部变量与全局变量[20分钟]
知识点讲解: 局部变量
在一个函数内部或复合语句内定义的变量,这些变量只在本函数或本复合语句内才能使用,所有形参都是局部变量。
auto(默认)所在函数调用结束时,其值自动消失。
局部变量 register 如不赋初值,取不确定值为初值。
static 所有函数调用结束,其值仍保留。
案例讲解:
判断程序运行结果。
main()
{ int a=2,i;
clrscr();
for (i=0;i<3;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 0→1 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=%d\n",x,y);
}
x=100,y=200;
老师提问:
问题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毫米的金、银、铜、铁、锡立方体的重量。你可以利用前面的程序吗?是否很容易修改前面程序,完成这一计算?比
较不用函数的解法和使用函数的解法在易修改和重复使用方面的效用。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论