文件操作与字符处理_第1页
文件操作与字符处理_第2页
文件操作与字符处理_第3页
文件操作与字符处理_第4页
文件操作与字符处理_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计综合性实验实验题目:文件操作与字符处理 实验班级:2011级信管专业3班 学生学号: 学生姓名: 任课老师: 提交时间:2012-02-18 华南农业大学 信息(软件)学院综合性实验A(文件操作与字符处理)实验报告1. 题目及题目分析1.1 问题描述在当前目录下存在文件名为“case1.in”(其中case后为数字1,不是字母i,写错提交后会判错)的文本文件,其内容为一篇英文文章(以EOF作为结束标志)。现要求读取该文本文件内容,统计该文本文章中每个单词出现的次数,并输出出现次数最多的前5个单词及其出现次数(按出现次数由多到少的顺序输出,次数相同时按字典顺序输出,不足5个单词时,

2、按序输出全部单词)。程序中注意如下细节:(1)空格、标点符号与回车键起到分隔单词的作用;(2)名词缩写算一个单词;(3)单词不区分大小写;(4)输出时单词全使用小写;(5)包含多段文字,单词数不超过10000,每个单词不超过20个字符;(6)数字不算单词;(7)文中不包含连字符及类似Im等情况;(如case1.in内容如下)I am a student. My school is SCAU. It is abeautiful university. I like it.(在屏幕上输出结果如下)a 2i 2is 2it 2am 11.2功能分析简单的说,这个实验要求我们读取一篇存储在一个文本文件

3、中英文文章中的所有单词,然后统计其中单词出现的次数,并把其中出现最多的五个单词输出来并输出其出现的次数。我们的任务是怎样把这篇英文文章中的单词读取出来,并把它的出现次数统计出来,并把其中出现最多的5个单词输出来。然后我们再深度处理,按照题目要求作修改。我们怎样才能把一个个单词读取出来,因为有些单词是不止一个字母的,我们又要怎样处理?我们又要怎样把这不止一个字母的单词通过比较来判断是否一个单词?还有怎样把出现次数最多的5个单词输出来,这要怎样处理?这些是比较难处理的。2. 设计思路1.1总体结构设计要实现题目中的要求,我们要把程序设计成几个模块来实现。第一个模块,就是用来读取英文文章中的单词,这

4、就要用到文件这些知识,因为单词可能不止一个字母,所以我们先要用数组来保存,这就要用到数组的知识。读取单词之后怎么样统计出现的次数,这又要另设一个模块。到最后,判断出现次数最多的单词然后输出来是一个模块。还有,在一开始要设计一个结构体来保存单词,这是一个模块。所以,一共设计了4个模块。其中,在第三个模块又要分开几个小方块,因为其中要处理单词分隔的时候,这里的处理是一个难点。还有题目中不包含分隔符的情况。我们把字母处理作为一个小方块,分隔符读取作为一个小方块,还有。详细说明看以下内容。1.2各个功能模块详细设计及功能模块之间关系设计首先,我们要做好预处理指令,在首行输入#include<st

5、dio.h>,因为后面会用到字符串函数,所以我们还要在第二行输入#include<string.h>,把”string.h”文件包含到文件中。然后,因为文件中的英文文章中的单词要储存和统计出现的次数。要同时记录这两项数据要怎样处理好呢?没错,就是用结构体来储存,设立一个wordkeep的结构体类型,里面只需设立两个成员,第一个设立为字符串数组类型来保存文章中出现的单词,因为题目中规定每个单词的长度不超过20,所以字符数组的长度为20。第二个设立为基本整型来保存单词出现的次数。接着要定义变量。因为题目中规定说单词数不超过10000,所以我们可以用一个word10000的结构体数

6、组来实现。结构体建立要放在预处理指令后面,这就是这个程序的第一个功能模块。上述操作的代码如下图所示:结构体建立完毕后就是主函数了,主函数包含了三个模块,包括了读取文章中的每一个字母,判读每一个单词,判断每一个单词出现的次数,把出现次数最多的5个单词输出。这里,我用一个简单的流程图来说明一下主函数执行的流程:上面的流程图大致的描画了实现这个实验的基本操作,基本思路,那么,我们现在就按照这个思路来编写程序。以上的操作缺一不可且不能换序,因为你读入了一个单词才能分离一个单词,才能判断出现过没有,才能统计出现次数,才能准确的排序输出。我们一定要仔细编写程序,因为每一个环节出差错,都会影响到下一个环节,

7、牵一发而动全身。第二个模块是单词的输入,这里要用到文件的知识,因为只是读取,所以我们只需要用一个fopen(文件名,使用文件方式)的调用方式打开文件,其中文件名已经是题目规定了的,是case1.in,而使用文件方式是只读,也就是r。因为下面还要用到一些变量,所以我们预先在第一模块就把它们设置好先,其中,i,t和j是用来计数的,m和f是用来判断真假的,k用来统计所出现单词的次数(包括重复出现的),具体操作代码如下:我们打开了文件,然后就是读取文件中的单词,这里要用到fgetc(fp)的调用形式,即从fp指向的文件中读入一个字符。我们在当读取字母不是结束符号的时候就开始读入。因为题目要求所统计单词

8、不分大小写,所以,我们统一把所读取的字母先转化为小写字母,那么,我们在判断了所读入字母是否为结束符号之后,还要判断一下所读取字母是否为大写字母,如果是大写字母的话,就转化为小写字母。这里还有一个问题,就是关于输入字符的类型。这里,输入的字符可以分成两种类型。一种是英文字母,一种是分隔符。题目中说空格、标点符号与回车符起到分隔单词的作用,所以分隔符又分成空格、标点符号和回车符。当我们读入字符时,一定要做好对分隔符的处理。好了,现在先说说当读取到的是英文字母的时候,我们先统一转化为小写字母,然后用一个字符数组来先储存着。因为有些单词不止是由一个单词组成的,那么,我们就要判断下一个读入字符是否为分隔

9、符,如果所读取的字符不是分隔符的话,我们继续用那个字符数组来保存读入的字母,以此类推下去,注意保存时的下标要依次增加就行了。这样一直直到出现了分隔符,因为所有的标点符号都是分隔符,如果我们逐一书写出来会比较的麻烦,刚好题目说明了不包含连字符,所以我们把出现连字符和下一个输入字符为回车键假设为假,然后除连字符之外的标点符号就为真了。我们这样做要先设一个控制真假的变量,上面已经设之为f。出现了分隔符,我们怎么处理已经储存在一个字符数组中的单词呢?好,我们把一个单词的最后一个字母后面再加一个空字符,宣告给系统知道这个单词读取结束了,然后与之前出现的单词相比较,看有没有相同的,比较前还要做一个判断,判

10、断是否已经有输入的单词了,如果还没有输入单词,那就不用比较了,如果已经有了输入单词,就开始比较,比较时可以直接用字符数组和字符数组比较,就是用在主函数中用来临时保存保存单词的字符数组和在结构体中用来正式保存单词了字符数组来比较。比较时我们可以用字符串函数中的strcmp函数来进行比较,如果比较出来的值为0,也就是两个单词相同,这时候,就令在结构体中保存这一单词的变量中的整型常量这一成员加一。如果比较的时候没有一个单词是相同的,那就要另外增加一个统计项,把这个单词复制到结构体中保存,令其出现次数为一。还有,我们在统计单词时注意要统计一共有几个单词,要实现这个我们可以设置一个整型常量,在每次新增统

11、计项时令这个常量加一,我们在下面就把它设为了k,如下图所示。这样一直读取下去,直到读取到结束符号,即EOF。这时,我们要处理的是把出现次数最多的5个单词输出。这时候,我们只需比较它们的出现次数,出现次数在结构体中有保存。因为可能文章中的单词不超过5个,所以我们的条件务必要写成i<k&&i<5。然后通过冒泡排序把出现次数最多的排在第一位,但是如果出现次数相同,我们怎么按照字典顺序排序呢?这样的话我们通过比较字符的大小来排序,因为ASCII码的排序是按照字典排序来排序的,所以我们可以通过比较字符在ASCII码中的值的大小来比较顺序的前后。排序结束后就依次输出,输出后要记

12、得关闭数据文件,就是在return 0前面写上fclose(fp)。就这样,这个程序就基本上完成了。1.3 数据结构的设计1.4 界面设计综上所述,实验所设计的界面如下简图所示: 其中,主函数中有一个特殊的处理(判断除去连字符之外的所以标点符号),如下图所示。3. 编程实现要实现编程,首先要建立一个wordkeep的结构体,这是为下面保存单词打下铺垫,我们还要建立一个结构体数组,如下左图所示: 然后就是设好变量和读入数据,如上右图所示:然后,就是判读文章中读入的字符,该操作的流程图如下图所示:这一模块的主要功能模块的代码段片段及注解如下所示:最后,就是排序输出:就这样就可以实现编程了。4. 运

13、行测试现在,我们用一组数据来测试一下,就用题目中的数据来测试吧。我们先建立一个case1.in的文件放在保存改程序的目录下。case1.in的位置和内容如下图所示:我们先打开编程软件,这里,我用的是C-Free 5.0,我们先把程序代码输进去,如左图所示。我们定义了文件指针,以读的方式打开文件。然后开始读入字符。第一个读入的字符是“I”,因其是大写字母,所以在第17行被转化为小写字母i。在19行字母i被存入字符数组w中,其下标为0,计数变量i变为1,字符标志为1(即所读入字符为英文字母)。然后转回第15行再读入字符“ ”(空格,下同),转到17行判断,不符合条件,转到18行判断,不符合条件,转

14、到22行判断,不符合条件,转到25行,符合条件,跳到27行,把w1标志为空字符,计数变量i归零,m标志为0(表示所记录字符不为英文字母)。然后跳到28行,不符合条件,不进入循环,跳到33行,f不等于1,跳到35行,令保存在w中的单词出现的次数为1,并把它存储在结构体数组的word0中,k变成1(k为所出现的单词次数,计算条件,重复出现的)。再跳到15行,再次读入字符,这次读到的字符为“a”,跳到18行,把“a”保存在字符数组w中,起下标为0,计数变量i变成1,f标志为1.跳到15行再去读入字符“m”,跳到18行,把“m”保存在w1中,i变成2,f标志为1,再跳到15行,读入字符“ ”,如刚才读

15、入空格的情况,直接跳到第25行,把w2标志为空字符,把计数变量i归零,m标志为0.跳到28行,进入判断之前是否出现过改单词的循环体,这里,一开始j为0,判断现在保存在w中的单词(am)是否与结构体word0中的word0.c(i)相同,实际上当然不相同,j自加,不符合循环条件,跳出循环,跳到第33行,m不为真,跳到第35行,把单词“am”存储到结构体数组word1的word1.c成员中,并把其出现次数记为1,k自加变成2.然后再跳到第15行,如此进行下去,直到出现了结束字符,这时候,光标跳到第40行。令t为0,开始读取存储在结构体中的单词,从word0开始读取,如果结构体变量中的次数出现为0的

16、话,读取下一个结构体变量,令j为0,比较保存在结构体中的单词的出现次数,如果出现次数较多的话,把其保存在结构体数组中的位置交换。如果出现的次数不大于后面那个单词出现的次数,那么有可能是等于或小于,当出现次数相同的时候,我们比较单词的大小,即从首位开始比较其ASCII码的大小,这样就可以实现次数相同时按字典顺序输出,最后程序出来的结果如题目中所示。为了能比较直接地观察程序运行的情况和各变量的变化,我专门设计了一个各变量各时间变化的表格,如下所示:行数变量1718191517182225272833351517181915chIiiiaaaai00011111100000001m111111111

17、00000000j00000000000000000k00000000000000111t00000000000000000f00011111100000001行数变量171819151718222527283028333515chmmmmaai111222222000000m000000000000000j000000000000111k111111111111112t000000000000000f111111111000000注释:上表中没有字符的单元表示空格。现在,我们开始实际运行程序,在运行程序前我们先编译一下看所写程序有没有错误:好了,程序没有错误,我们就可以开始运行了,运行所出来

18、的结果如上所示,其结果与题目中所给答案完全一致。预期结果与运行结果相同,所以我们这个程序是正确的。为了更加准确的测试这个程序,我们不妨可以另外找一段文章来测试一下这个程序,我在网上找了一篇文章(文章在参考文献中)保存在case2.in中,预期结果是the有33个,of有25个,that有14个,as有10个,technology也有10个。运行程序,其结果如下:很明显,预期结果和运行结果完全一致,更说明了这个程序的准确性。5. 总结体会在寒假中,通过这次试验,我很好的得到了复习,对C语言有了更深的理解和运用能力。说实话,我觉得c语言这门功课,要有更多的实践和看书(看一些程序),才会运用得熟手、

19、灵巧。光靠书本上的一些例题是不够了,为了完成这个实验,我也有去参考一些书,虽然有些与这个实验无关,但是,我还是学到了一些东西的。还有,在想出怎么去完成这个实验时,那种成就感是没有什么更快乐的事可以超越的,因为,完成这个实验我实在是费了不少功夫,从一开始的看教导书,到去参考其他的一些课外书,从一开始的错误思路(一开始是想不全部保存所出现的单词的,从一开始就开始比较出现单词的次数,然后把出现单词最多的才保存下来),后来发现这个好像是很难实现的,到后来才改正了思路,才做得如鱼得水。所以说,一个正确的思路是很重要的。6. 参考文献case2.in文件中的英语文章来源于人人听力网中的科技与文化-大学英语

20、作文,其内容如下:When my father was young, he practiced Chinese calligraphy every day and enjoyed Peking Opera with my grandfather on weekends. Now as his daughter, I type in English when communicating with my friends and enjoy surfing on the Internet during holidays. When I enjoy the pleasure and convenien

21、ce that new technologies have brought me, some people cry out that as technology develops traditional cultures must be lost. Is it true that we cannot have both? Different as my lifestyle is from that of my father, I still believe that the development of technology wont lead to the loss of tradition

22、. On the contrary, it will facilitate the development of traditional cultures. Some people draw the conclusion that technology leads to the loss of tradition because they find nowadays many people,especially the young, take interest in new things like the Internet, thus make less contact with tradit

23、ional cultures.However,decreased popularity isnt equal to loss. With the development of technology, we have more choices of arts and entertainments. In other words, many new forms of culture are coming into existence, which provide people with more choices rather than threaten the existence of the t

24、raditional ones. In actuality, if we look at the tradition itself, we can find that great achievements have been made in many fields with the development of technology.New operas are on show; new researches about history are going on; new facts about historical cities have been found; all of which c

25、an prove that technology can stay peacefully with traditions. In fact, technology works far beyond that.The development of technology boosts that of the tradition.On one hand,new technologies make the research for traditional cultures possible as well as provide advanced techniques of reserving hist

26、oric masterpieces. Take calligraphy as an example, new ways of illumination, which is the fruit of Hi-tech, can prevent the color of scripts from fading. On the other hand, the rapidly developing media such as the Internet and communication satellite provide traditional cultures with a stage to face

27、 the whole world. As we can see, after the short piece of ad of Shanghai Expo. , more people will know the beautiful melody of "Jasmine." In addition, if we look back to history, we can find out that it was always in the era when economy developed greatly that cultures prospered the most.N

28、o doubt that the development of technology can guarantee that of economy, which eventually influences the prosperity of culture. As we all see, the development of technology brings us richness, making the research and development of cultures affordable brings us more leisure time, making our desire to enjoy ntertainments possible. After all, as the great philosopher Marx aid, "economy determine.附录:代码清单#includ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论