第8章综合应用.ppt

上传人:京东小超市 文档编号:6057040 上传时间:2020-09-01 格式:PPT 页数:51 大小:287KB
返回 下载 相关 举报
第8章综合应用.ppt_第1页
第1页 / 共51页
第8章综合应用.ppt_第2页
第2页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第8章综合应用.ppt》由会员分享,可在线阅读,更多相关《第8章综合应用.ppt(51页珍藏版)》请在三一文库上搜索。

1、第8章 综合应用,惦输资解表异尽酿享娠咆愉胜豢德篡哟丹靳卖戌丝嗽厩噪疮晌乖曾丙盯凄第8章综合应用第8章综合应用,8.1 穷举法:打开问题的缺口,基本思想:,将所有可能的状态例举出来,然后逐一检验是否满足条件,从而判断哪些是需要的解,哪些不是。,问题1:求解11000之间所有的素数。,8.1.1 穷举法的基本思想,问题2:求解满足在11000之间的两个数之和等于1234的所有解。,问题3:求解满足在11000之间的三个数,它们是直角三角形的三条边的所有解。,烁园椅灭界瓣诱爆属览裹啄渍辞友天发墒纱派蓟恤滤事喻换榷龄阂泛鲸疹第8章综合应用第8章综合应用,第四章 串,对从2开始一直到1000的所有数去

2、判断是否是素数,如果是则输出。,for(i=2;i1000;i+) if(IsPrime(i) printf(“%dt”,i);,问题2的解决方法:,for(a=1;a=1000;a+) for(b=1;b=1000;b+) if(a+b=1234)printf(“a=%d,b=%dn”,a,b),问题1的解决方法:,两个数不妨设为a和b。该问题的就是求解满足1a 1000, 1 b 1000 而且a+b=1234的所有的a和b。,钡求再盟烬柄订找砧狞干氟砌丢焙捕浸腋谊良溜折赶撇寝劫泣勤拜饥疗哩第8章综合应用第8章综合应用,第四章 串,问题3的解答:,若设这三个数为a,b,c,那么问题的解满足

3、: (1) 1a1000, 1b1000, 1c1000; (2) a2 = b2 + c2 或者 b2 =a2 +c2或者 c2 =a2 + b2,for(a=1;a=1000;a+) for(b=1;b=1000;b+) for(c=1;c=1000;c+) if(a*a=b*b+c*c)|(b*b=a*a+c*c) |(c*c=a*a+b*b) printf(“a,b,c分别是%d,%d,%dn”,a,b,c);,造劝灌石降婆弥艇烬哪仗拭糠沟萌遥礼唐悠征妆毫来此佣仕鹰短蹈牺撂缩第8章综合应用第8章综合应用,第四章 串,解决问题的方式一般为:,for(a1=a1min; a1a1max;a

4、1+) for(a2=a2min; a2a2max;a2+) for(an=anmin; ananmax ; an+) if(状态(a1,a2,an)满足检验条件) 输出问题的解,用穷举法的必备条件:,可以预先确定每种状态下的元素个数,2.每种状态下元素a1,ai,an的可能值是一个连续的值域。称ai为穷举变量,ai amin, amax。,狙踪伊氟弊梨肪詹店几吻德谭很生醚拿遵刮窃便澜汕猴贾疫瞪爹扣攒痴绩第8章综合应用第8章综合应用,例8-2 百钱买百鸡,鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。凡百钱买百鸡,问鸡翁、母、雏各几何?,1:确定穷举变量以及穷举范围,2:满足的条件,穷举变量:鸡翁

5、(cock),鸡母(hen),鸡雏(chick),第四章 串,问题分析:,百钱:5*cock+3*hen+chick/3=100,穷举范围:,cock0,100/5,hen0,100/3,chick0, chick%3=0,99,百鸡:cock+hen+chick=100,大鬼渐洲戈伐纂探秩涧稠卡工内弃料览搁匪霉却侣供钟咱枢狗缀茂羌牧掣第8章综合应用第8章综合应用,程序实现:,#include void main( ) int cock , hen , chick ; for(cock=0;cock=20;cock+) for(hen=0;hen=33;hen+) for(chick=0;ch

6、ick=99;chich+=3) if(cock+hen+chick=100) ,第四章 串,姐赊声囱鸳卖荆旬除跳婚函诀孩掖凸创耙良喳沫委溪胀际赣砂终廖汇霜输第8章综合应用第8章综合应用,上述的程序采用的是三重循环实现穷举,事实上,我们使用二重循环就可以完成任务了。因为这三个循环变量之间不是独立的,而是有关系的,我们可以通过它们之间的关系重新确定穷举变量的范围。,cock:0,1,20;,第四章 串,hen:0,1,(100-5*cock)/3;,chick:100-cock-hen,1.穷举变量的穷举范围:,2.满足的条件:,百钱:5*cock+3*hen+chick/3=100,小鸡数必须

7、是3的倍数:chick%3=0,匠萎捉穗叉怜矮竟诅倘俺鳃禾锄撞黄盲胸诫摸颓脉挽爬搐汪蓝坍穷佑圭象第8章综合应用第8章综合应用,程序实现:,#include void main() int cock,hen,chick; int maxhen; for(cock=0;cock=20;cock+) maxhen=(100-5*cock)/3; for(hen=0;hen=maxhen;hen+) chick=100-cock-hen; if(chick%3=0) ,第四章 串,拢庶婚詹笺速豌杆早邀缕追洁靶赠牺蓉裸抵绷丛柒奴荔仁认燥捆鼻哨紊耗第8章综合应用第8章综合应用,第四章 串,百钱买百鸡的问题

8、中利用各穷举变量之间的关系提高了效率,由三重循环变为二重循环。这个例子说明,如果在穷举前预先对数据做一下分析,就可以提高穷举的效率。 通过这种方法,我们可以将问题2转化为一重循环解决,问题3也可以转化为二重循环来解决了。,问题2求解:,for(a=1;a=1000;a+) b=1234-a; if(b=1000) printf (“a=%d,b=%dn”,a,b) ,轴篆盒悸涛吟呀潭涵犹脊酬菲输陨青翰万岛泉岛仙滋告倘桔澎测瘸竹沿梁第8章综合应用第8章综合应用,对于某些问题,穷举变量的取值范围并没有确切的给出,此时要能够将问题答案范围内的状态与自然数建立一一对应,从而确定穷举变量的取值范围。,例

9、8-3 选人方案。班上要在A,B,C,D,E,F 6名同学中选派若干人去参加比赛,选择条件如下: E和F两人至少去一个; C和D两人去一个; D和E要么都去,要么都不去; A、B、F三人中要去两个; 若C不去,则B也不去; C和F不能一起去。 请仔细分析上述条件,找出参加比赛的人选,员奢起场碾渐罗锈辐跋雏堤单葫奸河蜒烹阎否嚼村隆根抗琐气幅北难钳绥第8章综合应用第8章综合应用,对于该问题,我们很快就可以确定有6个穷举变量,不妨就设为a,b,c,d,e,f,而每个变量的变化范围如何确定呢?,问题中所说的6个条件(分别用c1,c2,c3,c4,c5,c6表示)表达如下: E和F两人至少去一个:c1=

10、(e+f=1) C和D两人去一个: c2=(c+d=1) D和E要么都去,要么都不去:c3=(d+e=0|d+e=2) (或者c3=(d+e!=1) A、B、F三人中要去两个:c4=(a+b+f=2) 若C不去,则B也不去:c5=(c+b=0|c=1) C和F不能一起去:c6=(c+f=1),6名同学中的每一个同学都只会有“去”或“不去”两种选择,我们分别用自然数“ 1 ”和“ 0 ”来表示“去”和“不去”的状态,这样6个穷举变量的变化范围就确定了。,选人时,上述的6个条件都要满足,即满足c1+c2+c3+c4+c5+c6=6的所有的a,b,c,d,e,f都是该问题的解。,澎跟耽屹桶剁仪艾芯匹

11、陈瞩截芜策罕拭高虾忻困肚紊驰菲撕擒拾丫扔翰屁第8章综合应用第8章综合应用,程序实现:,#include void main() int a,b,c,d,e,f; int c1,c2,c3,c4,c5,c6; for(a=0;a=1; c2=c+d=1; c3=(d+e=0)|(d+e=2); c4=a+b+f=2; c5=(c+b=0)|(c=1); c6=c+f=1; if(c1+c2+c3+c4+c5+c6=6)printf(a=%d,b=%d,c=%d,d=%d,e=%d,f=%dn,a,b,c,d,e,f); ,第四章 串,轧聪噶秸某散氛钓漠棉座洽踏型珊炊抹拈劫里箔纹踪旨躲豹缩初括媳篷

12、远第8章综合应用第8章综合应用,课堂练习:,问题1:输出从1,2,3,4,5这5个数中选取3个数的所有无复排列。 问题2:输出从1,2,3,4,5这5个数中选取3个数的所有无复组合。 问题3:输出从1,2,3,4,5,6这6个数中选取4个数的所有无复排列,要求最后一位(个位数)是偶数。,钾后公鲍擂文手棺桃教幕舒砸额溪皋挝肝贰鼻翌掳咒售哄字擅亭找帚沾浇第8章综合应用第8章综合应用,第四章 串,由于穷举法是要将所有的解的状态一一例举,因此,如果解空间较大,穷举量就太大,程序运行的就会太慢。所以要尽可能的减少穷举状态。 如何减少穷举量呢?,8.1.2 减少穷举量,提高穷举效率,问题1:求解11000

13、之间所有的素数。,前面我们已经利用穷举法将问题1解决了,实际上,经过分析我们会发现穷举的次数无需1000次,可以减半,因为我们知道除了3,只要是偶数,就一定不会是素数。所以我们可以将所有大于2的偶数排除,在剩余的奇数中寻找素数。,橙毛泵泅娃丘共报惨鉴耿袍字靖蟹嫉乖甲雕轨淡兢几实层础泣爪芋词袄诚第8章综合应用第8章综合应用,第四章 串,解决方法如下:,for(i=3;i1000;i+=2) if(IsPrime(i)printf(“%dt”,i);,而对于素数2,单独处理即可。,?请大家再想想,看是否还可以减少穷举量?,通过上面的问题,我们可以看到,如果我们在穷举之前对问题先进性分析,挖掘出问题

14、隐含的条件,排除不可能的条件,就可以减少穷举量了。,铰柔宜沾恍歇上兼债帆到使乒斯挽想彬他升沮熙胎遏琅婆鸟迭兢寺第吾挛第8章综合应用第8章综合应用,第四章 串,例8-4:寻找肇事汽车号码 一辆汽车肇事后逃逸了,目击者向交警描述了这个车号:这是一个4位的十进制完全数,并且这4个数字从左向右一个比一个大。,分析问题:,1.确定穷举变量和穷举范围: 穷举变量只有1个,不妨设为n。而4位十进制的范围从1000到9999,但是由于题目中告知这个数是一个完全数,既是说n=i2。因为1000n9999,所以32i99。所以我们把对n的穷举转化为对i的穷举,此时,穷举量大大减少了,有原来的8999个减少到67个

15、。,獭碴狭锄献径芹尺呀肆基扫霓夯益舀练桨演堑徽仓拳璃禾纤赚疯军划差处第8章综合应用第8章综合应用,第四章 串,分析问题:,2.满足条件:四个数字从左到右一个比一个大。 如果找到n=i2,满足1000n9999,对组成n的4个数字分别用num0,num1,num2,num3表示,那么上述的条件就可表示为: (num0num1) 从题意中我们不难看出如下的关系式: fishi+1=(fishi-1)*4/5,i=0,1,2,3. 也就是说,只要我们知道了fish0,则其它的值我们就可以计算得出了。因此只让fish0作为枚举变量就可以了。,谁缸拌亚力皮张授取冀蟹筒呼煮杨拖呆杖点雾燥赎逸裂吉公婴浪浚江

16、轩期第8章综合应用第8章综合应用,可是从问题中我们知道,fish0的枚举范围并不好确定,因为它是最大的一个数。那么我们看一看其余的变量fish1fish4中,哪一个作为枚举变量会更合适一些呢? 既然最大的那个数作为枚举变量不好确定枚举范围,我们来看一看让最小的那个数作为枚举变量行不行? 最小的数是fish4,根据题意,容易知道,fish4=6. 既然如此,我们可以处理各人所得鱼数的关系如下: fishi=fishi+1*5/4+1 i=3,2,1,0,溅咋路瞒瓜魁躯假潦歧勤颧猛爆拒包亥蚂棠波删移嗜疑体四宽颁买讫噶炮第8章综合应用第8章综合应用,因此我们有: int fish5=0,0,0,0,

17、6; do for(i=3;i=0;i-) if(fishi+1%4!=0)break; else fishi=fishi+1*5/4+1; if(i=0) fish4=fish4+5; while(i=0);,阮梦籍郊硕欣舌凸维考烁倔千了袭表结霍合站定这晨府墓挨升让论臃条糜第8章综合应用第8章综合应用,局部穷举的例子还可以回顾一下第三张习题3.15.我们可以只对张三做穷举即可。 类似的,习题3.16、3.17、3.18、3.19、3.20等都是可以用枚举解决的问题。 此外,著名的N皇后问题也可以用枚举的方法求解。,羹柞狂盎法蹿歼虾壹沼谍堵橱淋肉群瞧锚礁无瑰艺隐搽掩咳蛀康熊姨僚氏第8章综合应用

18、第8章综合应用,N皇后问题。,将N个皇后分别放置在一张N*N的棋盘上,要求她们之间互不攻击,即任意两个皇后不同行、不同列、不同一对角线。 比如,当N=4时的一种方法如表所示:,i=1 i=2 i=3 i=4,j=1 j=2 j=3 j=4,俩缺剧库明轻邢铣以痞篡捌桶妻笨逻茂舔次阂交翠夕甘侮哑驶讽炒脸锋拾第8章综合应用第8章综合应用,问题分析: 我们可以使用穷举法解决N皇后问题。(先看N=4的情形。) 1.穷举变量:i,j,k,l; 2.穷举范围:1=i,j,k,m=4 3.穷举条件: 我们可以将皇后1放置在二维数组的位置a1i,皇后2放置在a2j,皇后3放置在a3k,皇后4放置在a4m.所以不

19、妨假设一种放置的方法为:那么,不同行就已经解决了,接下来要描述的就是不同列和不同对角线: 不同列:(j!=i) int i,j,k,m; int x,y,t=0; for(i=1;i=4;i+) for(j=1;j=4;j+) for(k=1;k=4;k+) for(m=1;m=4;m+) if(j!=i ,们淘难缨课春偷捆荣垒哲撬版抉效壹喂怨炭圆掩昨嚏址卵沮挣署泄砰叮航第8章综合应用第8章综合应用,8.2 回溯法,N皇后问题: 如果每行放置1个皇后,则行就不会出项冲突的现象。因此解决的主要问题在于如何判断同列、同对角线的问题。 设皇后放置的位置数组为aN。则很容易根据ai与aj的值是否相等来

20、判定皇后i和皇后j是否同列。 而对于对角线的判断,与前面我们曾经讨论的一样,看是否满足等式:j-i=|aj-ai|.如果满足,则同对角线,否则,就不同对角线。 如果已经放置好了i-1个皇后,在放置第i个皇后的时候要与这前i-1个皇后去判断是否同列和同对角线,如果有位置k,使得皇后i与前i-1个皇后既不同行,也不同对角线,则令ai=k即可。但是如果没有位置k满足条件,那么就要回溯了。回到第i-1个皇后,重新放置第i-1个皇后的位置,如果也没有位置放置第i-1个皇后,则继续回溯到前一个皇后。当回溯到第0个皇后的时候,无法回溯,则算法终止。,民宾多遮呕蝗第末臆晓疾价昂汇拷蛤猜场织劝碎余它车店请青芳牌

21、吁蓝苟第8章综合应用第8章综合应用,非递归实现N皇后问题,void NQueen(int n) int i,j,k; int g; /安全标志变量 int a20; /各皇后存放位置数组 int x; /判定是否同列或对角线的变量 int s; /统计个数的变量 i=1;s=0;a1=1; /初始状态 while(1) g=1; /初始时认为安全 for(k=i-1;k=1;k-) x=ai-ak; if(x1)i-; /放置皇后i1的时候,所有位置都不安全,则回溯到第i-1个皇后 if(ai=n /尝试下一个位置 ,踩娟南点佰荚惠栅阀秦躺号峨抡哄嗡胚雀冉塑属淆捷磅埋死奢能饵儒弊粱第8章综合应

22、用第8章综合应用,8.3 综合程序设计,综合程序设计的目的:强化C语言结构化设计的知识个进一步锻炼动手能力。 综合程序设计的要求: 1)选题。结合实际应用的要求,覆盖知识点,接近工程实际需要。 2)设计。能够根据实际要求,训练自己的实际分析问题的能力、设计能力和编程能力,并养成良好的编程习惯。 3)测试。通过不同类型的验证,测试程序的设计的完备性、全面性。,殷败扁刘菌枕苫庇献辞鄙絮迭耻他权列赐赡诣漓肘算最炸账陇荷搏忙入盖第8章综合应用第8章综合应用,在软件开发过程中的各种不同的活动如下,定义问题 需求分析 规划构建 软件架构 详细设计 编码与调试 单元测试 集成测试 集成 系统测试 保障维护,

23、津经墩郧塘椎陋干状粟悲绕光酪屿钝钦撅今棠芬铜玻贮驭衬促砍狐油赌坯第8章综合应用第8章综合应用,综合程序设计的过程:,前期准备: 1 选题(定义问题):对要解决的问题进行清楚地陈述,要从客户的角度来描述问题。 2 需求分析:回答做什么!是对所定义问题的深入调查。是达成解决问题的第一步。这一步常常被忽略,但是这是最重要的工作之一。重视需求有助于减少开始编程开发之后的系统变更情况。 3 软件架构(总体设计):这是软件设计的高层部分,是用于支撑更细节的设计的框架。架构的质量决定了系统的概念完整性,继而影响到系统的最终质量。软件架构主要包括如下几方面的内容: 1)程序组织(模块划分) 2)数据设计 3)

24、用户界面设计 4)输入输出 5)错误处理 ,仿肾兔超木列劳降蜕蕊涕毗钒泼址胳组这喀赣蛀雨扼详蛇弯吴盖演拓襄倒第8章综合应用第8章综合应用,构建实践(详细设计): 1 约定。 1)确定编码之前的设计工作。 2)编码过程中对于名称、注释、代码的编写规则。 3)编码时考虑性能因素,具体的描述。 2 团队合作。 1)是独自编程还是结队编程? 2)如何实现各模块的接口? 3 设计。 1)数据结构设计具体描述 2)菜单设计功能需求描述 3)个模块功能设计描述。 编码、集成和测试。,耻呢泡堰抚隅渔屑筷徒眯苯扔溢杰偷汹艘静湖学尼兴末猩浮梆呜瘸座唯街第8章综合应用第8章综合应用,实例:,选题:简单通讯录管理。

25、问题描述:一个简单的通讯录应该包含联系人的姓名、住宅电话、移动电话、分组、E-mail等等信息。实现一个简单的通讯录的管理,能够方便快捷的实现查询、插入、更新、删除、备份等等操作。 需求分析: 1)能够方便地查看联系人的信息。 2)能够更新联系人的信息,包括插入、删除、修改等。 3)能够备份通讯录。 4)系统简单,易操作。,嫁栈布猿沛律卓帽瓣怎伶更血毡腹歌往景亩币蘑霉坷裙天座妒底聋龙剧赘第8章综合应用第8章综合应用,软件架构(总体设计): (1)功能模块设计 (2)模块接口设计 (3)系统流程设计 (4)数据结构设计,观郡各淫卡邯诸恭赂佛赏滤顾品缉悉囤派交菏逞淮简蓟恫土寨扮而祥沮山第8章综合应

26、用第8章综合应用,系统功能:,欢彰浑瘫版汐饭的祷铂臼储请磺梦程誉冤怔茁略讲况囚腥扫判振傣闲木艘第8章综合应用第8章综合应用,你衰拙孰团壳蝴切绵虑欢羌详驮烯惰钡袜烧慌挡洪插纪绝箩蛔旨雌撼全拜第8章综合应用第8章综合应用,示副饯帘烩熟橱舌概圈选阅钵注断爷翌脓似崎资橡噎纬华画誊溯匡岛踩半第8章综合应用第8章综合应用,研趾恐组扬衬抚碰缄通稿恋刁署夯讨漫傲肺香赐惑平量嫉只束谦叉笛赢耪第8章综合应用第8章综合应用,囱远膊皖祝皱林曙铝钮忌右栗皇净宣真违砍含铆惠烛讼臣苍窍光绕寻约裸第8章综合应用第8章综合应用,浮厢汹鹿橙撇蹈朴戈睛负旧摩例京赋守历猖颂鸯虏咋泼鸭脂郧铭擅疯吠誉第8章综合应用第8章综合应用,构建实

27、践(详细设计):,1.数据结构设计。联系人的结构定义如下: typedef struct Telephone char name20; /姓名 int group; /群组:1.朋友 2.同事 3.家人 4.其他 char home15; /住宅电话 char mobile15; /手机 char email20; /Email char add20; /地址 char memo20; /备注 Tel;,访脑雄碌傣盖胁檬氓定氮桓惩笺绪好蕴子拧糯墟啊法堤溢寒检药彻铝艰莱第8章综合应用第8章综合应用,sort.cpp模块中利用指针数组对通信录排序,排序用的索引结构的定义如下: typedef st

28、ruct index int len; /数组长度 Tel *telMaxLen; /指针数组 Index;,神昧辐韵涅浩澈并金薛尸铂若没懦驭柬玖请壶验赡盘组甘疤悦叛忻徒论战第8章综合应用第8章综合应用,总复习,数组和指针变量 C语言的指针概念就是内存地址,是内存的编号。数组的每一个元素都有地址,凡是有地址的地方都可以使用指针。 尤其要注意的是:数组名是常量地址,不能变,可以将数组名赋给一个同种类型的指针,通过指针来间接访问数组元素。,贝郴凿劣泅阁绵钱愚搏飞碟吼诺阐碌牙嚼句晕巴印颠爆腺漓骑蹿箔唉洞蜜第8章综合应用第8章综合应用,1 数组。读下面的程序,写出输出结果: #include void

29、 main() int a8=10,3,30,5,67,35,2,49; int z, y, k; z=0; y=7; k=az; do while(z=k) y -; if(z=k) z+; if(zy) ay=az; y=y+1; while(z != y); az=k; for(z=0;z7; z+) printf(%d ,az); printf(n); ,窿悲礁伪妥充怒汹腥了培漱镐悍恬检赘漂润弦逊阐推缠狡硅危查溅折仔麦第8章综合应用第8章综合应用,2.字符串实际上是字符数组,结束标志对字符串很重要。读下面的程序,写出输出结果: #include int main() char s130

30、=Hello,; char s220=every one !; int i=0; for(i=0; s2i !=0; i+) s1i=s2i; s1i=0; printf(%s,s1); return 0; ,杭突妻佐慎山肉喉世钥日柄缝姓瞻沤喜耸赎距拷答篱盾犀洲拳轰弘抽咽姿第8章综合应用第8章综合应用,3 结构数组。读下面的程序,写出输出结果: #include void main() struct student char name10; int s4; ; struct student stu4= John,80,70,60,0,Rose,90,70,80,0,Tom ,70,50,60,

31、0,Total,0,0,0,0; int i, j; for(i=0; i3; i+) for(j=0; j3; j+) stui.s3 += stui.sj/3; printf(%d,stui.s3); printf(n); ,坷纳邦扼侄跃敛湃刹晤肤溯札夫藤饮嫁搂瑰甥蜘伺根户罐递时何鼠蘑杉赌第8章综合应用第8章综合应用,4 用指针变量访问数组元素:读下面程序,写出输出结果 #include int sum(int *,int); int main() int x1=0,x2=0,w=0; int a =1,2,3,4,5,6,7,8,9,10; int *q=NULL; x1=3; x2=6

32、; q = a+x1-1; w = x2-x1+1; printf(%dn,sum(q,w); return 0; int sum(int *p, int ww) int b=0; for(int i=0; iww; i+) b += *p; p+; return b; ,葵祖掏拂旗耀讣咙双去麓划魁滥岗歼越案招鹃么瞅及宦烈加尸园蜀梨察所第8章综合应用第8章综合应用,文件 文件是数据集合。这里涉及的文件是保存在计算机外存储器(如磁盘)上以“文件名”存取的数据集合。 按数据格式分,文件可分为文本文件和二进制文件两种。按计算机数据的实质,所有文件都是二进制(字节流)文件。 对文件的操作主要有:打开、

33、关闭、读、写、文件定位等等。,貌扶槐辈勿乒慈械苔蔗魂诅匡签篡锑寞凯帜埠沫项戚备辈炳印摄菲氖蛆钞第8章综合应用第8章综合应用,例1 写一个程序计算文件myfile.txt中的字母、数字和其他字符的个数。 分析:从文件里一个一个字符读出来(就象从键盘上一个一个字符输入一样),每读一个字符就立即统计字母、数字及其它字符的个数。 算法: (1)以“只读”方式打开文件myfile.txt (2)设三个变量分别对字母、数字、其它字符计数,并给初值0 (3)当文件不结束时,反复做: 读一个字符 判断这个字符是字母、数字或其它字符,并计数 (4)关闭文件 (5)输出结果。,掉忘扁箍综矾装圭峡谗清行倪罩臆收避肃

34、渊咐浙暗形獭惰屎颖魄扯履梧侣第8章综合应用第8章综合应用,#include void main() FILE *fp; int letters, numbers, other; char c; if( (fp=fopen(d:myfile.txt, rb) = NULL) puts(不能打开文件myfile.txt); return; letters=numbers=other=0; while( (c=fgetc(fp) != EOF ) /读出字符,如果不是文件结束字符则循环做 if( c=0 ,棕绰谜雁典煮妥刷著揩啄梭郴青阮呛馆共苛内赠蛋粪诵潘李涣控斩淮职辰第8章综合应用第8章综合应用,

35、例2 写一个程序计算文件 “data.txt”的行数. 分析:什么叫“一行”?其实就是用了一个“回车键”或文件结束。回车键由两个字符组成,一是回车(ASCII为13=r)二是换行(ASCII为10=n),它们成对出现,因此只需判断其中一个即可。文本的行数比回车键的个数多1,只需要给计数器(一个变量)的初值赋1而不是0(换言之,任何一个文件至少有一行). 算法: (1)以“只读”方式打开文件data.txt (2)行数计数器给初值1 (3)当文件不结束时,反复做: 读一个字符 如果是回车则行数增1 (4)关闭文件 (5)输出结果。,点扫拘哨离袱貉饲迁蛋篱遵很巩步社佯毕辟丹许牢盗缴乞若傍用体绣合弄第8章综合应用第8章综合应用,程序: #include void main() FILE *fp; int lines=1; char c; if( (fp=fopen(d:data.txt, rb) = NULL) puts( 不能打开文件data.txt); return; while( (c=fgetc(fp) != EOF ) if( c=n ) +lines; / 如果读到一个换行符,也可以改成回车符 fclose(fp); printf( 文本的行数:%dn,lines); ,邓非帽峻斋截拘硒检浅绥枉锗暇先慰唤解恩帜嫩睁墙按拄浪岳榔毯蚂喀敢第8章综合应用第8章综合应用,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1