结构数据结构课程设计简易文本编辑器.docx
《结构数据结构课程设计简易文本编辑器.docx》由会员分享,可在线阅读,更多相关《结构数据结构课程设计简易文本编辑器.docx(18页珍藏版)》请在冰豆网上搜索。
结构数据结构课程设计简易文本编辑器
【关键字】结构
班级:
10计本2班
姓名:
邓寅森
学号:
02
指导教师:
杨老师
完成日期:
2011年12月
计算机科学与技术系课程设计评分表
课程名称:
数据结构简易文本编辑器
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
功能完善度
综合成绩
学号
班级
姓名
综合成绩
02
10计本2班
邓寅森
教师评语
教师签名:
日期:
一、需求分析
1.1问题描述
传统的纸质文档已经不能满足大家的需求,有容易丢失、查找不方便等缺点。
计算机信息管理为人们的生活、工作提供了方便,提高了效率。
“简易文本编辑器”是为了帮助老师、同学或其他一些需要使用文本编辑的人员进行管理和分析的一种计算机应用程序。
1.2基本任务
通过用户调查分析及实际需求,系统需要实现如下基本任务:
(1)输入数据信息建立文本;
(2)查询文本中满足要求的信息;
(3)插入新的信息到文本中;
(4)删除不再需要的文本信息;
(5)查看所有的文本信息。
二、概要设计
为了完成需求分析的基本任务,主要从以下3个方面进行设计:
2.1主界面设计
为了实现简易文本编辑器的各项功能,设计了一个含有多个菜单项的主控菜单模块以操作系统的各项功能,以方便用户使用系统。
系统加入菜单运行界面如图所示:
简易文本编辑器主菜单
2.2数据结构设计
系统采用线性表的顺序存储结构表示和存储“简易文本编辑器”中的信息。
实现文本的输入,删除,插入,查找,显示功能。
2.3系统功能设计
运行程序,提示加入菜单,按“回车键”加入主菜单,再可以在主菜单上进行各项操作。
每次加入菜单,选择“1键”新建文本,然后才可以进行其他操作,或者按“0键”选择退出。
三、模块设计
3.1模块设计
系统主要包含主程序模块和其它操作模块。
其调用关系如图所示。
模块调用示意图
3.2系统子模块及其功能设计
本系统共设计了16个子模块,各程序的函数名及功能说明如下:
1、/*由模式串nextval值*/
voidGetNextval(SqVStringT,intnextval[])
2、/*模式匹配KMP算法*/
intKMPIndex(SqVStringS,intpos,intnext[],SqVStringT)
3、/*初始化串*/
voidInitString(SqVString*S,char*str)
4、/*串插入*/
intStrInsert(SqVString*S,intpos,SqVStringT)
5、/*串删除*/
intStrDelete(SqVString*S,intpos,intlen)
6、/*求子串*/
intSubStr(SqVStringS,intpos,intlen,SqVString*T)
7、/*串连接*/
intConcat(SqVString*S,SqVStringT)
8、/*串赋值*/
intStrAssign(SqVString*S,char*value)
9、voidInputString()//新建
10、voidDeleteString()//删除
11、voidDeleteSubstring()//删除
12、voidInsertSubstring()//查找
13、voidDisplayString()//显示
14、voidcd()//进入界面
15、voidts()//主菜单
16、voidtc()//退出
3.3系统模块之间的调用关系
系统的16个子模块之间的主要调用关系所示:
系统函数调用关系图
四、详细设计
4.1数据结构设计
系统采用线性表的顺序存储结构存储通讯录信息。
4.2系统主要模块设计
(1)建立文本模块,由voidInitString(SqVString*S,char*str)函数实现。
该模块的算法思想是:
按照给定的线性表存储空间的初始化分配量分配存储空间,若分配成功,则往下进行;令线性表长为0;令线性表当前存储容量为给定的线性表存储空间的初始化分
配量。
该模块的算法描述如下:
见源程序
(2)查看文本中得所有记录,需要一个模式匹配intKMPIndex(SqVStringS,intpos,intnext[],SqVStringT)函数实现。
该模块的算法思想是:
在此略
该模块的算法描述如下:
见源程序
(其它模块设计略)
五、调试分析
5.1、调试方法:
首先打开MicrosoftVisualC++6.0,运行程序,出现错误修改再运行,直至运行结果0error,0warning结束。
接着进入程序界面,看程序能否实现所要求的各项功能,再作下一步的修改。
5.2、调试结果
主菜单
新建
显示
删除
查找
插入
退出
5.3、程序出现的问题:
还有几个程序模块未能成功调用。
(其他问题见“第八项中未能解决的问题”)
六、用户使用说明
当用户打开程序,就会提示按【回车键】进入,按【回车键】则进入主菜单页面,进入主菜单,选择【1键】,新建文本信息,编辑好后,按照程序中的文字提示,返回到主菜单,此时在主菜单选择其他操作,当进入各项操作,均有提示。
每一操作完成,按【回车键】返回主菜单,选择【0键】,安全退出程序!
七、参考文献
《数据结构理论与实践》——杨永斌
八、对所设计的软件进行自我评价,如创新点、未解决的问题等情况说明。
拿到该课程题目,准备仿照电脑上的文本编辑器写该程序,由于我所学不是扎实,于是就借助课本上所学的串与数组,写好了这个程序,程序能够正确的完成,程序充分包含了本学期的所学内容,体现了数据结构的特点。
继续沿用了清屏函数,是屏幕看起来很舒服,不至于那么杂乱。
未解决的问题:
在完成插入,查找功能的时候,出现了问题,当程序执行到此处时,程序未能进入下一步,而是直接退出了。
当进入主菜单后,只能选择【1键】或者退出,这是未能得到优化的。
块移动(行块,列块移动),正确存盘、取盘;正确显示总行数等功能未能完成。
九、程序源代码:
#include
#include
#include
#include
#include
#defineSTRSIZE100
#defineMAXSTRING60
#defineMAXLINE24
/*存储结构*/
typedefstruct
{
char*ch;
intlength;
}SqVString;
/*由模式串nextval值*/
voidGetNextval(SqVStringT,intnextval[])
{
intj=0,k=-1;
nextval[0]=-1;
while(j{
if(k==-1||T.ch[j]==T.ch[k])
{
j++;
k++;
if(T.ch[j]==T.ch[k])
nextval[j]=nextval[k];
else
nextval[j]=k;
}
else
k=nextval[k];
}
}
/*模式匹配KMP算法*/
intKMPIndex(SqVStringS,intpos,intnext[],SqVStringT)
{
inti=pos,j=0,r;
while(i{
if(i{
++i;
++j;
}
elseif(j==0)
++i;
else
j=next[j];
}
if(j>=T.length)
r=i-T.length;
else
r=-1;
returnr;
}
/*初始化串*/
voidInitString(SqVString*S,char*str)
{
inti;
char*c;
intlen=0;
c=str;
while(*c!
='\n')
{
len++;
c++;
}/*求str的长度*/
S->ch=(char*)malloc(len*sizeof(char));/*申请动态数组空间*/
S->length=len;/*置串的当前长度*/
for(i=0;ilength;i++)
S->ch[i]=str[i];/*赋值串值*/
}
/*串插入*/
intStrInsert(SqVString*S,intpos,SqVStringT)
{
inti;
intlen;
if(pos<0||pos>S->length)
{
cout<<"\t\t插入位置不合法,其取值范围应该是[0,length]";
return0;
}
len=S->length+T.length;
S->ch=(char*)realloc(S->ch,len*sizeof(char));
if(!
S->ch)
{
cout<<"\t\t分配空间出错,无法完成串插入操作";
return0;
}
for(i=S->length-1;i>=pos;i--)
S->ch[i=T.length]=S->ch[i];
for(i=0;iS->ch[i+pos]=T.ch[i];
S->length=len;
return1;
}
/*串删除*/
intStrDelete(SqVString*S,intpos,intlen)
{
inti;
intlength;
char*str;
if(pos<0||len<=0||pos>S->length||S->length<=0)
{
cout<<"\t\t删除位置pos及删除长度len不合法,无法完成删除操作";
return0;
}
length=S->length-len;
if(length<=0)
length=pos;/*若pos+len大于串长,则从pos删到串尾*/
str=(char*)malloc(length*sizeof(char));
if(!
str)
{
cout<<"\t\t分配空间出错,无法完成串的删除操作";
return0;
}
for(i=0;istr[i]=S->ch[i];
for(i=pos+len;ilength;i++)
str[i-len]=S->ch[i];
free(S->ch);
S->length=length;
S->ch=str;
return1;
}
/*求子串*/
intSubStr(SqVStringS,intpos,intlen,SqVString*T)
{
inti;
if(S.length<=0)
{
cout<<"\t\