数据结构实验报告文本字符计数器.docx
- 文档编号:7464448
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:18
- 大小:150.44KB
数据结构实验报告文本字符计数器.docx
《数据结构实验报告文本字符计数器.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告文本字符计数器.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构实验报告文本字符计数器
中北大学
数据结构与算法课程设计
说明书
学院、系:
软件学院
专业:
软件工程
学生姓名:
学号:
设计题目:
文本文件单词的检索与计数
班级
12210B04
起迄日期:
2013年12月9日-2013年12月20日
指导教师:
2013年12月20日
1.设计目的:
编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个单词出现在文本中的行号、在该行中出现的次数以及位置。
该设计要求可分为三个部分实现:
其一,建立文本文件,文件名由用户用键盘输入;其二,给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数;其三,检索给定单词,输入一个单词,检索并输出该单词所在的行号、该行中出现的次数以及在该行中的相应位置。
2.需求分析:
·本课程设计主要分为四个模块:
建立文本文件
建立文本文件的实现思路
定义一个串变量
定义文本文件
输入文件名,打开该文件
循环读入文本行,写入文本文件,其过程如下:
While(不是文件输入结束){
读入一文本行至串变量;
串变量写入文件;
输入是否结束输入标志;
}
关闭文件
给定单词的计数
该功能需要用到前一节中设计的模式匹配算法,逐行扫描文本文件。
匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次数。
检索单词出现在文本文件中的行号、次数及其位置
主控菜单程序的结构
头文件包含
菜单选择包括:
a、建立文件
b、单词计数
c、单词定位
d、退出程序
选择1~4执行相应的操作,其他字符为非法
3.模块划分
4.概要设计:
(流程图)
建立文本文件
定义一个串变量,定义文本文件,输入文件名,打开该文件,循环读入文本行,写入文本文件,关闭文件。
(建立文本文件的思路过程)
给定单词的计数
逐行扫描文本文件。
匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次
(给定单词计数的过程)
检索单词出现在文本文件中的行号、次数及其位置
逐行扫描文本文件。
扫描一个单词,单词数加1,匹配一个,计数器加1,输出该单词数,行数到底。
以此,行数加1,单词数清零,直到整个文件扫描结束;然后输出单词的次数,行号,第几个单词。
(检索单词的出现在文本文件中的行号,次数以及位置)
5.主要函数(算法)说明
朴素模式匹配算法
该算法的基本思想是:
设有三个指针——i,j,k,用i指示主串S每次开始比较的位置;指针j,k分别指示主串S和模式串T中当前正在等待比较的字符位置;一开始从主串S的第一个字符(i=0;j=1)和模式T的第一个字符(k=0)比较,若相等,则继续逐个比较后续字符(j++,k++)。
否则从主串的下一个字符(i++)起再重新和模式串(j=0)的字符开始比较。
依此类推,直到模式T中的所有字符都比较完,而且一直相等,则称匹配成功,并返回位置i;否则返回-1,表示匹配失败。
顺序串的模式匹配算法如下:
intindex(SStringS,SStringT)
{//求子串T在主串S中首次出现的位置
inti,j,k,m,n;
m=T.length;//模式串长度赋m
n=S.length;//目标串长度赋n
for(i=0;i<=n-m;i++)
{
j=0;k=i;//目标串起始位置i送入k
while(j<=m&&s.ch[k]==t.ch[j])
{k++;j++;}//继续下一个字符的比较
if(j==m)//若相等,则说明找到匹配的子串,返回匹配位置i,
//否则从下一个位置重新开始比较
returni;
}//endfor
return-1;
}//endIndex
给定位置的串匹配算法
该算法要求从串S1(为顺序存储结构)中第k个字符起,求出首次与字符串S2相同的子串的起始位置。
该算法与上面介绍的模式匹配算法类似,只不过上述算法的要求是从主串的第一个字符开始,该算法是上述算法的另一种思路:
从第k个元素开始扫描S1,当其元素值与S2的第一个元素的值相同时,判定它们之后的元素值是否依次相同,直到S2结束为止。
若都相同,则返回当前位置值;否则继续上述过程,直至S1扫描完为止,其实现算法如下:
IntPartPosition(SStringS1,SStringS2,intk)
{
inti,j;
i=k-1;//扫描s1的下标,因为c中数组下标是从0开始,串中序号相差1
j=0;//扫描s2的开始下标
while(i if(s1.ch[i]==s2.ch[j]) {i++;j++;//继续使下标移向下一个字符位置} else {i=i-j+1;j=0; //使i下标回溯到原位置的下一个位置,使j指向s2的第一个字符,再重新比较} if(j>=s2.length) returni-s2.length;//表示s1中存在s2,返回其起始位置 else return-1;//表示s1中不存在s2,返回-1 }//函数结束 说明: 以上两个算法可统一为一个算法,即在子串定位算法Index(S,T)的参数中增加一个起始位置参数即可。 建立文本文件 建立文件的实现思路是: (1)定义一个串变量; (2)定义文本文件; (3)输入文件名,打开该文件; (4)循环读入文本行,写入文本文件,其过程如下: While( 不是文件输入结束){ 读入一文本行至串变量; 串变量写入文件; 输入是否结束输入标志; } (5)关闭文件。 给定单词的计数 该功能需要用到前一节中设计的模式匹配算法,逐行扫描文本文件。 匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词出现的次数。 其实现过程如下: (1)输入要检索的文本文件名,打开相应的文件; (2)输入要检索统计的单词; (3)循环读文本文件,读入一行,将其送入定义好的串中,并求该串的实际长度,调用串匹配函数进行计数。 具体描述如下: While(不是文件结束){ 读入一行并到串中; 求出串长度; 模式匹配函数计数; } (4)关闭文件,输出统计结果。 检索单词出现在文本文件中的行号、次数及其位置 这个设计要求与上一个类似,但要相对复杂一些。 其实现过程描述如下: (1)输入要检索的文本文件名,打开相应的文件; (2)输入要检索统计的单词; (3)行计数器置初值0; (4)while(不是文件结束){ 读入一行到指定串中; 求出串长度; 行单词计数器置0; 调用模式匹配函数匹配单词定位、该行匹配单词计数; 行号计数器加1; If(行单词计数器! =0) 输出行号、该行有匹配单词的个数以及相应的位置; } 运行主控程序 主控菜单程序的结构要求内容如下: (1)头文件包含; (2)菜单选项包括: 1.建立文件 2.单词计数 3.单词定位 4.退出程序 (3)选择1——4执行相应的操作,其他字符为非法。 6.详细设计(源代码): #include #include #include #defineMaxStrSize256//根据用户需要自己定义大小 typedefstruct{ charch[MaxStrSize];//ch是一个可容纳256个字符的字符数组 intlength; }SString;//定义顺序串类型 intPartPosition(SStrings1,SStrings2,intk) {inti,j; i=k-1; //扫描s1的下标,因为c中数组下标是从0开始,串中序号相差1 j=0;//扫描s2的开始下标 while(i {if(s1.ch[i]==s2.ch[j]) {i++;j++;//继续使下标移向下一个字符位置 } else { i=i-j+1;j=0; }} if(j>=s2.length) returni-s2.length; else return-1;//表示s1中不存在s2,返回-1 //表示s1中存在s2,返回其起始位置 }//函数结束 voidCreatTextFile() { SStringS; charfname[10],yn; FILE*fp; printf("输入要建立的文件名: "); scanf("%s",fname); fp=fopen(fname,"w"); yn='n';//输入结束标志初值 while(yn=='n'||yn=='N') { printf("请输入一行文本: ");gets(S.ch);gets(S.ch); S.length=strlen(S.ch); fwrite(&S,S.length,1,fp); fprintf(fp,"%c",10);//是输入换行 printf("结束输入吗? yorn: ");yn=getchar(); } fclose(fp);//关闭文件 printf("建立文件结束! "); } voidSubStrCount() { FILE*fp; SStringS,T;//定义两个串变量 charfname[10]; inti=0,j,k; printf("输入文本文件名: "); scanf("%s",fname); fp=fopen(fname,"r"); printf("输入要统计计数的单词: "); scanf("%s",T.ch); T.length=strlen(T.ch); while(! feof(fp)){//扫描整个文本文件 //fread(&S.ch,1,sizeof(S),fp);//读入一行文本 memset(S.ch,'\0',256); fgets(S.ch,100,fp); S.length=strlen(S.ch); k=0;//初始化开始检索位置 while(k { j=PartPosition(S,T,k);//调用串匹配函数 if(j<0)break; else{ i++;//单词计数器加1 k=j+T.length;//继续下一字串的检索 } } } printf("\n单词%s在文本文件%s中共出现%d次\n",T.ch,fname,i); }//统计单词出现的个数 voidSubStrInd() {FILE*fp; SStringS,T;//定义两个串变量 charfname[10]; inti,j,k,l,m; intwz[20];//存放一行中字串匹配的多个位置 printf("输入文本文件名: "); scanf("%s",fname); fp=fopen(fname,"r"); printf("输入要检索的单词: "); scanf("%s",T.ch); T.length=strlen(T.ch); l=0;//行计数器置0 while(! feof(fp)){//扫描整个文本文件 //fread(&S,sizeof(S),1,fp);//读入一行文本 memset(S.ch,'\0',256); fgets(S.ch,256,fp); S.length=strlen(S.ch); l++;//行计数器自增1 k=0;//初始化开始检索位置 i=0;//初始化单词计数器 while(k { j=PartPosition(S,T,k);//调用串匹配函数 if(j<0)break; else{ i++;//单词计数器加1 wz[i]=j;//记录匹配单词位置 k=j+T.length;//继续下一字串检索 } } if(i>0){ printf("行号: %d,次数: %d,位置分别为: ",l,i); for(m=1;m<=i;m++)printf("%4d",wz[m]+1);printf("\n"); } } }//检索单词出现在文本文件中的行号、次数及其位置 intmain() { voidCreatTextFile(),SubStrCount(),SubStrInd(); intxz; do{ printf("***************madein李媛媛**\n"); printf("*************************\n"); printf("*文本文件单词的检索与计数*\n"); printf("*************************\n"); printf("*1.建立文本文件*\n"); printf("*2.单词字串的计数*\n"); printf("*3.单词字串的定位*\n"); printf("*4.退出整个程序*\n"); printf("************************\n"); printf("请选择(1--4)\n"); scanf("%d",&xz); switch(xz){ case1: CreatTextFile();break; case2: SubStrCount();break; case3: SubStrInd();break; case4: return0; default: printf("选择错误,重新选\n"); } }while (1); } 7.调试分析: Ps: 功能1,建立文本文件 Ps: 功能2,单词字串的计数 Ps: 功能3,单词字串的检索 Ps: 功能4,退出整个程序 8.课程设计总结: “千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义。 刚拿到任务书的时候脑子里一片茫然,不知道如何下手,但经过两周的努力,终于完成了。 其实无论做什么事情,只要用心就一定会有收获,绝不能轻言放弃。 以前用编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。 现在编程感觉完全不同了。 在编写一个程序之前,先对这个课程设计进行了一下分析,将每个要求都花了一下算法流程图,使得自己的思路更加的清晰了。 然后进行编程,不断的在电脑上调试程序,终于完成了此次的课程设计。 另外,这次的课程设计让我深刻理解数据结构了的重要性。 只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构,了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。 过而能改,善莫大焉。 在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获龋最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。 这次课程设计终于顺利完成了,在设计中虽然遇到了很多问题,但是在老师同学的帮助下和自己在不断地查阅书籍资料,终于使困难得以迎刃而解。 在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可! 通过这次课程设计,逐渐提高了我的程序设计和调试能力,我以前对算法一直很害怕,总是看不明白究竟这程序中间的过程是怎么进行的。 在这次实验中我终于克服了这一障碍,一遍遍在心中自己默默的走,终于弄明白了,另外,从此次课程设计,我学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,与人合作共同提高,这些都让我受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。 功夫不负有心人! 不过这次试验也让我看到了自己的不足,在程序设计过程中我还有关于C语言的一些比较具体的东西还不太懂,需要进一步了解。 毕竟学如逆水行舟,不进则退,只有不断充实自己才会不断进步。 这次试验还让我意识到只有不断的在电脑上调试程序,自己的水平才能得到提高,纸上谈兵终觉浅~ 最后,我要感谢在我课设过程中不断帮助我并给我鼓励的同学和老师们,是你们的帮助让我让更自信并不断努力,我一定会更加努力学习并不断充实自己~
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 文本 字符 计数器