版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
lesson程序的组织结构变量作用域演示文稿1/38目前一页\总数三十七页\编于十四点lesson程序的组织结构变量作用域目前二页\总数三十七页\编于十四点学习目标:31进一步加深对函数的理解掌握编译预处理命令3/38目前三页\总数三十七页\编于十四点3变量的作用域2变量的作用域指在源程序中定义变量的位置及其能被读写访问的范围位置是指在函数内还是函数外读写是指可以使用变量局部变量全局变量4/38目前四页\总数三十七页\编于十四点3变量的作用域2局部变量floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效在语句块内(函数)定义的变量在语句块内(函数)内有效5/38目前五页\总数三十七页\编于十四点3变量的作用域2说明:形参也是局部变量定义时不会自动初始化,除非程序员指定初值并列语句块各自定义的同名变量互不干扰main函数中定义的变量也是局部变量例不同函数中同名变量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}例复合语句中变量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++){inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;}for(i=0;i<N;i++)printf("%d",a[i]);}运行结果:54321例复合语句中变量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++){inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;}for(i=0;i<N;i++)printf("%d",a[i]);}例不同函数中同名变量voidmain(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=46/38目前六页\总数三十七页\编于十四点3变量的作用域2全局变量在函数之外定义的变量从定义变量的位置开始到文件结束有效。inta=13,b=-8;intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){printf("max=%d",max(a,b));}全局变量全局变量a,b的有效范围floatmax,min;floataverage(floatarray[],intn){inti;floatsum=array[0];
max=min=array[0];for(i=1;i<n;i++){if(array[i]>max)max=array[i];elseif(array[i]<min)min=array[i];sum+=array[i];}return(sum/n);}voidmain(){inti;floatave,score[10];
/*Input*/
ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxmin7/38目前七页\总数三十七页\编于十四点intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范围p,q的作用范围externcharc1,c2;externcharc1,c2;c1,c2的作用范围扩展后c1,c2的作用范围扩展后8/38目前八页\总数三十七页\编于十四点例:外部变量定义与说明intmax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){externinta,b;printf("max=%d",max(a,b));}inta=13,b=-8;运行结果:max=13externinta,b;intmax(){intz;z=a>b?a:b;return(z);}voidmain(){printf("max=%d",max());}inta=13,b=-8;9/38目前九页\总数三十七页\编于十四点inti;voidmain(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}例:外部变量副作用运行结果:*****10/38目前十页\总数三十七页\编于十四点#include<stdio.h>inta,b;/*a,b为全局变量*/voidf1(){intt1,t2;t1=a*2;t2=b*3;b=100;
printf(“t1=%d,t2=%d\n”,t1,t2);}voidmain(){a=2;b=4;f1();printf(“a=%d,b=%d”,a,b);}程序输出结果为:t1=4,t2=12a=2,b=10011/38目前十一页\总数三十七页\编于十四点将程序改为:#include<stdio.h>inta=2,b=4;/*a,b为全局变量*/voidf1(){intt1,t2;t1=a*2;t2=b*3;b=100;
printf(“t1=%d,t2=%d\n”,t1,t2);}voidmain(){intb=4;f1();printf(“a=%d,b=%d”,a,b);}
程序输出结果为:t1=4,t2=12a=2,b=4
结论:全局变量与局部变量同名时,局部变量的作用域屏蔽全局变量12/38目前十二页\总数三十七页\编于十四点3变量的存储类型3存储类型:数据在内存中存储的方式,它决定变量的生存期13/38目前十三页\总数三十七页\编于十四点3变量的存储类型3堆区栈区全局数据区代码区一个程序在内存中分为4个区域程序代码全局变量函数中变量使用malloc申请函数调用时生成,结束时收回14/38目前十四页\总数三十七页\编于十四点3变量的存储类型3动态变量:在栈区标准定义格式auto类型名变量名;函数执行时,动态地创建,函数执行结束后被收回,在次进入后,重新初始化auto可以省略15/38目前十五页\总数三十七页\编于十四点3变量的存储类型3静态变量:全局数据区标准定义格式static类型名变量名;程序执行过程当中一直存在16/38目前十六页\总数三十七页\编于十四点3变量的存储类型3例2分析程序结果:#include<stdio.h>intf(inta){staticints=0;s++;returns+a;}intmain(){inti,s=0;for(i=0;i<3;i++){s+=f(i);}printf(“s=%d”,s);return0;}17/38目前十七页\总数三十七页\编于十四点f(inta){intb=0;staticintc=3;b++;c++;printf(“%5d%5d%5d”,a,b,c);return(a+b+c);}voidmain(){inta=2,k;for(k=0;k<3;k++)printf(“%5d\n”,f(a));}例:考察静态局部变量的值:18/38目前十八页\总数三十七页\编于十四点例:auto变量的作用域voidmain(){intx=1;voidprt(void);{intx=3;prt();printf(“2ndx=%d\n”,x);}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}运行结果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域19/38目前十九页\总数三十七页\编于十四点voidmain(){voidgx(),gy();externintx,y;printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){externintx,y;x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}例:用extern扩展外部变量作用域运行结果:1:x=0y=02:x=135y=2463:x=135y=24620/38目前二十页\总数三十七页\编于十四点(1)intsub(intx){inty=0;staticintz=0;y+=x++,z++;printf("%d,%d,%d\n",x,y,z);returny;}练习:写出下列程序的运行结果:#include<stdio.h>voidmain(){inti;intsub(intx);for(i=0;i<3;i++)printf("%d\n",sub(i));}1,0,102,1,213,2,3221/38目前二十一页\总数三十七页\编于十四点(2)#include<stdio.h>intx=1,y=8;voidsub(inty){x++;y++;}voidmain(){ intx=2; sub(x); printf("x+y=%d\n",x+y);}x+y=1022/38目前二十二页\总数三十七页\编于十四点内部函数和外部函数函数本质上是全局的,因为一个函数要被另外的函数调用,但是,也可以指定函数不能被其他文件调用。根据函数能否被其他源文件调用,将函数区分为内部函数和外部函数。§内部函数如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static。即static类型标识符函数名(形参表)如staticintfun(inta,intb)23/38目前二十三页\总数三十七页\编于十四点§外部函数(1)在定义函数时,如果在函数首部的最左端加关键字extern,则表示此函数是外部函数,可供其他文件调用。如函数首部可以写为externintfun(inta,intb)这样,函数fun就可以为其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。本书前面所用的函数都是外部函数。(2)在需要调用此函数的文件中,用extern对函数作声明,表示该函数是在其他文件中定义的外部函数24/38目前二十四页\总数三十七页\编于十四点3多文件程序设计4如何划分模块读多少行的程序能让你不头疼?每个模块只负责一件事情,它可以更专心便于进行单个模块的设计、开发、调试、测试和维护等工作25/38目前二十五页\总数三十七页\编于十四点3多文件程序设计4多模块文件将一个程序分解成若干个模块,分别放在几个源文件中,形成一个项目(Project)对每一个源文件分别单独进行编译再将它们的目标代码连同标准函数库中的函数链接在一起,形成可执行文件。主模块:main()所在的文件模块之间通过互相调用函数头文件是联系的纽带26/38目前二十六页\总数三十七页\编于十四点3多文件程序设计4intx;voidmain(){………}
文件名file1.cexternx;/*使用file1.c中的全局变量x*/f1(){………}
文件名file2.c扩大全局变量的作用域27/38目前二十七页\总数三十七页\编于十四点例:有一个字符串,内有若干个字符,今输入一个字符,要求程序将字符串中该字符删去。用外部函数实现File.c(文件1)#include<stdio.h>voidmain(){externvoidenter_string(charstr[]);externvoiddelete_string(charstr[],charch);externvoidprint_string(charstr[]);/*以上3行声明在本函数中将要调用的在其他文件中定义的3个函数*/
charc;charstr[80];enter_string(str);scanf("%c",&c);delete_string(str,c);print_string(str);}28/38目前二十八页\总数三十七页\编于十四点file2.c(文件2)#include<stdio.h>voidenter_string(charstr[80])/*定义外部函数
enter-string*/
{gets(str);/*向字符数组输入字符串*/
}
file3.c(文件3)voiddelete_string(charstr[],charch)/*定义外部函数
delete_string*/{inti,j;for(i=j=0;str[i]!='\0';i++) if(str[i]!=ch) str[j++]=str[i];str[j]='\0';}29/38目前二十九页\总数三十七页\编于十四点File4.c(文件4)#include<stdio.h>voidprint_string(charstr[]){printf("%s\n",str);}
运行情况如下:abcdefgc↙(输入str)c↙(输入要删去的字符)abdefg(输出已删去指定字符的字符串)30/38目前三十页\总数三十七页\编于十四点3编译预处理命令5编译预处理:程序在编译之前做的一些处理编译预处理命令:以#打头31/38目前三十一页\总数三十七页\编于十四点3编译预处理命令5#define命令#define
宏名字
替换文本例如:#definePI3.14在#define之后,所有独立出现“宏名字”的地方(除了字符串外)都被“替换文本”替换32/38目前三十二页\总数三十七页\编于十四点3编译预处理5#include<stdio.h>#definePI3.14intmain(){floatl,s,r;scanf(“%f”,&r);l=2*PI*r;s=PI*r*r;printf(“l=%f,s=%f”,l,s);return0;}编译时:main(){floatl,s,r;scanf(“%f”,&r);l=2*3.14*r;s=3.14*r*r;printf(“l=%f,s=%f”,l,s);}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧城市和教育资源的公平分配考核试卷
- 农业科学与农村生态农业考核试卷
- 皮革制品的竞争力分析与市场占有率考核试卷
- 港口物流的供应商选择与价值评估考核试卷
- 发动机冷间歇工况下的节能优化策略考核试卷
- 橡胶制品行业的节能减排与环保治理考核试卷
- 专业技术培训中的决策与问题解决考核试卷
- 布艺窗帘的室内空气净化功能考核试卷
- 2023年中考化学复习专项突破:常见的酸碱盐
- DB11T 931.3-2012 户用分类垃圾桶(袋)技术规范 第3部分:垃圾袋
- 液化石油气瓶安全使用告知书范文
- 供应室护理责任组长竞聘
- 高中数学教师的专业发展路径
- LTC与铁三角从线索到回款
- 《旅游市场营销》课程教学设计
- 护理质量安全与风险管理的案例分析
- 工程流体力学课后习题答案-(杜广生)
- 小儿健脾胃知识讲座
- 【比亚迪新能源汽车企业财务风险识别与控制分析13000字(论文)】
- 小细胞肺癌查房
- 外研社英语五年级上册期中期末复习要点
评论
0/150
提交评论