5.8变量作用域上机(教案)-《C语言程序设计》同步教学(电子工业出版社)

2024-07-10
| 5页
| 135人阅读
| 58人下载
普通

内容正文:

教案用纸 第 7 周 总第 21 次 学时:2 教学班级 课程: 授课教师: 课题:变量作用域上机 教学方法:多媒体演示、启发 教具:计算机 教学目标:使同学们掌握变量的作用域及内部变量和外部变量的使用 教学重点:变量作用域及多文件的运行 教学难点:变量作用域及内部变量和外部变量 主要教学内容: 变量作用域上机 【思考题5-8】 分析下列程序的输出结果,注意其中的静态局部变量和自动变量中值的变化。 【思考题5-9】 分析下列程序的输出结果,注意其中的自动变量、静态全局变量和全局变量,并注意多文件程序的编辑及运行方法。 【思考题5-10】 分析下列程序的输出结果,注意其中的外部函数说明语句。 【练习5-7】 分析下列程序运行结果。 课后回顾: 教案用纸 导入:我们上节课学习了变量的作用域及局部变量和全局变量的使用方法,这节课我们通过上机巩固所学的函数知识。 变量作用域上机 【思考题5-8】 分析下列程序的输出结果,注意其中的静态局部变量和自动变量中值的变化。 void test(); main() { test(); test(); test(); } void test() { int x=0; static int y=0; x++; y++; printf("x=%d,y=%d ",x,y); } 程序分析 (1)x是自动变量,每调用一次test函数,x都被动态分配存储空间(调用开始时分配空间,调用结束后回收空间),赋初值均为0,这样,函数test连续调用3次,输出变量x的值均是x=1。 (2)y是静态局部变量,第一次调用test函数时,系统就为变量y分配存储空间,并赋初值为0,调用结束后,变量y的存储空间不被回收。第二次和第三次调用test函数时,变量y的值就可以被传递或继承。这样,函数test连续调用了3次输出的变量y的值分别是y=1,y=2,y=3。 调试运行程序 程序运行结果如下: 【思考题5-9】 分析下列程序的输出结果,注意其中的自动变量、静态全局变量和全局变量,并注意多文件程序的编辑及运行方法。 项目文件ff.prj的内容如下: f1.c f2.c f3.c f4.c 文件f1.c中的内容如下所示: int a; /*全局变量a的定义*/ void fun1(),fun2(),fun3(); main() { a=35; fun1(); printf("main():a=%d ",a); fun2(); printf("main():a=%d ",a); fun3(); printf("main():a=%d ",a); } 文件f2.c中的内容如下所示: static int a; /*静态全局变量a的定义*/ void fun1() { a=27; printf("fun1():a(static)=%d ",a); } 文件f3.c中的内容如下所示: void fun2() { int a=16; printf("fun2():a(auto)=%d ",a); } 文件f4.c中的内容如下所示: extern int a; /*全局变量a的说明*/ void fun3() { a=48; printf("fun3():a(extern)=%d ",a); } 程序分析 (1)源文件f1.c中定义的全局变量a,由于没有使用static存储类型符,可以在源文件f2.c,f3.c,f4.c中使用。该程序的源文件f4.c中要使用全局变量a,所以应在f4.c文件的首部,用extern关键字对全局变量a进行说明。 (2)源文件f2.c中定义的全局变量a,使用了static存储类型符,即为静态全局变量,具有文件作用域,所以程序中的其余源文件不能使用它。 (3)在源文件f3.c中,函数fun2定义的变量a是局部变量,其作用域是从定义处开始,到所在的复合语句结束,即程序中的所有其他函数都不能使用它。 调试运行程序 程序运行结果如下: 【思考题5-10】 分析下列程序的输出结果,注意其中的外部函数说明语句。 (1)文件mainf.c中代码为: main() { extern input(char str[50]); /*声明在本函数中将要调用的在其他文件中定义的3个函数*/ extern del(char str[],char ch); extern output(char str[50]); char c; char str[50]; input(str); scanf("%c",&c); del(str,c); output(str); } (2)文件subf1.c中代码为: #include <stdio.h> /*定义外部函数*/ input(char str[50]) { gets(str);} (3)文件subf2.c中代码为: #include <stdio.h> /*定义外部函数*/ del(char str[],char ch) { int i,j; for(i=j=0;str[i]!='\0';i++) if(str[i]!=ch) str[j++]=str[i]; str[j]= '\0'; } (4)文件subf3.c中代码为: #include <stdio.h> /*定义外部函数*/ output(char str[ ]) { printf("%s",str);} 程序分析 整个程序由4个文件组成,每个文件包含一个函数。 主函数是主控函数,除声明部分外,由4个函数调用语句组成。其中scanf是库函数,另外3个是用户自己定义的函数。函数del的作用是根据给定的字符串str和准备删除的字符ch,对str字符串作删除处理。 算法如下:对str数组的字符逐个检查,如果不是被删除的字符就将它存放在数组中。从str[0]开始逐个检查数组元素值是否等于指定要删除的字符,若不是就留在数组中,若是就不保留。应该使str[0]赋给str[0],str[1]赋给str[1],str[2]赋给str[2],str[3]赋给str[3],str[5]赋给str[4],……请注意分析如何控制i和j的变化,以便使被删除的字符不保留在原数组中。我们只用一个数组,只把不被删除的字符保留下来,由于i总是大于或等于j,因此最后保留下来的字符不会覆盖未被检测处理的字符,最后将字符'\0'也复制到被保留的字符后面。 程序中3个函数都定义为外部函数。在main函数中用extern声明在main函数中用到的input、del、output是在其他文件中定义的外部函数。 调试运行程序 程序运行结果如下: 其中: abcdef (abcdef为输入的字符串) d (d为要删除的字符) abcefg (输出已删去指定字符的字符串的结果) 【练习5-7】 分析下列程序运行结果: 源程序如下: int n=1; main() { static int x=5; int y; y=n; printf("MAIN:x=%2d y=%2d n=%2d ",x,y,n); func(); printf("MAIN:x=%2d y=%2d n=%2d ",x,y,n); func(); } func() { static int x=4; int y=10; x=x+2; n=n+10; y=y+n; printf("FUNC:x=%2d y=%2d n=%2d ",x,y,n); } 解:程序说明:首先,main函数中的静态变量x被赋初值为5,y赋值为全局变量n的值1。输出3个变量,结果为:x=5,y=1,n=1。 然后调用func()函数,在该函数中,局部静态变量x被赋值为4;y被赋值为10,然后x加上2变为6;n为全局变量,在主函数中为1,则现在加上10变成11;y又被加上n(为11)后值为21。再输出3个变量,结果为:x=6,y=21,n=11。 返回到主函数中,输出主函数中的3个变量,上次主函数中的3个值为x=5,y=1,n=1。而x为局部静态变量,则还为5;而y是局部变量,也是原来值1;但n是全局变量,在func()函数中变成11,则回到主函数中也为11。所以输出结果为:x=5,y=1,n=11。 再次调用func()函数,局部静态变量x上次的值是6;y不是静态变量,所以重新被赋值为10;全局变量n值还是主函数中的11。让x的值加上2变成了8,n的值加上10变成了21,y的值加上n值为10+21等于31。所以输出结果为:x=8,y=31,n=21,程序运行结束。程序运行的结果如下: 小结: 这节课我们主要通过练习题巩固了函数定义、调用以及函数的嵌套调用及递归调用,希望大家通过本节课的习题对函数能有进一步的理解。 备 注 难点:本题主要为静态局部变量和自动变量的使用方法,通过本题主要弄清这些变量的定义及使用方法。 本题主要是各种变量的使用及多文件C程序的运行方法 介绍外部函数及外部函数说明的使用 学科网(北京)股份有限公司 $$

资源预览图

5.8变量作用域上机(教案)-《C语言程序设计》同步教学(电子工业出版社)
1
5.8变量作用域上机(教案)-《C语言程序设计》同步教学(电子工业出版社)
2
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。