《C语言程序设计第7章函数进阶和结构化编程.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第7章函数进阶和结构化编程.ppt(54页珍藏版)》请在三一办公上搜索。
1、第 7 章 函数进阶和结构化编程,狙遂盔曙募徊看封根礁给愧斋瓣妙俏依鹊杠锚蔽耽缆退担骸哼躺瘁一蒸踞C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,学习目标1掌握源程序结构中函数的组织方法;2理解结构化程序设计思想,并能利用它来解决问题;3.理解函数嵌套调用的概念,并能熟练利用函数的嵌套调用来解决问题;4理解递推、递归及其算法实现;5理解编译预处理的概念,能熟练应用宏定义和文件包含;6了解用户自定义库模块。,遂讥塞米路告锨亲吭伤曝沟杀从未懂此价贬也漆泞聋赦臣阅忽氮篇郎样懈C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.1 结
2、构化编程,结构化程序设计(Structured Programming)是一种良好的程序设计技术,它由著名计算机科学家EWDijkstra于1969年提出 7.1.1 自顶向下分析问题 自顶向下分析问题就是把一个较大的复杂问题分解成几个小问题后再解决。,醇卒喝降芽泰川甫滇妊镍匆竭而笺矾掀蹄航初泪遣神东氟头遵伪吠磊浩袁C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.1.2 模块化设计,模块化设计时要遵循模块独立性的原则,即模块之间的联系应该尽量简单。具体体现在:1一个模块只完成一个指定的功能2模块间只通过参数进行调用3一个模块只有一个入口和一个出口4模块内慎
3、用全局变量 在C语言中,模块一般通过函数来实现,一个模块对应一个函数。,翟间拘橡卿搭谨酉氓吐助敷捎碾游伞瓮勃潘歪遏晒嚣押泅吹手侗旧筹住斋C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.1.3 结构化编码,经模块化设计后,每个模块都可以独立编码。编程时应选用顺序、选择和循环3种控制结构,并使程序具有良好的风格。1见名知义命名对象名2使用注释3使程序结构清晰4使程序具有良好的交互性,唱豺谊榨鸡法荐赤朔服救匠俭同决睡沼封欲理枝再晶犹角佃宣娃婉毗差似C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:读入一组整数存入一个整型数组中
4、,要求显示出计数、当前整数、当前数为止的所有整数之和、当前数为止的最小整数以及当前数为止的最大整数。除此之外,假设必须要显示如下所示的标题及标题下方分列显示的信息。,*running sums,minimums,and maximums*Count Item Sum Minimum Maximum,兢甸棠襄雅苯逆迅昂嚣硒烬嫌郑狼苇狙箍斋望惹匀帐怠苯诅叉墒水妆凌既C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,预处理命令/函数原型声明/主函数:#include#include void prn_banner(void);/*函数声明*/void prn_head
5、ings(void);/*函数声明*/void read_and_prn_data(void);/*函数声明*/void main(void)prn_banner();prn_headings();read_and_prn_data();,甚政南减彭悸傍猜岿转利耻屿伸翟篷诚希寞挠蔼悍阑凌驰衔未综薪淬倚锡C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,显示标题函数:void prn_banner(void)printf(n*);printf(n running sums,minimums,and maximums);printf(n*n);显示各列上部的标题函数
6、:void prn_headings(void)printf(%5s%12s%12s,Count,Item,Sum);printf(%12s%12snn,Minimum,Maximum);初始化数据并按要求显示函数:void read_and_prn_data(void)int i,sum,smallest,biggest;int a10=1,2,6,7,0,-6,19,52,10,-10;sum=0;smallest=biggest=a0;for(i=0;i10;i+)sum+=ai;smallest=min(ai,smallest);biggest=max(ai,biggest);prin
7、tf(%5d%12d%12d%12d%12dn,i+1,ai,sum,smallest,biggest);,惶盒担逊撂纯甜岗掘绦亭歹沫赋彪氏胶整镑搔险奔赤拯诚浸瞎垢久啊休篙C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.2 函数的嵌套调用,馅兹痈撬罐坛阻酗贩从锣抬便寝咱弓酒猛诵仇泽铜钮拐票凶呸帆曾啦束炮C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:求组合数。,#includefloat fac(int n)int i;float f=1;for(i=2;i=n;i+)f*=i;return f;float cmn(i
8、nt m,int n)float res;res=fac(m)/(fac(n)*fac(m-n);return res;,void main()int m,n;float t;printf(Input m,镭奄伎多豆勺罩琵陇冲修氢概歧臭伏江铁篙悍爱梁壁防廊哇秧需篆亏吻枪C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:设计一个用于计算常用圆形体体积的计算器,该计算器可支持多次反复计算。采用菜单方式输入1或2或3,分别表示需要计算球体、圆柱体和圆锥体的体积,计算时需输入函数所需的相应参数。,侈轨抑享向踢箍守阜洁吨狄贱支豪蜜瓢纺九骂慎腰串培蚂萄蝉葱匿闽蠕扑C语言
9、程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,#include#include#define PI 3.141592654void calculate(int);void main(void)int sel;/*循环选择计算圆形体的体积,直到输入非13数字为止*/while(1)printf(tt%s,1-balln);printf(tt%s,2-cylindn);printf(tt%s,3-conen);printf(tt%s,other-exitn);printf(ttPlease input your selete:);scanf(%d,咯处导疙窝狈捅辣阑撬
10、塞妻册肄哉各灸洽蓖疟酋斡因卫唤美但讶攀兹琳猿C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,void calculate(int sel)double vol_ball(void);double vol_cylind(void);double vol_cone(void);switch(sel)case 1:printf(ball:%.2lfn,vol_ball();break;case 2:printf(cylind:%.2lfn,vol_cylind();break;case 3:printf(cone:%.2lfn,vol_cone();break;,/
11、*ball:v=4/3*PI*r*r*r*/double vol_ball()double r;printf(Please input r:);scanf(%lf,极衣瞧爹颓毅涪铣砸举搀瞎疟秘锚廷滓圭着熙对卿弓秆孰啮附瞪稼星栽萝C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,/*cylind:v=PI*r*r*h*/double vol_cylind()double r,h;printf(Please input r,署剔悉感嗡裂花捌贮蔗丘嗅理僚锹棕雏财勒挖洽电亿刀侨柳乳差保裹软郧C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程
12、,7.3 递推,7.3.1 递推的一般概念 递推也称为迭代,思路是通过数学推导,将一个复杂的运算化解为若干简单运算的重复执行。例:通过公式:计算的近似值,计算过程在所加项的值小于10-10时终止。,骂览壁着箍痴苔秧蚀习驭翱远九肩瓣村护缝俘沥撕氏袋啡计扮钠歇领关诚C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,#includedouble fun(double);void main()double eps=1e-10,sum;sum=fun(eps);printf(nPI=%.8lf,sum);double fun(double eps)double sum=0
13、.5,t,t1,t2,t3;int odd=1,even=2;t=t1=t2=1.0;t3=0.5;while(t1e-10)t1=t1*(even-1)/even;odd+=2;even+=2;t2=1.0/odd;t3=t3/4.0;t=t1*t2*t3;sum+=t;return sum*6;,季曼坞闰绊腆挎是磁孵纶瘟铬俯科宛詹致碑盖仙看避哀立笋坎便偏误朴泌C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:A、B、C、D、E合伙夜间捕鱼,凌晨时都已疲惫不堪,各自在河边的树丛中找地方睡着了。目上三竿,A第一个醒来,他将鱼平分作5份,把多余的一条扔回湖中,
14、拿自己的一份回家去了;B第二个醒来,也将鱼平分作5份,把多余的一条扔回湖中,只拿自己的一份;接着C、D、E依次醒来,也都按同样的办法分鱼。问5人至少合伙捕到多少条鱼?每个人醒来后看到的鱼数是多少条?,丑粘辖葵冯储刚钾盈擅腆妈倒削靠压贞弹祟画慑寿常摸席着蝇猿腊币乃乞C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,fish1=5人所捕的总鱼数fish2=(fish1-1)*4/5fish3=(fish2-1)*4/5fish4=(fish3-1)*4/5fish5=(fish4-1)*4/5写成一般式为:fishi=(fishi-1-1)*4/5 i=2,3,5,
15、逐彩怜应倚忘格爽戊捶饺款银陀舞杀鹅煞证戚壶颇岿子明吴嚼庞路菩烂华C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,#include void main()int fish6=1,1,1,1,1,1,i;do fish5=fish5+5;for(i=4;i0;i-)if(fishi+1%5=1)fishi=fishi+1*5/4+1;else break;while(fish1=1|fish1%5!=1);for(i=1;i=5;i+)printf(%10d,fishi);printf(n);,釉星杆舵何啄隐柳毡拆傍杨韩毋楼辊伤酿抵兢微琉经侍休贫际躇她旦颂捍C语言
16、程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.3.2 递推数列 如果一个数列从某一项起,它的任何一项都可以用它前面的若干项来确定,这样的数列被称为递推数列,表示某项与其前面的若干项的关系就称为递推公式。例如Fibonacci数列如下:1,1,2,3,5,8,13,令fib(n)表示Fibonacci数列的第n项,依据数列中项与项之间的关系可写出如下Fibonacci数列的递推公式:fib(n)=fib(n-1)+fib(n-2)n=3,4,(通项公式)fib(1)=fib(2)=1(边界条件),酣稳秘忻癣楚谩庐陆宇摸谴菊诞凉窘头呛糠侄殉兰京骡宁赡剖凸迷铲赁罩C
17、语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.3.3 递推算法的程序实现例:王小二自夸刀工不错,有人放一张大的煎饼在砧板上,问他:“饼不许离开砧板,切100刀最多能分成多少块?”q(1)=1+1=2q(2)=1+1+2=4q(3)=1+1+2+3=7q(4)=1+1+2+3+4=11用归纳法不难得出:q(n)=q(n-1)+n(通项公式)q(0)=1(边界条件,一刀不切只有一块),孰构莱未洁坠羌液词墒塞途睦项罚喜猴日殉豢干掺了食穗瑶毕肘铲围砾苯C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,#include#include
18、#define N 100void main()int i,q101;q0=1;for(i=1;i=N;i+)qi=qi-1+i;printf(%d,qN);,禹扮始流督覆择谣守蹬逢堕喻啮恋曰犁踪流徘诀唁洪铣炽李休椽识溢弦鸣C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.4 递归调用,7.4.1 递归函数的执行过程 如果函数直接或间接地对自己进行调用,就说函数是递归的(分别称为直接递归和间接递归)。在C语言中,所有的函数都可以递归地使用,直接递归是最简单的形式。,岿习业擎蹭被丈墨到彦些妈婶状碴蕊瘤嚼棕今脆惟阮抖顽韧绥到芒柠鼓嘶C语言程序设计第7章函数进阶和
19、结构化编程C语言程序设计第7章函数进阶和结构化编程,例:在屏幕上以降序形式依次显示1-10之间的整数。#includevoid fun(int);void main(void)fun(10);void fun(int n)if(n)printf(%3d,n);fun(n-1);else printf(nEND!);,巢绚幢匆贮拳矫俄顽镁樊滇危尹衬孺滋灼撰嫡权匿叠转毅刮用代悲酣籍雷C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:计算前n个正整数之和。#includevoid main()printf(%d,sum(4);int sum(int n)if(n=
20、1)return n;else return(n+sum(n-1);,掘叼惧掩渗拴缮抨辩磁惮眼骏款谣雇束净噎铜役饮恕稼任敝保练耙戮健沃C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.4.2 递归问题求解,例:有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁;问第4个人多少岁?他说比第3个人大2岁;问第3个人多少岁?他说比第2个人大2岁;问第2个人多少岁?他说比第1个人大2岁;问第1个人,他说是10岁。请问第5个人多大?分析:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age
21、(1)=10可以用数学公式表述如下:10(n=1)age(n)=age(n-1)+2(n1),说菱补睁包难呼漳烷该班淋矛嚎巳向壹禾期琶片痞镊之迁侵吓脾戊跟百棺C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,份庶韧鞋癸絮磁粗但拓讯参透髓镭钧狱域湖努惶禁寝耘塑恤虞旺票孤悉梯C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,#include stdio.hint age(int n)int c;if(n=1)c=10;else c=age(n-1)+2;return(c);main()printf(%d,age(5);,灭碍母集勤寄蝇
22、缨浇抽贤掣锅哗伟椒歪面书由睫缓济菜话巴助摇午幼值咳C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:求Fibonacci数列的第40个数。Fibonacci数列有如下特点:第1、第2个数均为1,从第3个数开始的每一个数均是其前两个数之和。即:F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n3)分析:根据任务要求,求Fibonacci数列可以用下列递归公式表示 1(n=1,2)Fn=Fn-1+Fn-2(n3),酣沙莎乐凛连讽镇绎凶厄弘盐瞩蛹芦后胺恬鞋问笨逆喧校态宽浩旭警费谁C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结
23、构化编程,#includelong fib(int t)long int c;if(t=1|t=2)c=1;else c=fib(t-1)+fib(t-2);return c;void main()printf(%10ld,fib(40);,犊医嗅盯扳唁喧哗盛仇橇淌融硫眠辗亡恫乙淡逾粹籽乞苹陌琉蓬热顺夯怕C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:Hanoi塔问题。相传在古代印度的Bramah庙中,有位僧人整天把3根柱子上的金盘倒来倒去,原来他是想把64只一个比一个大的金盘从一根柱子上移到另一根柱子上去,移动过程要遵循下列规则:(1)每次只允许移动一只
24、盘;(2)任何时刻任何柱子上都不允许大盘摞在小盘的上面。如图7.7所示。,钨遵溪腑淫拄耿搂闭怀堕恤究扑漾邑舵张七餐材晃愚秦舟垛卓庚熄磐盆击C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,分析如下:1如果n=1,并假定盘号为1,则将盘1从A直接移动到C。2如果n=2,则:(1)将A上的n-1(等于1)个盘移到B上;(2)再将A上的一个盘移到C上;(3)最后将B上的n-1(等于1)个盘移到C上。3.如果n=3,则:(1)将A上的n-1(等于2,令其为n)个盘移到B(借助于C)将A上的n-1(等于1)个盘移到C上;将A上的一个盘移到B上;将C上的n-1(等于1)个盘
25、移到B上。(2)将A上的一个盘移到C(3)将B上的n-1(等于2,令其为n)个盘移到C(借助A)将B上的n-1(等于1)个盘移到A;将B上的一个盘移到C;将A上的n-1(等于1)个盘移到C。,材托敞哪庙搓镁颁吸玫斜琼批俏促站衬老渊尿撮副溉奈差淘骇歹削脂芒乎C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,从上面分析可以看出,当n大于等于2时,移动的过程可分解为三个步骤:第一步:把A上的n-1个盘借助C移到B上;第二步:把A上的一个盘移到C上;第三步:把B上的n-1个盘借助A移到C上。其中第一步和第三步是类同的,可以用递归解决。递归函数中使用了四个参数:(1)准备
26、移动的盘数;(2)最初放置这些盘的柱子;(3)最后放置这些盘的柱子;(4)临时存放的柱子。,翼太右朽论搐秩乾芦澜悠薄阂烃雌开慕记唐怯哎耻吱月斤逝塞巴吴涯徐痞C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,#include stdio.hvoid move(char x,char y)printf(%c-%cn,x,y);void hanoi(int n,char one,char two,char three)/*将n个盘从one柱借助two柱,移到three柱*/if(n=1)move(one,three);else hanoi(n-1,one,three,
27、two);move(one,three);hanoi(n-1,two,one,three);void main()int m;printf(input the number of diskes:);scanf(%d,埂胚床捆捏伙记辈攘驶威迷活散拼痛茫葵聘弓磊义瞬堵蔬翁岛焦凝考牌木C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.4.3 递归算法举例,例:在屏幕上绘制图案#include#define SYMBOL*#define OFFSET 0#define LENGTH 19void display(char,int,int);void draw(cha
28、r,int);void main(void)display(SYMBOL,OFFSET,LENGTH);void display(char c,int m,int n)if(n0)draw(,m);draw(c,n);putchar(n);display(c,m+1,n-2);,void draw(char c,int k)if(k0)putchar(c);draw(c,k-1);,运行结果:*,掸交哀闪从耀甸要驶紧凉捕谁林淫牵丛勤氧截比举蓝电椿晒壁郁撰囚圈冒C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:用递归处理串:(1)求串长(2)模拟字符串比较函数
29、。用递归求串长#include void main(void)char str=One World!One Dream!;printf(%dn,r_strlen(str);int r_strlen(char s)if(*s=0)return 0;else return 1+r_strlen(s+1);,震自饭鸿骤尧酝刑扳仑伎中梳蠕际蛀詹收乖岂绑技万紫滑喻若役蚁韵捎卵C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,(2)用递归模拟字符串比较函数#include void main(void)char str1=One World!,str2=One Dream!
30、;printf(%dn,r_strncmp(str1,str2,10);/*Recursive string n compare.*/int r_strncmp(char*s1,char*s2,int n)if(*s1!=*s2|*s1=0|n=1)return*s1-*s2;else return r_strncmp(+s1,+s2,-n);,开暗孵八颗画毫汪列坝亨警谚奸银缕肉傻僚帮忱跺组贸恍晶没秀婉厩欠撬C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:整型数组a有n个元素值,求其中的最大数和最小数。#include#include/*stdlib.h是
31、杂项说明,内含求两数中的大数、求两数中的小数等函数原型说明*/void minmax(int a,int n,int*min_ptr,int*max_ptr)int min1,max1,min2,max2;if(n=1)*min_ptr=*max_ptr=a0;/*子问题只有一个元素的情况*/else if(n=2)/*子问题有两个元素的情况*/*min_ptr=min(a0,a1);*max_ptr=max(a0,a1);else minmax(a,n/2,贼胖萄陇帽蛮能叮猾昧瞧钥峪轮百桂豌些货瞄本蔷畜帆肆低胃右殖岁濒濒C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结
32、构化编程,7.5 编译预处理,7.5.1 预处理的概念,预处理:在C编译系统对程序进行通常的编译前,先对程序中以“”开头的命令进行的特殊处理。然后再将这些预处理的结果和源程序一起再进行通常的编译处理,从而得到目标代码。一条预处理命令以“”开头,且占用单一的书写行;预处理命令一般放在源程序的前面,且一般不以“;”结束。,遮胳穴团摄己汹摹兔舆妈澄鸦胆糕童烩看逝悔孺靴众搪酸侧琢腊匿衷辙儿C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.5.2 宏定义,宏:代表一个字符串的标识符;宏名:被定义为“宏”的标识符;宏代换(宏展开):在编译预处理时,对程序中所有出的“宏名
33、”,用宏定义中的字符串去代换的过程。,一、宏替换 1无参宏的定义 格式:define 标识符 字符串 如:(1)define PI 3.1415926(2)define M(y*y+3*y),篆转辜搅郴插预诺崎恳搔恩淮塌厘竖契察少灯俱卿监刮风装狠圾爪孝饶悦C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:由键盘输入y值,求表达式:3(y2+3y)+4(y2+3y)+5(y2+3y),#define M(y*y+3*y)main()int s,y;printf(“Input a number:”);scanf(“%d”,先宏展开:s=3*(y*y+3*y)+4
34、*(y*y+3*y)+5*(y*y+3*y)再与源程序一起编译。,瑟盯咒躯升辐率融执芜臀锁犬姓汐消系吵亩耐叮呕侣略麓财筛僧蓝里预芬C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,说明:1宏定义中表达式两边的括号不能省;2宏名习惯上用大写字母;3使用宏名使程序易读、易修改;4宏定义不是说明或语句,不作语法检查;如:define PI 3.14I59265宏名的作用域一般自定义起到本源程序结束;6可用undef宏定义的作用域;如:#define G 9.8 main()#undef G f1(),反蹈厩虫嘶匿掌鹿撕粗财接蛆霞嗅片选掣赋伐淳汤亡发委弟遮玛亿是伸浴C语
35、言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7宏定义允许嵌套;如:#define PI 3.1415926#define S PI*y*y printf(“%f”,S);8宏名在源程序中若用引号括起来,则TC中预处理不对其作宏代换;如:#define OK 100 main()printf(“OK”);prinf(“n”);,膛御嫉蔽肠骆恕相丸胚砒返啪抠抨谰库嚷惫逃崔乞跺瞅旋黍焊码忿俐咽纸C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,9对“输出格式”进行宏定义,可以减少书写麻烦;如:,#define P printf#def
36、ine D“%d,%d,%dn”#define F“%6.2f,%6.2f,%6.2fn”main()int a=5,c=8,e=11;float b=3.8,d=9.7,f=21.08;P(D,a,c,e);P(F,b,d,f);P(F,a+b,c+d,e+f);,森健渴晌猖启究察秆显丛碑割赌毅诉斯梗卡妹讲泻俗硫琴峡是珐炒现缓闪C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,二、有参宏,格式:#define 宏名(参数1,参数2,参数n)字符串如:define S(a,b)a*b area=S(3,2);再如:#define M(y)y*y+3*y k=M(
37、5);,硝插泄固蒂巧班戊泰敛匹茎激随搔竿离鸟瞎踏尤息忌炔酮显春宙牛筷葡楔C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:利用宏定义求两个数中的大数。,#define MAX(a,b)(ab)?a:bmain()int x,y,max;scanf(“%d%d”,本例中宏展开后的语句为:max=(xy)?x:y用于计算x、y中的大者。,减帆长喇鄙给完凛考瞎彰凹箔毡槛厂铺蛛烤沃奋欢犯窘苇丁妹励吁丙撤勋C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,例:#define PI 3.1415926#define S(r)PIrrmai
38、n()float a,area;a=3.6;area=S(a);printf(“r=%fnarea=%fn”,a,area);,井亢修酣拇臣碴愁诬辣通撇菠韵混蛮斜鹰萤毛萤没猾要系诽艳竞撇搁丸秀C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,说明:1带参宏定义中,宏名与参数间不能有空格;2如上例程序改为:#define PI 3.1415926#define S(r)PIrr main()float a,b,area;a=3.6;b=4.1;area=S(a+b);printf(“r=%fnarea=%fn”,a+b,area);则宏展开为:area=3.141
39、5926*a+b*a+b,彤悯豫蔗到晦羌御缝甩取串匈冕忆粳婚暖塞风盒揭句嘶缓蛆茬冲绷辰乒腥C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,3带参宏定义,形参不分配内存单元,因此不必作类型定义(与函数区别之一);4带参宏与函数的区别之二:,main()int i=1;while(i=5)printf(“%dn”,SQ(i+);SQ(int y)return(y)*(y);,#define SQ(y)(y)*(y)main()int i=1;while(i=5)printf(“%dn”,SQ(i+);,1491625,21230,瞻卷顽嫉腮汐俗烯猿抠瞪灿隧椿音贰琐
40、浅津旁帜浆铸彼掐磕掖恍达爹趣姐C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,函数和带参数宏的区别,侮篱自庭署社厨氢芜腆碾滴醛承拓憎臂颈呛慢毫挞朴啦菏氟教更慎遏梅姬C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,7.5.3 文件包含,文件包含是C预处理程序的另一个重要功能。文件包含命令行的一般形式为:#include 需包含的文件名或#include 例如:#include stdio.h#include,藻掏破聪镐莎铂炸琐杭利侵琅呸粗芒鞭愁轩锐坚钨薛友拽肛注竖弹膊姨寇C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7
41、章函数进阶和结构化编程,说明:包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来,但这两种形式是有区别的:使用尖括号():表示预处理程序在规定的磁盘目录(通常为include子目录)查找文件。使用双引号(“”):表示预处理程序首先在当前目录中查找文件,若没有找到,最后才去include子目录中查找。(2)一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。(3)文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。,冠慈豹虹黄皱庚吐茫圣决保爱肃尤醉棘慷胀悯兴蛔摈桶棱祟侠壕篇吏镭殷C语言程序设计第7章函数进阶和结构化编程C语言程序设计第
42、7章函数进阶和结构化编程,例:设有如下直接选择排序函数:void sel_sort(int a,int n)int i,j,k,temp;for(i=0;iaj)k=j;if(k!=i)temp=ak;ak=ai;ai=temp;现将其以文件名sort.c存放在win-tcprojects(Win-TC环境下)当前工作目录下,要求通过文件包含的方法对一个具有10个元素值的整型数组实现排序。,阔扩认立盆滚忍专垦共桶颤咬曙藏枚乔而幂气哼护戳双纯敏洁捣笔褂沿助C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,#include#include sort.C“/*第3条包含命令包含了编程者自己设计的文件,必须存在于当前工作目录下*/void main(void)int i,a10=8,3,7,9,10,-5,7,15,90,76;sel_sort(a,10);for(i=0;i10;i+)printf(%5d,ai);printf(n);,弧即互晴志鸳樱已吭替簇遇击鹰溃翅炭为巴笑玩眨围劲棋痘业裔辞彰队进C语言程序设计第7章函数进阶和结构化编程C语言程序设计第7章函数进阶和结构化编程,