数据结构课程设计-文学研究助手系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嘉应学院计算机学院
实验报告
课程名称:数据结构课程设计
开课学期:2017-2018学年第2学期
班级:1503
指导老师:钟治初
实验题目:文学研究助手系统
学号:151110127
姓名:王泽敏
上机时间:2017-10-23
“文学研究助手系统”的设计与实现
1.设计要求
1.1 问题描述
文学研究人员需要统计某篇英文小说中某些特定单词的出现次数和位置(行号和列号)。试写出一个实现这一目标的文字统计系统,称为“文学研究助手系统”。
1.2 需求分析
要求建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;检索输出给定单词出现在文本中的行号,以及在该行中出现的位置(列号);统计给定单词在文本文件中出现的总次数。
2 概要设计
该设计可分为三个部分实现;第一,建立文本文件,文件名由用户通过键盘输入;第二,检索给定单词:输入一个单词,检索并输出该单词所在的行号和列号;第三,给定单词的计数:输入一个单词,统计输出该单词在文本中的出现次数。可从3个方面着手设计。
2.1 建立和读入文本文件
建立和读入文件的实现步骤如下:
(1)定义一个串变量;
(2)定义文本文件;
(3)输入文件名,打开该文件;
(4)循环读入文本行,写入文本文件,其过程如下:
While(不是文件输入结束符)
{
读入一文本行至串变量;
串变量写入文件;
输入是否结束输入标志;
}
2.2 存储结构设计
主串和模式串都采用定长顺序存储表示,其0号单元存放串的长度:
#define MAXSTRLEN 255 //最大串长
Typedef char SString[MAXSTRLEN+1];//定长顺序存储表示
2.3字符串的模式匹配问题
本系统使用改进的KMP匹配算法实现字符串的模式匹配问题。匹配可如下进行:假设以指针i和j分别指示主串和模式中的比较字符,令i的初值为pos,j的初值为1.若在匹配过程中si=sj,则i和j分别增1,若si≠sj匹配失败后,则i不变,j退到next[j]位置再比较,若相等,则指针各自增1 ,否则j再退到下一个next值的位置,依次类推。直至下列两种情况:一种是j退到某个next值时字符比较相等,则i和j分别增1继续进行匹配;另一种是j退到值为零(即模式的第一个字符失败),则此时i和j也要分别增1,表明从主串的下一个字符起和模式重新开始匹配。
3 模块设计
(1 ).模块设计
本程序包含3个模块:主程序模块,查找模块,功能模块。
其调用关系如图所示。
3.2 程序
(2).子程序及功能设计
本系统共设置5个子程序,各子程序的函数名及功能说明如下。
(1) Void get_next(SString T,int next[])
//求模式串T 的next 函数值并存入数组next
(2) Int Index(SString S,SString T,int pos )//KMP 匹配函数
(3) Int lenth(SString str) //取串str 的长度
(4) Void find(char name[],SString keys)
//查找函数,对于输入的每一个要查找的关键字,从文本文件中逐行读取字符串查找。 //调用(1),(2),(3)
(5) Void main() //主函数,负责系统的输入和输出。调用(4)
3.3 函数主要调用关系
本系统5程序之间的主要调用关系如图所示。图中数字是各函数的编号
系统函数调用关系图
4 详细设计
4.1 数据类型定义
(1)定长顺序存储串类型的定义
#define MAXSTRLEN 255 //最大串长
typedef char SString[MAXSTRLEN+1];//串的定长顺序存储表示,0号单元存放串的长度
(2)全局变量的定义
int next[MAXSTRLEN] //KMP 算法中用到的next 数组
4.2 系统主要子程序详细设计
(1)主函数模块设计,负责系统的输入输出工作,调用查找函数。
void main()
{
输入包含路径的文本文件名;
输入要查找的关键字个数;
一次性输入要查找的关键字;
对于每一个关键字,循环调用find函数进行查找统计;
}
(2)查找模块设计
void find(char name[],SString keys)
{ //该函数是整个程序的重要部分,对于输入的每一个要查询的关键字,从小说文件中逐行
//杜取字符串查找
SString text; //存放从小说文件中读取的一行字符串
int i=1,j=0,k; //i用于存放行号,j用于存放列号,k用于输出格式的控制
int n=0; //n用于记录出现的次数
FILE *fp;
if(!(fp=(fopen(name,"r")))) //打开小说文件
{
printf("Open file error!\n");
exit(0);
}
keys[0]=lenth(keys); //调用lenth函数求关键字
get_next(keys,next);调用get_next函数求模式串(关键字)每一个字符对应的next
printf("\n%s出现于:\n",&keys[1]); //打印关键字
while(!feof(fp)) //如果还没有找到小说文件末尾
{
k=0;
fgets(&text[1],MAXSTRLEN,fp); //从小说文件中读取一行字符串,存入text串中
text[0]=lenth(text); //求读入的串的长度
j=Index(text,keys,j+1); //调用KMP算法,统计关键字在该行出现的位置,若匹配不成功则返回0
if(j!=0)
{
printf("\trow=%d,\tcol=%d",i,j);
k++;
n++;
}
while(j!=0)
{
j=Index(text,keys,j+1);
if(j!=0)
{
n++;
printf(",%d",j);
}
}
i++;
if(k)
printf("\n");
}
printf("%s公出现%d次\n",keys[1],n);