数据结构课程设计简易文本编辑器Word格式文档下载.docx
《数据结构课程设计简易文本编辑器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计简易文本编辑器Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
(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键】,安全退出程序!
7、参考文献
《数据结构理论与实践》——杨永斌
8、对所设计的软件进行自我评价,如创新点、未解决的问题等情况说明。
拿到该课程题目,准备仿照电脑上的文本编辑器写该程序,由于我所学不是扎实,于是就借助课本上所学的串与数组,写好了这个程序,程序能够正确的完成,程序充分包含了本学期的所学内容,体现了数据结构的特点。
继续沿用了清屏函数,是屏幕看起来很舒服,不至于那么杂乱。
未解决的问题:
在完成插入,查找功能的时候,出现了问题,当程序执行到此处时,程序未能进入下一步,而是直接退出了。
当进入主菜单后,只能选择【1键】或者退出,这是未能得到优化的。
块移动(行块,列块移动),正确存盘、取盘;
正确显示总行数等功能未能完成。
九、程序源代码:
#include<
iostream.h>
stdio.h>
stdlib.h>
malloc.h>
string.h>
#defineSTRSIZE100
#defineMAXSTRING60
#defineMAXLINE24
/*存储结构*/
typedefstruct
{
char*ch;
intlength;
}SqVString;
/*由模式串nextval值*/
intj=0,k=-1;
nextval[0]=-1;
while(j<
T.length)
{
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算法*/
inti=pos,j=0,r;
while(i<
S.length&
&
j<
if(i<
S.ch[i]==T.ch[j])
++i;
++j;
elseif(j==0)
j=next[j];
if(j>
=T.length)
r=i-T.length;
else
r=-1;
returnr;
/*初始化串*/
inti;
char*c;
intlen=0;
c=str;
while(*c!
='
\n'
)
len++;
c++;
}/*求str的长度*/
S->
ch=(char*)malloc(len*sizeof(char));
/*申请动态数组空间*/
length=len;
/*置串的当前长度*/
for(i=0;
i<
S->
length;
i++)
S->
ch[i]=str[i];
/*赋值串值*/
/*串插入*/
intlen;
if(pos<
0||pos>
length)
cout<
<
"
\t\t插入位置不合法,其取值范围应该是[0,length]"
;
return0;
len=S->
length+T.length;
ch=(char*)realloc(S->
ch,len*sizeof(char));
if(!
ch)
\t\t分配空间出错,无法完成串插入操作"
for(i=S->
length-1;
i>
=pos;
i--)
ch[i=T.length]=S->
ch[i];
T.length;
ch[i+pos]=T.ch[i];
return1;
/*串删除*/
char*str;
0||len<
=0||pos>
length||S->
length<
=0)
\t\t删除位置pos及删除长度len不合法,无法完成删除操作"
length=S->
length-len;
if(length<
length=pos;
/*若pos+len大于串长,则从pos删到串尾*/
str=(char*)malloc(length*sizeof(char));
str)
\t\t分配空间出错,无法完成串的删除操作"
pos;
str[i]=S->
for(i=pos+len;
str[i-len]=S->
free(S->
ch);
length=length;
ch=str;
/*求子串*/
if(S.length<
\t\t空串,无法完成求子串操作"
S.length||len<
\t\t子串位置pos及子串长度len不合法,无法完成求子串操作"
if(pos+len>
S.length)
len=S.length-pos+1;
/*当子串长度超过主串长度,则只取到串尾即可*/
if(T->
free(T->
/*释放S的原有空间*/
T->
T->
\t\t分配空间出错,无法完成求子串操作"
len;
T->
ch[i]=S.ch[i+pos];
/*串连接*/
\t\t分配空间出错,无法完成串连接操作"
ch[i+S->
length]=T.ch[i];
/*串赋值*/
intcount=0;
//S=(SqVString*)malloc(sizeof(SqVString));
if(S->
length!
free(S->
c=value;
count++;
}/*求value的长度*/
count)/*value为空串*/
ch=NULL;
length=0;
ch=(char*)malloc(count);
if(!
{
cout<
\t\t分配空间出错,无法完成串赋值操作"
return0;
for(i=0;
count;
S->
ch[i]=value[i];
length=count;
SqVString*lines[MAXLINE];
voidInputString()
charbuffer[MAXSTRING];
SqVString*tmp;
intLineNum=0;
flushall();
cout<
\t\t================================================"
endl;
\t\t新建文本"
\t\t[请输入文本,每以回车结束,一段以#结束行]"
do
cin>
>
buffer;
tmp=(SqVString*)malloc(sizeof(SqVString));
InitString(tmp,buffer);
lines[LineNum]=tmp;
LineNum++;
}while(buffer[0]!
#'
);
//cout<
\t\tOK..."
voidDeleteString()
\t\t删除文本"
\t\t请输入要删除行的行号:
cin>
i;
free(lines[i-1]);
while(lines[i]->
ch[0]!
lines[i-1]=lines[i];
i++;
lines[i-1]=lines[i];
voidInsertSubstring()
inti=0;
intpos=0;
SqVStringtmp;
\t\t插入子串"
\t\t请输入子串所在的行号:
\t\t请输入插入位置:
\t\t请输入子串值:
InitString(&
tmp,buffer);
StrInsert(lines[i],pos,tmp);
voidDeleteSubstring()
\t\t删除子串"
\n\t\t请输入删除的起始位置:
\t\t请输入删除的字符数:
StrDelete(lines[i],pos,len);
\t\tOK..."
voidFindSubstring()
intnext[MAXSTRING];
\t\t查找文本"
\t\t请输入要查找的子串:
GetNextval(tmp,next);
if((pos=KMPIndex(*lines[i],0,next,tmp))!
=-1)
\t\t[子串"
buffer<
在第"
i+1<
行的"
pos<
位置上出现]"
return;
voidDisplayString()
\t\t显示文本"
lines[i]->
ch<
voidcd()//进入界面
endl<
\t\t"
____________________________________________"
--------------------------------------------"
♀欢·
迎·
使·
用♀"
♂————————————————————♂"
→简易文本编辑器←"
·
↓重庆工商大学派斯学院↓"
↑计算机科学系↑"
♀制作人:
10计本2班邓寅森♀"
∶2011年11月∶"
→→→点击【回车】进入←←←"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
voidts()
\t\t--------------------------------"
\t\t主菜单"
\t\t1、输入文本"
endl