《数据结构课程设计报告书14611.pdf》由会员分享,可在线阅读,更多相关《数据结构课程设计报告书14611.pdf(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 数据结构 课 程 设 计 报 告 书 题 目:文本文件单词的检索与计数 专 业:网络工程 学 号:131007137 学生:钦昆 指导教师:王初阳 完成日期:2014/6/7 目 录 1 设计任务书.错误!未定义书签。1.1 题目与要求.错误!未定义书签。1.2 知识点.2 1.3 输入输出分析.2 1.4 测试数据分析.2 2 概要设计.错误!未定义书签。2.1 结构体类型及函数声明.错误!未定义书签。2.2 主程序流程.3 2.3 模块流程说明.4 3 详细设计.8 3.1 数据类型实现.8 3.2 程序代码.12 4 调试分析.17 4.1 问题分析与回顾.17 4.2 算法时空分析.
2、错误!未定义书签。4.3 算法改进.错误!未定义书签。4.4 经验和体会.错误!未定义书签。5 测试结果.错误!未定义书签。参考文献.29 评分标准.24 1 设计任务书 1.1 题目与要求 题目:文本文件单词的检索与计数。要求:编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个单词出现在文本中的行号、在该行中出现的次数以及位置。建立文本文件,文件名由用户用键盘输入;给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数;检索给定单词,输入一个单词,检索并输出该单词所在的行号、该行中出现的次数以
3、及在该行中的相应位置。1.2 知识点 串的应用、文件、结构体、指针、数组、函数、函数的调用、循环语句、选择语句、输入输出控制、自定义类型等。1.3 输入输出分析(1)普通输入 在文本文件的建立中,需要先定义串变量和文本文件,从而建立文本文件;根据实际情况,将单词的长度定义为 20,规定每行最多输入 110 个字符。(2)对话式输入 为便于转换及比较,对话式输入采用字符数组进行存储.为保障程序的健壮性,同时限制对话式输入的格式,对于非法的会话式输入则提示用户操作失败的原因。(3)程序输出 为了能让程序输出时更加美观,程序输出主要以整齐为主,使得输出的程序结果均整齐输出。1.4 测试数据分析 在建
4、立文本文件名时,要求键盘输入所建立的文本文件的名称,如果所输入的文本文件名称超过所给定的字符,将提示输入错误,请重新输入。在第二次输入文本文件名称以供在此文本文件中查找所给定的单词,如果用户输入的文本文件名称与第一次不符或输入为空,系统将提示输入错误,请重新输入。在主控程序中,要求输入执行指令 14,如果输入非 14 字符,系统将提示输入错误,请重新选择 2 概要设计 2.1 结构体类型及函数声明(1)结构体 1.typedef struct /*定义顺序串类型*/char chMaxStrSize;int length;string;2.typedef struct /*统计单词出现的次数*
5、/char wordWORD_LEN;int count;elem_type;3.typedef struct elem_type*elem;/*存储空间基址*/int length;/*当前长度*/int listsize;/*当前分配的存储容量*/sqlist;函数:1.建立文件:void creat_text_file()2.单词统计:void sqlist_add(sqlist*sq,elem_type*et,char*word)3.文本文件中单词的总汇:void substrsum()4.单词的定位:void substrcount()5.主函数:int main()2.2 主程序流
6、程(1)主程序调用模块图 主程序利用 switch()语句实现各个模块的调用,主函数调用如图 1 所示。图 1 主程序调用模块图 主程序根据不同数值调用函数 1 建立 文本文件 2 给定单词 计 数 3 检 索 单 词 在 文 本 中 的 位 置 2.3 模块流程说明 主函数对各主要模块进行调用,各个主要模块又分别调用其他子模块。下面用简要流程图对各主要模块进行说明。(1)建立文本文件主模块 如图 2 所示,建立文本文件模块。首先定义一个串变量,然后调用 void creat_text_file()函数,定义文本文件,键盘输入文件名,打开该文件,循环读入文本行,写入文本文件,最后关闭文件。、开
7、始 定义一个串变量 调用 void creat_text_file()函数,定义文本文件键盘输入文件名 打开文件,循环读入文本行,写入文本文件 关闭文件 图 2 建立文本文件模块 (2)给定单词的计数主模块 如图 3 所示为给定单词计数程图。其实现过程如下;首先输入要检索的文本文件名,打开相应的文件,然后输入要检索统计的单词,循环读文本文件,读入一行,将其送入定义好的串中,并求该串的实际长度,调用串匹配函数进行计数。数最后关闭文件,输出统计结果 图 3 单词计数模块 (3)主控程序模块 如图 4 为中控程序流程图。过程如下:输入头文件 使用循环语句输出一下 4 个执行指令:开始 输入要检索的文
8、本文件名,打开相应文件 输入要检索统计的单词 使用 while 循环语句,调用 sqlist_add(&sq,et,word)函数,循环读文本文件,送入定义好的串中 关闭文件 求该串的实际长度,调用串匹配函数partposition(s,t,k)进行计数,输出统计结果 1.建立文本文档 2.文本单词汇总 3.给定单词定位 4.退出 如输入非 14 的指令,系统将提示,输入错误请重新输入。结束。否 是 开始 输入头文件 提示:输入错误,请重新输入 输入四个执行指令 执行相应指令 输入的是否为 14 的执行指令?结束 图 4 主控程序模块 3 详细设计 3.1 数据类型实现 结构体:1.typed
9、ef struct /*定义顺序串类型*/char chMaxStrSize;int length;string;2.typedef struct /*统计单词出现的次数*/char wordWORD_LEN;int count;elem_type;3.typedef struct elem_type*elem;/*存储空间基址*/int length;/*当前长度*/int listsize;/*当前分配的存储容量*/sqlist;函数:1.建立文件:void creat_text_file()2.单词统计:void sqlist_add(sqlist*sq,elem_type*et,cha
10、r*word)3.文本文件中单词的总汇:void substrsum()4.单词的定位:void substrcount()5.主函数:int main()3.2 程序代码#include#include#include#define LIST_INIT_SIZE 500 /*线性表存储空间的初始分配量*/#define LISTINCREMENT 10 /*线性表存储空间的分配增量*/#define FILE_NAME_LEN 20 /*文件名长度*/#define WORD_LEN 20 /*单词长度*/#define MaxStrSize 256#define llength 110 /
11、*规定一行有 110 个字节*/typedef struct char chMaxStrSize;/*ch 是一个可容纳 256 个字符的字符数组*/int length;string;/*定义顺序串类型*/typedef struct char wordWORD_LEN;/*存储单词,不超过 20 个字符*/int count;/*单词出现的次数*/elem_type;typedef struct elem_type*elem;/*存储空间基址*/int length;/*当前长度*/int listsize;/*当前分配的存储容量*/sqlist;void sqlist_init(sqli
12、st*sq,elem_type*et)sq-elem=et;sq-length=0;void sqlist_add(sqlist*sq,elem_type*et,char*word)int i;int j;for(i=0;i length;i+)/*当前单词与加入的单词相同,直接统计,不做插入*/if(strcmp(eti.word,word)=0)eti.count+;return;if(strcmp(eti.word,word)0)break;if(sq-length=LIST_INIT_SIZE)printf(空间不足,单词%s插入失败n,word);return;for(j=sq-le
13、ngth;j i;j-)memcpy(et+j,et+j-1,sizeof(elem_type);sq-length+;strcpy(eti.word,word);eti.count=1;int sqlist_count(sqlist*sq,elem_type*et)int i;int j=0;for(i=0;ilength;i+)j=j+eti.count;return j;void creat_text_file()elem_type w;sqlist s;char file_nameFILE_NAME_LEN+1,yn;FILE*fp;printf(输入要建立的文件名:);scanf(%
14、s,file_name);fp=fopen(file_name,w);yn=n;/*输入结束标志初值*/while(yn=n|yn=N)printf(请输入一行文本:);gets(w.word);gets(w.word);s.length=strlen(w.word);fwrite(&w,s.length,1,fp);fprintf(fp,%c,10);/*是输入换行*/printf(结束输入吗?y or n:);yn=getchar();fclose(fp);/*关闭文件*/printf(建立文件结束!n);void substrsum()char file_nameFILE_NAME_LE
15、N+1;char wordWORD_LEN+1;FILE*fp;int i;int j,q=0;int w,x,y=0;elem_type etLIST_INIT_SIZE;sqlist sq;sqlist_init(&sq,et);printf(请输入文件名:);scanf(%s,file_name);fp=fopen(file_name,r);if(fp=NULL)printf(打开文件失败!n);return;while(fscanf(fp,%s,word)!=EOF)sqlist_add(&sq,et,word);fclose(fp);printf(单词 个数n);for(i=0;i=
16、0;w-)if(eti.wordw90&eti.wordw122)eti.wordw=;for(w=0;wx;w+)if(eti.wordw=)y+;if(y=x)eti.count=0;y=0;else y=0;if(eti.count!=0)printf(%20s%10dn,eti.word,eti.count);else q+;j=sqlist_count(&sq,et);printf(n%s 的单词总数为%d 个n,file_name,j);printf(n%s 的非单词个数为%d 种n,file_name,q);printf(n);int partposition(string s1
17、,string s2,int k)int i,j;i=k-1;/*扫描 s1 的下标,因为 c 中数组下标是从 0 开始,串中序号相差1*/j=0;/*扫描 s2 的开始下标*/while(is1.length&j=s2.length)return i-s2.length;/*表示 s1 中存在 s2,返回其起始位置*/else return-1;/*表示 s1 中不存在 s2,返回-1*/*函数结束*/void substrcount()FILE*fp;string s,t;/*定义两个串变量*/char fname10;int i=0,j,k;printf(输入文本文件名:);scanf(
18、%s,fname);fp=fopen(fname,r);printf(输入要统计计数的单词:);scanf(%s,t.ch);t.length=strlen(t.ch);while(!feof(fp)memset(s.ch,0,110);fgets(s.ch,110,fp);s.length=strlen(s.ch);k=0;/*初始化开始检索位置*/while(ks.length-1)/*检索整个主串 S*/j=partposition(s,t,k);/*调用串匹配函数*/if(j0)break;else i+;/*单词计数器加 1*/k=j+t.length;/*继续下一字串的检索*/pr
19、intf(n单词%s 在文本文件%s 中共出现%d 次n,t.ch,fname,i);/*统计单词出现的个数 */void substrint()FILE*fp;string s,t;/*定义两个串变量*/char fname10;int i,j,k,l,m;int wz20;/*存放一行中字串匹配的多个位置*/printf(输入文本文件名:);scanf(%s,fname);fp=fopen(fname,r);printf(输入要检索的单词:);scanf(%s,t.ch);t.length=strlen(t.ch);l=0;/*行计数器置 0*/while(!feof(fp)/*扫描整个文
20、本文件*/memset(s.ch,0,110);fgets(s.ch,110,fp);s.length=strlen(s.ch);l+;/*行计数器自增 1*/k=0;/*初始化开始检索位置*/i=0;/*初始化单词计数器*/while(ks.length-1)/*检索整个主串 S*/j=partposition(s,t,k);/*调用串匹配函数*/if(j0)printf(行号:%d,次数:%d,位置分别为:,l,i);for(m=1;m=i;m+)printf(第%4d 个字符,wzm+1);printf(n);printf(n 本软件自定义 110 个字节为一行nn);/*检索单词出现在
21、文本文件中的行号、次数及其位置*/void substrio()void substrcount(),substrint();char t;while(1)printf(=n);printf(请输入:);printf(|文本文件单词字串的定位统计及定位|n);printf(|=|n);printf(|a.单词出现次数|n);printf(|n);printf(|n);printf(|b.单词出现位置|n);printf(|n);printf(=n);scanf(%c,&t);switch(t)case a:substrcount();break;case b:substrint();break
22、;default:return;int main()void creat_text_file(),substrsum(),substrio();int xz;while(1)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)case 1:creat_text_file();
23、break;case 2:substrsum();break;case 3:substrio();break;case 4:return 0;default:printf(选择错误,重新选 n);return 0;4 调试分析 4.1 问题分析与回顾 问题 1:在语句“请输入一行文本”后边,只写一句接受语句,结果运行时,请输入文本和结束输入吗?演示在一起,并且不能接受文本输入。解决:和同学讨论后,加入了文本接受语句,成功运行。问题 2:当要检索文本时,输入为空,或输入非建立的文本文件名,系统不能正常运行。分析:缺少判断语句。解决:当出现这种情况时,系统提示输入错误,请重新输入。4.2 算法时空
24、分析 确定给定单词出现的个数,需要统计文本文件中全部的单词,因此时间复杂度为O(n);确定给定单词出现的位置,需要显示其所在的行和列,时间复杂度为 O(i*l);4.3 算法改进 此算法虽然基本实现了功能,但却仍存在许多不足,例如当当前建立的文件名与之前相同时,没有错误提示,另如在对单词的检索方面,时间复杂度及空间复杂度仍不尽如人意。仍需要改进代码,达到算法的高效性。4.4 经验和体会 通过本次数据结构的课程设计,让我对数据结构这门课有了更加深刻的认识。数据结构这门课程的理论性只是较强,要学好这门课程,就必要在掌握好理论知识的同时,加强上机操作,遇到问题,解决问题,这样才会有更大的进步。我课程
25、设计的题目是文件文本的检索与计数,由于这个课题要用到串的知识。而我对之前对串的定义却不是很明确,于是我有详细的学习了课本上的知识并查阅了很多文献。在着手作程序的过程中,经常遇到程序运行不出来,运行达不到效果等问题,尤其是接收文本,搜索时如何定位等方面遇到了很多问题。但我通过请教老师和同学,查 阅文献,然后基本上解决了这些问题。在这个过程中我学到了很多,我认识到了坚持不懈的重要性,在我一遍一遍的调试下,终于成功的写出了程序。在编写此次程序时,我学会了先用流程图对进行算法分析,这样是自己的思路更加清晰,而不是像之前那样对整个函数没有整体的认知,而导致常常无从下手。之前我对数据结构的各种算法都感到畏
26、惧,感觉很抽象,而这次通过自己几周的努力,在老师和同学们的帮助下,终于完成了此次课程设计,这对我来说无疑是极大的鼓舞,极大的增强了我学数据结构的自信心。而且我也充分认识到数据结构本身就是一门实践性很强的课程,只有加强实践,才能学得更好!5 测试结果(1)输入建立文件名 如图 5 所示为输入建立文件测试 图 5 输入建立文件测试 (2)输入一行文本测试 如图 6 所示建立一行文本,建立文件结束界面。图 6 建立文件结束测试 (3)单词字串的计数测试 如图 7,单词字串的计数测试界面。图 7 单词字串的计数测试(4)单词字串的定位测试 如图 8 和图 9 所示。图 8 单词字串的定位测试 图 9
27、单词字串的定位测试 (5)程序结束退出,如图 10 所示 图 10 程序结束退出 参考文献 1 严蔚敏,吴伟民数据结构(C 语言版):清华大学,2010 2 清明,向德生 C 语言程序设计:人民邮电,2008 3 德淳,龙脉工作室C 函数速查手册:人民邮电,2009 4 闵敏,朱辉生数据结构高等教育 编著 2003.4 5 世和数据结构清华大学 2004.11 6 玲玲C 程序设计清华大学 7 莉,董渊C+程序设计基础教程 清华大学。8 社德淳C 函数速查手册M:人民邮电出版,龙脉工作室 2009 9 林小茶C 语言程序设计 10朱鸣华C 语言程序设计教程 11文蓉数据结构高等教育 2003.
28、2 评分标准 程 序(80)正确性(50)完成要求功能测试无错误(41-50)完成全部主要功能但有少许错误(31-40)完 成 一 些 功 能 但 有 错 误(1-30)不能运行(0)创新性(10)比题目要求多完成三个功能以上(7-10)(1)如果正确性不能达到 40分,创新性不予考虑。(2)要求多完成的功能必须能反映出工作量,否 则 不 予 以 加分。比题目要求多完成两个功能(4-6)比题目要求多完成一个功能(1-3)仅完成题目要求(0)注释丰富程度(20)注释清楚(11-20)较多(6-10)少许(0-5)报 告(30)层次、结构、逻辑性(10)合理(5-10)不甚合理(0-4)语言表达能力(10)行文流畅且仅有不多于 5 个错别字(5-10)不太通顺且有多于 5 个错别字(0-4)版面(10)版面整洁,布局合理(5-10)版面混乱,布局不合理(0-4)总分 由于有创新分,有可能超过 100分,超 过 者 按100 分算 五级制成绩 教 师 签 名:批 改 日 期:年 月 日