内容正文:
教案用纸
第 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程序的运行方法
介绍外部函数及外部函数说明的使用
学科网(北京)股份有限公司
$$