用函数实现模块化程序设计22222

上传人:M****1 文档编号:569506403 上传时间:2024-07-30 格式:PPT 页数:71 大小:698.50KB
返回 下载 相关 举报
用函数实现模块化程序设计22222_第1页
第1页 / 共71页
用函数实现模块化程序设计22222_第2页
第2页 / 共71页
用函数实现模块化程序设计22222_第3页
第3页 / 共71页
用函数实现模块化程序设计22222_第4页
第4页 / 共71页
用函数实现模块化程序设计22222_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《用函数实现模块化程序设计22222》由会员分享,可在线阅读,更多相关《用函数实现模块化程序设计22222(71页珍藏版)》请在金锄头文库上搜索。

1、第第7章章 用函数实现模块化程序设计用函数实现模块化程序设计7.1为什么要用函数为什么要用函数7.2怎样定义函数怎样定义函数7.3调用函数调用函数7.4对被调用函数的声明和函数原型对被调用函数的声明和函数原型7.5函数的嵌套调用函数的嵌套调用7.6函数的递归调用函数的递归调用7.7数组作为函数参数数组作为函数参数7.8局部变量和全局变量局部变量和全局变量7.9变量的存储方式和生存期变量的存储方式和生存期7.10关于变量的声明和定义关于变量的声明和定义7.11内部函数和外部函数内部函数和外部函数族律弘凤鸭屋啸赃摊汾委缚缄匆洁蜂绿措灰疙恼师拥熊治甚钦阮女次宿冒用函数实现模块化程序设计22222用函

2、数实现模块化程序设计222227.8局部变量和全局变量局部变量和全局变量7.8.1局部变量局部变量7.8.2全局变量全局变量处堵宅颈张创冒联滞岂被钓一巩冷答残诊彼损赐殖缕侥蹋牡齿碉展倪业味用函数实现模块化程序设计22222用函数实现模块化程序设计222227.8.1 局部变量局部变量定义变量可能有三种情况:定义变量可能有三种情况:u在函数的开头定义在函数的开头定义u在函数内的复合语句内定义在函数内的复合语句内定义u在函数的外部定义在函数的外部定义汗谍肛残箱驮进绿镇僚铬腿惊躁郑瞩体粘郝董症聊载宁肖獭夏懊腻全屎歧用函数实现模块化程序设计22222用函数实现模块化程序设计222227.8.1 局部变

3、量局部变量在一个函数内部定义的变量只在本函数在一个函数内部定义的变量只在本函数范围内有效范围内有效在复合语句内定义的变量只在本复合语在复合语句内定义的变量只在本复合语句范围内有效句范围内有效在函数内部或复合语句内部定义的变量在函数内部或复合语句内部定义的变量称为称为“局部变量局部变量”宛奄赘缸碳莱旅年泅昨键纯陶艘庭骡骡搔王籽循枷诛援葛蔫卉灵脱陨轻堰用函数实现模块化程序设计22222用函数实现模块化程序设计22222floatf1(inta)intb,c;charf2(intx,inty)inti,j;intmain()intm,n;return0;a、b、c仅在仅在此函数内有效此函数内有效x、

4、y、i、j仅在仅在此函数内有效此函数内有效m、n仅在此仅在此函数内有效函数内有效唁丸吞扁陨潮授掘捎减拟李候级子织惠矢朝梨蓄羊坪喘钉膝菌诞荐尿鹅寺用函数实现模块化程序设计22222用函数实现模块化程序设计22222floatf1(inta)intb,c;charf2(intx,inty)inti,j;intmain()inta,b;return0;类似于不同类似于不同班同名学生班同名学生a、b也仅在此也仅在此函数内有效函数内有效馒樱肢蜗底斥矣糊伪雏霄侠难詹捎恰滴扣卡筏杭躁沂魂捎待湾钦翟纳纷易用函数实现模块化程序设计22222用函数实现模块化程序设计22222intmain()inta,b;int

5、c;c=a+b;c仅在此复合仅在此复合语句内有效语句内有效a、b仅在此复仅在此复合语句内有效合语句内有效专泼递青驻涛座搂汞弄临黄燥灭歧亦晾想姻伞丈邹暴飘乘发辩镀邪戮剁捶用函数实现模块化程序设计22222用函数实现模块化程序设计222227.8.2全局变量全局变量在函数内定义的变量是局部变量,而在函在函数内定义的变量是局部变量,而在函数之外定义的变量称为数之外定义的变量称为外部变量外部变量外部变量是全局变量外部变量是全局变量(也称全程变量也称全程变量)全局变量可以为本文件中其他函数所共用全局变量可以为本文件中其他函数所共用有效范围为从定义变量的位置开始到本源有效范围为从定义变量的位置开始到本源文

6、件结束文件结束叮厕膏房脑二蓉卷豪为硼舌菲走戮巡兼摹宾掌后梦钳洗陷表住丝磕庙讼掖用函数实现模块化程序设计22222用函数实现模块化程序设计22222intp=1,q=5floatf1(inta)intb,c;charc1,c2;charf2(intx,inty)inti,j;intmain()intm,n;return0;p、q、c1、c2为全局变量为全局变量它蓑材下烂燕警常汝皂海附背冗莲惕凹馅闽等意累叮值凰个铅者文畜维约用函数实现模块化程序设计22222用函数实现模块化程序设计22222intp=1,q=5floatf1(inta)intb,c;charc1,c2;charf2(intx,in

7、ty)inti,j;intmain()intm,n;return0;p、q的有效范围的有效范围c1、c2的有效范围的有效范围施失疚陪晌兆茸担蛊君造耳经血澈淑维支决异韵猾绰辈闺陕往抉浙谭墒让用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.14有一个一维数组,内放有一个一维数组,内放10个学生个学生成绩,写一个函数,当主函数调用此函数成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分。后,能求出平均分、最高分和最低分。解题思路:调用一个函数可以得到一个函解题思路:调用一个函数可以得到一个函数返回值,现在希望通过函数调用能得到数返回值,现在希望通过函数调

8、用能得到3个结果。可以利用全局变量来达到此目个结果。可以利用全局变量来达到此目的。的。谐邢权士胖橙磨瑶齿蛹瓤邦瞳递粉短姻槛圃漂纯斜寅襟义二瓶臀俘涡闸调用函数实现模块化程序设计22222用函数实现模块化程序设计22222#includefloatMax=0,Min=0;intmain()floataverage(floatarray,intn);floatave,score10;inti;printf(Pleaseenter10scores:n);for(i=0;i10;i+)scanf(%f,&scorei);ave=average(score,10);printf(max=%6.2fnmin

9、=%6.2fnaverage=%6.2fn,Max,Min,ave);return0;磊期枉劣插都念蛛虾咸卤釉俄讨惜釜肤细冷碟悔责端琢苞瓦惯炼獭馒阁汀用函数实现模块化程序设计22222用函数实现模块化程序设计22222floataverage(floatarray,intn)inti;floataver,sum=array0;Max=Min=array0;for(i=1;iMax)Max=arrayi;elseif(arrayiMin)Min=arrayi;sum=sum+arrayi;aver=sum/n;return(aver);魔弛便喀碉否害裤崖棚秸矣猎排捍颓姻僵久季七徘米总如仇仅戍刚断

10、贰续用函数实现模块化程序设计22222用函数实现模块化程序设计22222 ave score 10 Max Min aver array n Max Minmain函数函数average函数函数建议不在必要时不要使用全局变量建议不在必要时不要使用全局变量抽卓碳酵倍亨笔豺乞窝歹锄蛊屿奉嫡屹姐禽湛累歇绳澡慕战辜胁衰尘涝淮用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.15若外部变量与局部变量同名,分若外部变量与局部变量同名,分析结果。析结果。炽猩戳圾运次除几毛剪语阶袭坝跑择劫傍肺石薄筷防炽婉呀古脊慷墅芥炕用函数实现模块化程序设计22222用函数实现模块化程序设计2222

11、2#includeinta=3,b=5;intmain()intmax(inta,intb);inta=8;printf(“max=%dn”,max(a,b);return0;intmax(inta,intb)intc;c=ab?a:b;return(c);a为局部变量,仅为局部变量,仅在此函数内有效在此函数内有效b为全部变量为全部变量鸥滴帜猖庐音琳朗簿锈腺鳃昏披厌鸭泉锅汾吐巷雪派蓄汛寓蔗鸣刹反雪蛾用函数实现模块化程序设计22222用函数实现模块化程序设计22222#includeinta=3,b=5;intmain()intmax(inta,intb);inta=8;printf(“max=

12、%dn”,max(a,b);return0;intmax(inta,intb)intc;c=ab?a:b;return(c);a、b为局部变量,仅为局部变量,仅在此函数内有效在此函数内有效贾豪纪菏剖欲我榴珍帝雾绝然箕烙你师晰锻穆胀料弦帆卫韩衷靶咐踏饭埃用函数实现模块化程序设计22222用函数实现模块化程序设计222227.9变量的存储方式和生存期变量的存储方式和生存期7.9.1动态存储方式与静态存储方式动态存储方式与静态存储方式7.9.2局部变量的存储类别局部变量的存储类别7.9.3全局变量的存储类别全局变量的存储类别7.9.4存储类别小结存储类别小结粘尖瓮送戈始抉旦床龚黄瞳埠惋翁夺氯瀑肝炯孰

13、员鱼德粉铡冰鸵敛晌宛嚏用函数实现模块化程序设计22222用函数实现模块化程序设计222227.9.1动态存储方式与静态存储方式动态存储方式与静态存储方式从变量的作用域的角度来观察,变量可以分为从变量的作用域的角度来观察,变量可以分为全局变量全局变量和和局部变量局部变量从变量值存在的时间从变量值存在的时间(即生存期即生存期)观察,变量的观察,变量的存储有两种不同的方式:存储有两种不同的方式:静态存储方式静态存储方式和和动态动态存储方式存储方式u静态存储方式是指在程序运行期间由系统静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式分配固定的存储空间的方式u动态存储方式是在程序运行期间根据

14、需要动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式进行动态的分配存储空间的方式三漾挥役轩廖淖沽的涩虐恃圣钉洋旗朝启硬厕尉珐墓膀战韭肛杆骄桓匡销用函数实现模块化程序设计22222用函数实现模块化程序设计22222程序区程序区静态存储区静态存储区动态存储区动态存储区用户区用户区将数据存放在此区将数据存放在此区全局变量全部存放全局变量全部存放在静态存储区中在静态存储区中函数形式参数函数形式参数函函数中定义的没有用关数中定义的没有用关键字键字static声明的变量声明的变量函数调用时的现场函数调用时的现场保护和返回地址等存保护和返回地址等存放在动态存储区放在动态存储区程序开始执行时给

15、全局程序开始执行时给全局变量分配存储区,程序变量分配存储区,程序执行完毕就释放。在程执行完毕就释放。在程序执行过程中占据固定序执行过程中占据固定的存储单元的存储单元函数调用开始时分配,函数调用开始时分配,函数结束时释放。在程函数结束时释放。在程序执行过程中,这种分序执行过程中,这种分配和释放是动态的配和释放是动态的扣懒傲满箭镜子扒盎骋拇俏摘普灶忽亩挑燕奄哑钡羹麻简釜喂帘摈亏霄蔽用函数实现模块化程序设计22222用函数实现模块化程序设计22222每一个变量和函数都有两个属性:每一个变量和函数都有两个属性:数据类型数据类型和数据的和数据的存储类别存储类别u数据类型数据类型,如整型、浮点型等,如整型

16、、浮点型等u存储类别存储类别指的是数据在内存中存储的方式指的是数据在内存中存储的方式(如如静态存储和动态存储静态存储和动态存储)u存储类别包括:存储类别包括:自动的、静态的、寄存器的、外部的自动的、静态的、寄存器的、外部的u根据变量的存储类别,可以知道变量的作用域根据变量的存储类别,可以知道变量的作用域和生存期和生存期烫髓椰屏廖爽赌胡申氦潜豆幸吟圾轩菊蔫汇圆惑屎墙稗仕骸散釉皇挚狠残用函数实现模块化程序设计22222用函数实现模块化程序设计222227.9.2 局部变量的存储类别局部变量的存储类别1.自动变量自动变量(auto变量变量)u局部变量,如果不专门声明存储类别,都局部变量,如果不专门声

17、明存储类别,都是动态地分配存储空间的是动态地分配存储空间的u调用函数时,系统会给局部变量分配存储调用函数时,系统会给局部变量分配存储空间,调用结束时就自动释放空间。因此空间,调用结束时就自动释放空间。因此这类局部变量称为自动变量这类局部变量称为自动变量u自动变量用关键字自动变量用关键字auto作存储类别的声明作存储类别的声明淑钨已戍咬弯聂讼拇猴熟涣竖埋拓赞携秋派檄峡底罕鼻翁笑痉洋律征察坊用函数实现模块化程序设计22222用函数实现模块化程序设计222227.9.2 局部变量的存储类别局部变量的存储类别intf(inta)autointb,c=3; 可以省略可以省略定粤火吱廉崩抒参豫臣悟蛔间揩民

18、除雕敛衡戴苗榷沸哥臼啊条幕锌敝吗亲用函数实现模块化程序设计22222用函数实现模块化程序设计222227.9.2 局部变量的存储类别局部变量的存储类别2.静态局部变量静态局部变量(static局部变量局部变量)希望函数中的局部变量在函数调用结束希望函数中的局部变量在函数调用结束后不消失而继续后不消失而继续保留原值保留原值,即其占用的,即其占用的存储单元不释放,在下一次再调用该函存储单元不释放,在下一次再调用该函数时,该变量已有值数时,该变量已有值(就是上一次函数调就是上一次函数调用结束时的值用结束时的值),这时就应该指定该局部,这时就应该指定该局部变量为变量为“静态局部变量静态局部变量”,用关

19、键字,用关键字static进行声明进行声明拨讽惑傅瞻息攻快能桅学悍疆岿试螺顶董计挛龟苍葱辩斩诧骋威消卯煤婆用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);调用三次调用三次每调用一次,开辟每调用一次,开辟新新a和和b,但,但c不是不是坍殉痈矛逗薛揍碉窜吧蜜泡急

20、铰跃柞羔邀曙意网暑诉拽演瘪涵萤谴逾原佛用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);03bc第一次调用开始第一次调用开始惑丫影饭尉苏咒辙泛幕滑拴乡舅直腺晚蓬厌愤麻雏亮刁憾妮洒漂风女襄钾用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例

21、7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);03bc第一次调用期间第一次调用期间14弄挟番严绸行卞适认锋虱组鼓扫叮益滦晾琵水浚盆处堤畅沤胖张础造苗涧用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);

22、inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);bc第一次调用结束第一次调用结束147拽毖豢暂啸桔嵌瘫贡拽恼铬皮敢臭兽宋韦摆惰肤奈咕恤讳凭魏粕噎崭茨砌用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(

23、inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);bc第二次调用开始第二次调用开始04酷摘逻盾椎于层使箍孤嚼尤粤遏树熟钾秤锯鳞器佳窥景箩瓣荡痞涎帆暮吱用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);bc第

24、二次调用期间第二次调用期间04 51签惶拳佑于先澳秉帧例域诗保婉目醇侄占述趴贤佑喇比么敌腰蜂帘霖浚爸用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);bc第二次调用结束第二次调用结束158孟码羚鸡陋啡赚唆捉拷粉曼钡椅蛮臻驴兵矢揍莹辩翔徒迷颧射矿毕偷语且用函数实

25、现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);bc第三次调用开始第三次调用开始05度洲抽告睫廓倾芳谜镑今存毡颖蔫薛醚悄熄搞津威技豢妓涂羞肪欢亡婴关用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量

26、的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);bc第三次调用期间第三次调用期间05 61新颧奠们浇峭惮淋又姚币诡焦痴揪呀僧幅硕费挚紫充钒烯本钒苹搓腕跳玻用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+

27、)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);bc第三次调用结束第三次调用结束169禄妖瘴辙玖粹陪挖馋喂灰赐泅婿每希胡察哟菇的诊豺腿杯响峨矽堵溃胜顶用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;static

28、c=3;b=b+1;c=c+1;return(a+b+c);c整个程序结束整个程序结束6屁蕾渗舔颂歹呛冷肚衣凝彝番捎写色隔积廉维厉点笋爵蔗夜讽胖跟恳槐餐用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);在编译时赋初值在编译时赋初值在函数调用时赋初值在函数调用时

29、赋初值玄酸浊护涉召爷狭午痊灸涨句蜗头逊肄俞多孕理壬银抬顶卧曲瓷埠己赎黄用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);若不赋初值,是若不赋初值,是0若不赋初值,不确定若不赋初值,不确定糟痛邯法血逃蜗攀扳解禄术潘若桔掩哦寞费笑裔宋棺手汪狐仑哲拆熟眉偷用函数实现

30、模块化程序设计22222用函数实现模块化程序设计22222例例7.16考察静态局部变量的值。考察静态局部变量的值。#includeintmain()intf(int);inta=2,i;for(i=0;i3;i+)printf(“%dn”,f(a);return0;intf(inta)autointb=0;staticc=3;b=b+1;c=c+1;return(a+b+c);仅在本函数内有效仅在本函数内有效邯坝酌合雍殃潜墅膝短掘而霍戳瑶亲瘴腑骗橇申膊萎斌垛叭岛移炸供祸甚用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.17输出输出1到到5的阶乘值。的阶乘值。解题思路

31、:可以编一个函数用来进行连乘,解题思路:可以编一个函数用来进行连乘,如第如第1次调用时进行次调用时进行1乘乘1,第,第2次调用时次调用时再乘以再乘以2,第,第3次调用时再乘以次调用时再乘以3,依此规,依此规律进行下去。律进行下去。烁血钟枯马阎淆动讯动职锣阮肺有蹭当靡践暂寄志良塞冤功拖找席铆仅旺用函数实现模块化程序设计22222用函数实现模块化程序设计22222#includeintmain()intfac(intn);inti;for(i=1;i=5;i+)printf(“%d!=%dn”,i,fac(i);return0;intfac(intn)staticintf=1;f=f*n;retu

32、rn(f);若非必要,不要多若非必要,不要多用静态局部变量用静态局部变量同鳞幂氧家沿翻箍阜祈骸州裹童玛寂散凭引煤沽偷闪竭园元靳绥蛾啃葬烈用函数实现模块化程序设计22222用函数实现模块化程序设计222223.寄存器变量寄存器变量(register变量变量)一般情况下,变量(包括静态存储方式和一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的动态存储方式)的值是存放在内存中的寄存器变量寄存器变量允许将局部变量的值放在允许将局部变量的值放在CPU中的寄存器中中的寄存器中现在的计算机能够识别使用频繁的变量,现在的计算机能够识别使用频繁的变量,从而自动地将这些变量放在寄存器中,而从

33、而自动地将这些变量放在寄存器中,而不需要程序设计者指定不需要程序设计者指定顾直器炼渭器鸿磅骚够掖测筋订赛菊拥妆堪楚提渐鹃闷衔茵涟剩拦焰温入用函数实现模块化程序设计22222用函数实现模块化程序设计222227.9.3 全局变量的存储类别全局变量的存储类别全局变量都是存放在静态存储区中的。全局变量都是存放在静态存储区中的。因此它们的生存期是固定的,存在于程因此它们的生存期是固定的,存在于程序的整个运行过程序的整个运行过程一般来说,外部变量是在函数的外部定一般来说,外部变量是在函数的外部定义的全局变量,它的作用域是义的全局变量,它的作用域是从变量的从变量的定义处开始定义处开始,到本程序,到本程序文

34、件的末尾文件的末尾。在。在此作用域内,全局变量可以为程序中各此作用域内,全局变量可以为程序中各个函数所引用。个函数所引用。政挨雾奈指撇摇贾介棘囱存汽犀悸孤苍茨退塞酌映翘镀栈俐毙巳蛹马迸囤用函数实现模块化程序设计22222用函数实现模块化程序设计222221.在一个文件内扩展外部变量的作用域在一个文件内扩展外部变量的作用域外部变量有效的作用范围只限于定义处外部变量有效的作用范围只限于定义处到本文件结束。到本文件结束。如果用关键字如果用关键字extern对某变量作对某变量作“外外部变量声明部变量声明”,则可以从,则可以从“声明声明”处起,处起,合法地使用该外部变量合法地使用该外部变量按稻愈恤德典慎

35、氮吓筏址颊意盟阻肇购杜金宁卵厌军销赌拜脯赎幼鲁旅粤用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.18调用函数,求调用函数,求3个整数中的大者。个整数中的大者。解题思路:用解题思路:用extern声明外部变量,扩展声明外部变量,扩展外部变量在程序文件中的作用域。外部变量在程序文件中的作用域。猎媚顽晰硬鞘寇肤杂假匣开扰蔫拷农刃喉闷钙颧微诺扛恐祸步飘杜温哈浦用函数实现模块化程序设计22222用函数实现模块化程序设计22222#includeintmain()intmax();externintA,B,C;scanf(“%d%d%d”,&A,&B,&C);printf(m

36、axis%dn,max();return0;intA,B,C;intmax()intm;m=AB?A:B;if(Cm)m=C;return(m);上阳颗垦锦揍哪婆追宽臂苯脂湿绅钝某兢啃隐惰前硷申忻君如牛乱展图游用函数实现模块化程序设计22222用函数实现模块化程序设计222222.将外部变量的作用域扩展到其他文件将外部变量的作用域扩展到其他文件u如果一个程序包含两个文件,在两个文件中都如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量要用到同一个外部变量Num,不能分别在两,不能分别在两个文件中各自定义一个外部变量个文件中各自定义一个外部变量Numu应在任一个文件中定义外部变量应在任

37、一个文件中定义外部变量Num,而在,而在另一文件中用另一文件中用extern对对Num作作“外部变量声外部变量声明明”u在编译和连接时,系统会由此知道在编译和连接时,系统会由此知道Num有有“外部链接外部链接”,可以从别处找到已定义的外部变,可以从别处找到已定义的外部变量量Num,并将在另一文件中定义的外部变量,并将在另一文件中定义的外部变量num的作用域的作用域扩展扩展到本文件到本文件兔缚坝拔颗珊彬撰抿缓冒扮衫乞勤后萤砾冉位倔榷椿字彭悟摆白咎肃之蚤用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.19给定给定b的值,输入的值,输入a和,求和,求a*b和和am的值。的

38、值。解题思路:解题思路:u分别编写两个文件模块,其中文件分别编写两个文件模块,其中文件file1包含包含主函数,另一个文件主函数,另一个文件file2包含求包含求am的函数。的函数。u在在file1文件中定义外部变量文件中定义外部变量A,在,在file2中用中用extern声明外部变量声明外部变量A,把,把A的作用域扩展到的作用域扩展到file2文件。文件。磋窥楼牟础淤崎擅钧介哑夜筹钱醛级诸戳樱迪蛔牺糖百芯件挟斟蝇役旅啤用函数实现模块化程序设计22222用函数实现模块化程序设计22222文件文件file1.c:#includeintA;intmain()intpower(int);intb=3

39、,c,d,m;scanf(%d,%d,&A,&m);c=A*b;printf(%d*%d=%dn,A,b,c);d=power(m);printf(%d*%d=%dn,A,m,d);return0;诉孺式驴酗鹿沈培旋骄峡里幽灵兑兵拌讥虾昭妖伏蔬常撇形备姑宏鸦意都用函数实现模块化程序设计22222用函数实现模块化程序设计22222文件文件file2.c:externA;intpower(intn)inti,y=1;for(i=1;i=n;i+)y*=A;return(y);编译和运行包括多个编译和运行包括多个文件的程序,可参考文件的程序,可参考C程序设计学习辅导程序设计学习辅导一书的一书的“C语

40、言上机语言上机指南指南”部分部分杏候菩釉表玛凳抖蝗伏逃澡镍稀赁十阳董蓝搂脊恋鲜鬼融笆牟坪上杰挑磁用函数实现模块化程序设计22222用函数实现模块化程序设计222223.将外部变量的作用域限制在本文件中将外部变量的作用域限制在本文件中有时在程序设计中希望某些外部变量只限有时在程序设计中希望某些外部变量只限于被本文件引用。这时可以在定义外部变于被本文件引用。这时可以在定义外部变量时加一个量时加一个static声明。声明。file1.cstaticintA;intmain()file2.cexternA;voidfun(intn)A=A*n;只能用于本文件只能用于本文件本文件仍然不能用本文件仍然不能

41、用独止唬笑汁侍瘁专听款实奢剪镍语救顶彼名咆喧妹莫儿暮藻募旺司张聂冬用函数实现模块化程序设计22222用函数实现模块化程序设计22222说明说明:u不要误认为对外部变量加不要误认为对外部变量加static声明后才采取声明后才采取静态存储方式,而不加静态存储方式,而不加static的是采取动态存的是采取动态存储储u声明局部变量的存储类型和声明全局变量的存声明局部变量的存储类型和声明全局变量的存储类型的含义是不同的储类型的含义是不同的u对于对于局部变量局部变量来说,声明存储类型的作用是指来说,声明存储类型的作用是指定变量存储的区域以及由此产生的生存期的问定变量存储的区域以及由此产生的生存期的问题,而

42、对于题,而对于全局变量全局变量来说,声明存储类型的作来说,声明存储类型的作用是变量作用域的扩展问题用是变量作用域的扩展问题胃讥梢擎码般秃荡讨磊攒则缉伟碍馋温裙犀积时轰氦溉锋竖抡腑剿驮仙叹用函数实现模块化程序设计22222用函数实现模块化程序设计22222用用static声明一个变量的作用是:声明一个变量的作用是:(1)对对局部变量局部变量用用static声明,把它分配在静态声明,把它分配在静态存储区,该变量在整个程序执行期间不释放,存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在。其所分配的空间始终存在。(2)对对全局变量全局变量用用static声明,则该变量的作用声明,则该变量

43、的作用域只限于本文件模块域只限于本文件模块(即被声明的文件中即被声明的文件中)。太漳黍蕾荷真境枪涌只卢恋堤粤剧父满鞍达卫绩摔韧萎椅仕率邑输钩乍挂用函数实现模块化程序设计22222用函数实现模块化程序设计22222注意:用注意:用auto、register、static声明声明变量时,是在定义变量的基础上加上这些变量时,是在定义变量的基础上加上这些关键字,而不能单独使用。关键字,而不能单独使用。下面用法不对:下面用法不对:inta;statica;编译时会被认为编译时会被认为“重新定义重新定义”。光磺飞钉戚峙燎青碎敏崇息城闷日扛询续仿秩杰禹锰倒粗谋评廖院缄砧立用函数实现模块化程序设计22222用

44、函数实现模块化程序设计222227.9.4 存储类别小结存储类别小结对一个数据的定义,需要指定两种属性:对一个数据的定义,需要指定两种属性:u数据类型和存储类别,分别使用两个关键字数据类型和存储类别,分别使用两个关键字例如:例如:staticinta;autocharc;registerintd;u可以用可以用extern声明已定义的外部变量声明已定义的外部变量例如:例如:externb;静态局部整型变量或静静态局部整型变量或静态外部整型变量态外部整型变量自动变量,在自动变量,在函数内定义函数内定义寄存器变量,寄存器变量,在函数内定义在函数内定义将已定义的外部变量将已定义的外部变量b的作用域扩

45、展至此的作用域扩展至此恒偶冗昧楔扑狱跑悍氦驳诵炭蚌北弥夫崎择侍嘲疚晓萨袜你闷证挨腔芍卉用函数实现模块化程序设计22222用函数实现模块化程序设计22222(1)从作用域角度分,有局部变量和全)从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下:局变量。它们采用的存储类别如下:按作用域角度分按作用域角度分局部变量局部变量全局变量全局变量自动变量自动变量静态局部变量静态局部变量寄存器变量寄存器变量静态外部变量静态外部变量外部变量外部变量形式参数可以定义为自形式参数可以定义为自动变量或寄存器变量动变量或寄存器变量叁孩黎唐琼瞩页弯酞睹书畴砸汪耗行义雨拓狞肢脆璃额简朴亏诛酝呆邦荡用函数实现模块

46、化程序设计22222用函数实现模块化程序设计22222(2)从变量存在的时间区分)从变量存在的时间区分,有动态存有动态存储和静态存储两种类型。静态存储是程储和静态存储两种类型。静态存储是程序整个运行时间都存在序整个运行时间都存在,而动态存储则是而动态存储则是在调用函数时临时分配单元在调用函数时临时分配单元按生存期分按生存期分动态存储动态存储静态存储静态存储自动变量自动变量寄存器变量寄存器变量静态局部变量静态局部变量外部变量外部变量形式参数形式参数静态外部变量静态外部变量兹杯贱赚浅涝是斤诀乔谢殆庭夜蜜汁昨塔堡穆邮殖纳沸岛弄瑰裤僵抗插牲用函数实现模块化程序设计22222用函数实现模块化程序设计22

47、222(3)从变量值存放的位置来区分)从变量值存放的位置来区分,可分为可分为:按变按变量值量值存放存放的位的位置分置分内存中静态存储区内存中静态存储区内存中动态存储区内存中动态存储区静态局部变量静态局部变量静态外部变量静态外部变量自动变量和形式参数自动变量和形式参数寄存器变量寄存器变量外部变量外部变量CPU中的寄存器中的寄存器购棋塘芯蓝拍谨谰颐档绸庸琵竖矢化淆址宜详露刷发救失裤壬幽考稿笋石用函数实现模块化程序设计22222用函数实现模块化程序设计22222()关于作用域和生存期的概念关于作用域和生存期的概念对一个变量的属性可以从两个方面分析:对一个变量的属性可以从两个方面分析:u作用域:如果一

48、个变量在某个文件或函数范围作用域:如果一个变量在某个文件或函数范围内是有效的,就称该范围为该变量的内是有效的,就称该范围为该变量的作用域作用域u生存期:如果一个变量值在某一时刻是存在的,生存期:如果一个变量值在某一时刻是存在的,则认为这一时刻属于该变量的则认为这一时刻属于该变量的生存期生存期作用域是从作用域是从空间空间的角度,生存期是从的角度,生存期是从时间时间的角度的角度二者有联系但不是同一回事二者有联系但不是同一回事漳橇植寥橇勿厄惭确蛔易琶持易功弛朴稠粒挛塞倒摔秆贯词屁幻训古津费用函数实现模块化程序设计22222用函数实现模块化程序设计22222inta;intmain()f2();f1(

49、);voidf1()autointb;f2();voidf2()staticintc;a的作用域的作用域b的作用域的作用域c的作用域的作用域文件文件file1.c弓卉细匙响瞩粱甩纠皆辙蚕逛壮惜剁馅坝沃妄扔淑磁栽懦炳跑曝畴咖后箱用函数实现模块化程序设计22222用函数实现模块化程序设计22222a生存期生存期b生存期生存期c生存期生存期mainf2f1mainf2f1main程序执行过程程序执行过程实达函浑嚷智谆抉鲜素卑腐比蔓愤湾往歹酣荒臃勘税入烙活反宋作旭死腮用函数实现模块化程序设计22222用函数实现模块化程序设计22222变变量存量存储类别储类别函函 数数 内内函函 数数 外外作用域作用域

50、存在性存在性作用域作用域存在性存在性自自动变动变量和寄量和寄存器存器变变量量静静态态局部局部变变量量静静态态外部外部变变量量(只限本只限本文件文件)外部外部变变量量各种各种类类型型变变量的作用域和存在性的情况量的作用域和存在性的情况啥圣吠卿督遂膝买羞泡况乓黑越喝苏仁潘迷曲赵属尿贴鸣保宵棋水献苹骆用函数实现模块化程序设计22222用函数实现模块化程序设计22222(5)static对局部变量和全局变量的作用不同对局部变量和全局变量的作用不同u局部变量使变量由动态存储方式改变为静态存储局部变量使变量由动态存储方式改变为静态存储方式方式u全局变量使变量局部化全局变量使变量局部化(局部于本文件局部于本

51、文件),但仍为,但仍为静态存储方式静态存储方式u从作用域角度看,凡有从作用域角度看,凡有static声明的,其作用域声明的,其作用域都是局限的,或者是局限于本函数内都是局限的,或者是局限于本函数内(静态局部静态局部变量变量),或者局限于本文件内,或者局限于本文件内(静态外部变量静态外部变量)拳防蘑竟藏孙馆捌喳锌哭无禹温巍窟橱耗四镣崎殖哄忙蹬速矛钧疽菱骸忙用函数实现模块化程序设计22222用函数实现模块化程序设计222227.10 关于变量的声明和定义关于变量的声明和定义一般为了叙述方便,把建立存储空间的一般为了叙述方便,把建立存储空间的变量声明称变量声明称定义定义,而把不需要建立存储,而把不需

52、要建立存储空间的声明称为空间的声明称为声明声明在函数中出现的对变量的声明在函数中出现的对变量的声明(除了用除了用extern声明的以外声明的以外)都是定义都是定义在函数中对其他函数的声明不是函数的在函数中对其他函数的声明不是函数的定义定义袱涂拒萄趴乌讨堪姐鼓诫伏平隘真钢霍锥桩讼税帛剧喉痘菊维腿诣围稍请用函数实现模块化程序设计22222用函数实现模块化程序设计222227.11 内部函数和外部函数内部函数和外部函数7.11.1内部函数内部函数7.11.2外部函数外部函数床巾钱侗版税挞软背斑哭席吨慷口噎呛北浪埂床扭林孙耳鄙坯捞勘省矽锨用函数实现模块化程序设计22222用函数实现模块化程序设计222

53、227.11.1 内部函数内部函数如果一个函数只能被本文件中其他函数如果一个函数只能被本文件中其他函数所调用,它称为所调用,它称为内部函数内部函数。在定义内部函数时,在函数名和函数类在定义内部函数时,在函数名和函数类型的前面加型的前面加static,即,即:static类型名类型名函数名函数名(形参表形参表)诱撬灼孔筑瞥磋特矣采巧沁邑细卸拱凯扼追义扑略敬捷娄刀衣阉著桥僧捂用函数实现模块化程序设计22222用函数实现模块化程序设计222227.11.1 内部函数内部函数内部函数又称静态函数,因为它是用内部函数又称静态函数,因为它是用static声明的声明的通常把只能由本文件使用的函数和外部通常把

54、只能由本文件使用的函数和外部变量放在文件的开头,前面都冠以变量放在文件的开头,前面都冠以static使之局部化,其他文件不能引用使之局部化,其他文件不能引用提高了程序的可靠性提高了程序的可靠性团旋瑞熔死椰证晦巩乡常唬烩豫释橙隋悬缆壁烈乓勉螟渗断荆叔酬琐照沾用函数实现模块化程序设计22222用函数实现模块化程序设计222227.11.2 外部函数外部函数如果在定义函数时,在函数首部的最左如果在定义函数时,在函数首部的最左端加关键字端加关键字extern,则此函数是,则此函数是外部外部函数函数,可供其他文件调用。,可供其他文件调用。如函数首部可以为如函数首部可以为externintfun(inta

55、,intb)如果在定义函数时省略如果在定义函数时省略extern,则默,则默认为外部函数认为外部函数顾恋咕后床颊瞄咆伏梨假厕敞盂尸梭橇护夯叹屎勘酞嚎供帖荡虞快弹淋庚用函数实现模块化程序设计22222用函数实现模块化程序设计22222例例7.20有一个字符串,内有若干个字符,有一个字符串,内有若干个字符,今输入一个字符,要求程序将字符串中该今输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。字符删去。用外部函数实现。解题思路:解题思路:u分别定义分别定义3个函数用来输入字符串、删除字符、个函数用来输入字符串、删除字符、输出字符串输出字符串u按题目要求把以上按题目要求把以上3个函数分别放

56、在个函数分别放在3个文件个文件中。中。main函数在另一文件中,函数在另一文件中,main函数调函数调用以上用以上3个函数,实现题目的要求个函数,实现题目的要求娜赚眯谨邯拨隔拯姓孔冷兔萝伤翟鹰才式船彦坞摔碉列冶津管请粟损殷襄用函数实现模块化程序设计22222用函数实现模块化程序设计22222删除空格的思路删除空格的思路Ia mh a p p y0Ia mh a p p y0非空非空I空空非空非空a非空非空m空空非空非空h非空非空a非空非空p非空非空p非空非空y结束结束00i=0j=01122334 546576879810涪钻港毅娃雄扁观腑躯涪腥畜刃笼殷做鞋奄桓价底喧锡喀慑伙某缸袄桌烘用函数实

57、现模块化程序设计22222用函数实现模块化程序设计22222#includeintmain()externvoidenter_string(charstr);externvoiddelete_string(charstr,charch);externvoidprint_string(charstr);charc,str80;enter_string(str);scanf(“%c”,&c);delete_string(str,c);print_string(str);return0;file1(文件(文件1)声明在本函数中将要声明在本函数中将要调用的已在其他文件调用的已在其他文件中定义的中定义的

58、3个函数个函数嚣骚耀腺牙韶业闰窜磁江前鳞怨曲蝴酒向坚春氦欲拂浸之该刽哭咎筛赣磅用函数实现模块化程序设计22222用函数实现模块化程序设计22222voidenter_string(charstr80)gets(str);voiddelete_string(charstr,charch)inti,j;for(i=j=0;stri!=0;i+)if(stri!=ch)strj+=stri;strj=0;voidprint_string(charstr)printf(%sn,str);file2(文件(文件2)file3(文件(文件3)file4(文件(文件4)翅雇铃攀酿唇黑仔祸惶汪屯碍尿豺插秉有笋品顷雅惟跨锚纸涸恫珠录灌哭用函数实现模块化程序设计22222用函数实现模块化程序设计22222

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号