当前位置:文档之家› 词典变位词检索系统课程设计报告

词典变位词检索系统课程设计报告

词典变位词检索系统目录1绪论 (1)2系统分析 (1)2.1功能需求 (1)2.2数据需求 (2)2.3性能需求 (2)3总体设计 (2)3.1系统设计方案 (2)3.2功能模块设计 (4)4详细设计 (4)4.1数据结构定义 (4)4.2读入词典模块 (5)4.3求出变位词并输出合法单词模块 (6)4.4循环输入单词模块 (8)5调试与测试 (8)5.1调试 (8)5.2测试 (9)6结论 (10)结束语 (10)参考文献 (10)附录1-用户手册 (11)附录2-源程序 (13)摘要随着人们对英语认识的提高,日常单词量在逐渐增加,为了更快提升人们单词量,可以将一个单词的所有变位词一起记忆。

这就需要开发一种词典变位词检索系统,用来查找出一个单词的所有变位词中的合法单词。

基于这些,应用C 语言为开发工具,运用数据结构中线性表结构来实现词典变位词的检索系统。

本系统的开发是用C语言作为程序开发的工具,利用抽象数据类型,实现单词的变位词检索功能,系统首先处理用户给出的词典文件,之后系统从标准输入函数中反复接受一个单词或字符串的输入,然后系统输出该字符串的所有可能排列和其中形成的合法单词。

本文从分析词典变位词检索系统开发需求出发,描述了系统的总体设计、详细设计、调试和测试等整个系统的设计和实现过程,并对系统的完成情况进行总结。

关键词:全排列;合法单词;词典文件1绪论随着学生英语单词量的不断增加,为了方便学生记忆更多的单词,可以将一个单词的所有变位词一起进行记忆。

词典变位词检索系统就是从词典中查找输入单词的变位词中的合法单词的系统。

根据课程设计任务书要求,本系统开发主要完成以下功能和性能。

(1) 处理词典文件:从用户给出的词典文件中读取单词进线性表。

(2)求出变位词并输出合法单词:输入单词后输出单词字母所有可能形成的变位词,即单词的全排列,然后从词典中检索出生成的全排列中的合法单词。

(3)循环输入单词:系统可以循环输入单词进行检索。

2系统分析2.1 功能需求本系统主要是从词典中检索出单词变位词的系统。

该系统需要有处理词典、求出变位词并输出合法单词、循环输入单词的功能。

2.2数据需求根据分析,本系统中主要涉及到的数据为单词。

2.3 性能需求要求性能稳定可靠、运算速度快、安全性能高、方便易懂性、使用合理性、实用性强、可移植性好。

3总体设计3.1系统设计方案系统采用抽象数据类型线性表,线性表的各种定义如下:(1) 抽象数据类型定义线性表的抽象数据类型定义如下:ADT List{数据对象:D={a i|ai∈ElemSet,i=1,2,...,n, n≥0}数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}基本操作:InitList(&L)操作结果:构造一个空的线性表L。

DestroyList(&L)初始条件:线性表L已存在。

操作结果:线性表L被销毁。

ClearList(&L)初始条件:线性表L已存在。

操作结果:将线性表L重置为空。

ListEmpty(L)初始条件:线性表L已存在。

操作结果:若线性表L为空,则返回TRUE,否则FALSE。

NextElem(L,cur_e,&next_e)初始条件:线性表L已存在。

操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。

GetElem(L,i,&e)初始条件:线性表L已存在且非空。

操作结果:用e返回L中第i个元素的值。

}ADT List(2) 全局变量int m;//记录字符串长度int n;//记录字符串中的字符种类数char map[256];//记录是哪几种字符char A[256];//接收排完的字符串int count[256];//记录每种字符有多少个int stack[1000];//记录字符的位置(3) 存储结构采用顺序表的链式存储结构。

(4) 检索算法系统采用单链表存储,检索过程主要采用字符串匹配来实现。

3.2功能模块设计词典变位词检索系统分为三个模块,分别为读入词典、求出变位词并输出合法单词、循环输入单词。

功能模块图如图1所示。

图1功能模块图(1) 读入词典模块读入词典模块,实现从用户给出的词典文件中读入单词进线性表。

(2) 求出变位词并输出合法单词模块求出变位词并输出合法单词模块,实现输入单词后输出单词字母所有可能形成的变位词,即单词的全排列,并从词典中检索出生成的全排列中的合法单词。

(3) 循环输入单词模块系统可以循环输入单词进行检索。

4详细设计词典变位词检索系统主要实现读入词典、求出变位词并输出合法单词、循环输入单词,它们的详细设计和实现过程如下介绍。

4.1 数据结构定义在本系统中使用了线性表数据结构,结构类型定义如下。

定义词典typedef char ElemType;typedef struct Diction{ElemType word[100];//单词struct Diction *next;//指针}Diction;4.2读入词典模块读入词典模块是将用户给出的diction.txt词典文件读入到链式存储结构的顺序表中。

具体实现流程如图2所示。

N图2读入词典流程图读入词典流程图解释如下:首先定义int k;Diction *head,*p1,*p2;FILE *fp;开辟新结点p1=p2=(Diction *)malloc(sizeof(Diction));令k=0记录单词个数,head=NULL,如果文件打不开输出提示并返回head,如果打开成功,读取一个单词给p1,当k=1时,说明是第一个单词head=p1,p2指向p1,以后循环,每读入一个单词给开辟的新结点p1,最后p2->next=NULL,返回head,并输出一共有多少单词。

4.3求出变位词并输出合法单词模块求出变位词并输出合法单词模块,先对输入的单词进行全排列,每排出一个可能,输出排列,从词典中依次对比看是否为合法单词,如果是存入新建的单链表中然后后全部输出合法单词。

程序流程如图3所示。

图3 求出变位词并输出合法单词流程图统计单词字符串的信息,用memset函数将数组空间初始化,m记录字符串长度,n记录字符串中的字符种类数,map记录是哪几种字符,count记录每种字符有多少个。

具体实现流程如图4所示。

N图4 求出变位词并输出合法单词流程图用stack记录字符的位置,复制字符数组map中第stack[i]个字符给A[i],同时输出字符,直到第一个可能的单词结束。

从词典链表中第一个结点存的单词开始,依次查找,知道最后一个,如果是合法单词,则新建结点p2,存入这个单词,直到所有全排列都输出结束后,将存储是合法单词的单链表HEAD带回,在主函数中输出。

4.4循环输入单词模块循环输入单词模块是用来在输出结果后跳转到“请输入单词”位置,使系统能实现循环输入单词进行检索功能。

该功能在主函数中用while(1)循环,printf("输入0继续1退出\n"),输入跳出条件用if判断,break跳出while结束程序来实现。

5调试与测试5.1 调试调试是软件开发过程中的一个重要环节,也是最复杂,对软件开发者来说也是最艰巨的任务。

调试的任务是及时改正测试过程中发现的软件错误。

具体地说,调试过程由两个步骤组成,它从表示程序中存在错误的某迹象开始,首先确定错误的准确位置,也就是找出哪个模块或哪个语句引起的错误。

然后仔细研究推断代码以确定问题的原因,并设法改正。

调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。

本系统调试过程中遇到问题、原因和解决方法如下面介绍。

(1)程序不能运行程序运行到输出单词所有的变位词时,出现错误,其原因是指针指向的位置出现错误导致程序传参错乱无法运行。

解决办法:使程序进入调试状态在传参出现错误的位置一句一句查找传递的参数是否是你所希望的,如若不是就加以修正。

(2)运行完程序一次有错误提醒原因是上次运行程序后没有关闭操作界面当点击编译时会有一个错误提示,解决方法:将上一次运行时的操作界面关闭。

5.2 测试软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。

或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。

过度测试则会浪费许多宝贵的资源。

到测试后期,即使找到了错误,然而付出了过高的代价。

测试数据过程如下:输入单词:stop此单词的全排列为:opst opts ospt otps otsp post pots psot psto ptos ptso sopt sotp spot spot stop stpo tops tosp tpos tpso tsop tspo其中是单词的有:postspotstop输入0继续1退出输入单词:bee此单词的全排列为:bee eeb ebe没有这个单词输入0继续1退出1结束。

经过测试,给出特定的单词在系统中都能找到相应的变位词,系统的功能和性能得以实现。

但是由于用户给出的词典中单词量有限,所以输入有些单词,在词典中不能找到相映的合法单词。

6结论经过两周的课程设计词典变位词检索系统基本完成,实现了任务书中的所有要求。

但是还有不足,比如说不可以将输入的单词的解释一起输出,同时检索单词的同义词,放到学习中实际应用性不算高等等。

最好是丰富其字典中的词汇量,提高其应用性。

结束语为期两个礼拜的C语言综合课程设计实习终于顺利完成,在这期间真正的学到了一些经验,能够熟练的掌握一些C语言的编程思路,能够熟练的运用学到的函数,并实现了一系列的功能。

在这期中我感受到了成功的喜悦,每个子功能实现都是在铺垫成功的基石。

我最大的收获是学会了体验自己独立完成事情的喜悦之情。

与此同时我提高了自己编成的能力,学会了较多的编成技巧,并且融合了C 语言知识,虽不是全部,但对我来说是质的飞跃。

路漫漫其修远兮,吾将上下而求索。

学习编程的路还很长,我将会更加努力的学习C语言,以便于我攀登编成的高峰。

参考文献[1]谭浩强.C语言程序设计(第三版).清华大学出版社[2]林碧英,C语言程序与设计教程.中国电力出版社,2006[3]美赫伯特.希尔特,王子恢等译.C语言大全.电子工业出版社,2003附录1-用户手册点击运行,首先读入词典文件,并输出词典中单词总数,如图4所示。

图5运行界面输入一个单词如“post”,按回车,输出单词的全排列,并输出全排列中的合法单词,如图5所示。

相关主题