数据结构课程设计简易文本编辑器.docx
《数据结构课程设计简易文本编辑器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计简易文本编辑器.docx(27页珍藏版)》请在冰点文库上搜索。
数据结构课程设计简易文本编辑器
课程设计说明书
课程名称:
数据结构课程设计
专业:
电子信息科学与技术班级:
2012-1
设计人:
山东科技大学
2015年7月11日
山东科技大学
课程设计任务书
一、课程设计题目:
简易文本编辑器
二、设计原始资料:
[1]严蔚敏、吴伟民,数据结构(C语言版)清华大学出版社2012,05 [2] 孙承爱、赵卫东,程序设计基础—基于C语言科学出版社2010,10
三、设计应解决下列各主要问题:
____1、 具有菜单图形界面;
2、 具有查找、替换、插入、块移动、删除等功能;
3、 可正确存盘、取盘;
4、 正确显示总行数
四、设计说明书应附有下列图纸:
1、 模块调用图
2、程序流程图
五、小组分工说明:
六、命题发出日期:
2015/7/4_设计完成日期:
2015/7/11
指导教师评语
成绩:
指导教师(签章):
年 月 日
1需求分析说明
简易文本编辑器的总体目标:
在VisualStudio的开发环境下,利用所学C语言和数据结构的相关知识,开发一个具有良好人机界面的简易文本编辑器,实现对文本的简单修改,从而达到编辑文本以及查看文本信息的目的。
基本功能如下:
(1)界面友好,易与操作。
采用菜单或其它人机对话方式进行选择。
(2)能正确打开所键入的文本路径,并能够读取相应文本信息。
(3)能对打开的文本进行文本信息显示、替换、查找、块移动、删除等基本操作。
(4)能够正确对修改后的文本内容存盘。
(5)正确显示文本总行数。
以下是各功能模块的功能描述:
1.1主函数模块
主函数模块的主要功能是初始化菜单界面,功能按键选择并调用相关模块,实现软件功能。
1.2菜单显示及输出子模块
菜单显示模块的主要功能是将菜单进行显示,内容包括本设计的主要功能及相关代号。
文本显示模块的主要功能是将所要显示的文本信息通过传入的参量传入本模块进行显示。
输出模块主要功能是输出文本所有信息。
1.3查找功能子模块
本模块的主要功能是通过输入想要查找的文本信息,返回文本中所要查找的文本信息的所处起始位置。
1.4替换功能子模块
本模块的主要功能是将输入的被替换的文本替换为替换的文本信息,并能够显示文本信息。
1.5插入功能子模块
本模块的主要功能是将需要插入的文本信息插入到指定的位置,并能够显示修改后的文本信息。
1.6块移动功能模块
本模块的主要功能是将所要移动的模块移动到指定的相应位置,并能够显示修改后的文本信息。
1.7删除功能模块
本模块的主要功能是删除指定的文本。
1.8读盘功能模块
本模块的主要功能是将存于磁盘内的文件读取,以便后续操作过程中使用。
1.9存盘功能模块
本模块的主要功能是将改变后的文件存于磁盘,以便下次使用。
1.10测试数据:
存于磁盘下的.txt文件(可自己定义)。
2概要设计说明
2.1设计思想
本次设计主要是运用在主模块中的switch,case语句进行调用相关函数实现文本编辑器的基本功能,运用链式存储结构,链式存储结构能够通过结点指针的next值的改变实现插入、替换、移动、删除等一系列操作;通过KMP算法实现查找功能;通过C语言自带的文件操作函数实现文件的读取与存盘等功能。
2.2模块调用图
2.3程序代码简介
#defineSTRING_MAXSIZE256//定义串的长度
#defineERR_NOMEMORY-1
charsource_str[STRING_MAXSIZE];//将文件内资源以字符串存于此变量
intlen;//存储原始字符串的长度
//定义数据存储的结构,以链结构存储
typedefstructLNode{
chardata;
structLNode*next;
}LNode,*LinkList;
LinkListL=0;//定义全局变量字符串的起始指针
voidmenu()//菜单显示函数,显示菜单,无传递参数,
//接调用
LinkListInit(charInit_str);//初始化函数,将资源转化为所定义的连//式结构,传入参数为所要初始化的文本,//返回值为LinkList类型的头指针。
intInput(charinput_string[]);//插入函数,在默认在文本末尾插入文本,//传入参量为所要插入的文本信息,返回//值为修改后的文本信息。
voidOutput();//输出函数,输出文本所包含的信息,无//传入参量,无返回值
intSearch(charsearch_str[]);//查找函数,查找相应的字符串函数传入//参量为指定的查找文本信息,返回查找//到的参数。
voidReplace(charbereplaced_str[],charreplace_str[]);//替换函数,替换相应文本信息,传入参//量为被替换的文本信息,以及替换的文//本信息。
voidInsert(charinsert_str[],intlocation);
//插入函数,在指定位置插入指定信息,//传入参量为需要插入的文本信息,以及//插入的相关位置。
voidMove(charbemoved_str[],intlocation);
//块移动函数,将文本信息中的指定信息//移动到指定位置,传入参量为需要移动//的文本块以及指定的移动位置。
voidDelete(chardelete_str[]);//删除函数,删除相应的文本信息,传入//参数为指定的被删除的文本
voidDisplay(intlen_dis);//显示函数,传入参量为所要显示的文本//长度。
voidsave();//存盘函数,将所改变的文本存入到磁盘//中,无传入参数,无返回参数
voiddelay();//延时函数
intStringLength(LinkListS);//求串长函数,传入参数为要求的串的长//度,返回参数为文本的长度
voidstatistics();//统计行数,无传入参数,无返回值。
voidKMPGetNext(char*T,intn2,intnextval[]);
intKMPIndex(char*S,intn1,char*T,intn2);//KMP算法,求文本的位置
3详细设计说明
3.1主函数模块
主函数模块的主要功能是调用menu函数初始化菜单界面,并调用Openfile函数将存于本地磁盘内的文件读出到source_str[]数组中以备后续调用,并在将字符数组初始化为链表之后进入功能按键选择,通过switch语句进行相应的功能操作并调用相关模块,实现软件功能。
3.2菜单显示及输出子模块
菜单显示模块的主要功能是将菜单进行显示,本模块调用menu函数,menu函数由printf函数进行格式的输出,并通过system()函数进行颜色的改变,以及清屏等操作,主要输出内容包括本设计的介绍、小组信息、主要功能及相关代号。
输出模块主要功能是输出文本内容以及总行数,主要是调用Output函数和statistics函数将文本基本信息进行打印。
Output函数主要是将changed_source_str字符数组进行输出打印,changed_source_str字符数组是存储操作后的source_str字符数组;statistics函数主要是统计文本中换行和结束符的个数,并输出打印count。
3.3查找功能子模块
本模块的主要功能是通过调用Search函数实现基本功能,Search函数通过读入用户输入的想要查找的文本信息,通过调用KMP算法函数返回文本中所要查找的文本信息的所处起始位置search_loc,若找不到子串,则返回-1。
获取子串的next函数如下:
voidKMPGetNext(char*T,intn2,intnextval[])
//求子串T的next函数修正值并存入数组nextval
{
intj=1,k=0;
nextval[0]=-1;
while(j{
if(k==0||T[k]==T[j])
{
nextval[j]=T[k]==T[j]?
nextval[k]:
k;
j++;
k++;
}
else
k=nextval[k];
}
}
具体的KMP算法如下:
intKMPIndex(char*S,intn1,char*T,intn2)
//利用子串T的next函数求T在主串S中的位置
{
inti=0,j=0;
int*next=(int*)malloc(n2*sizeof(int));
if(!
next)returnERR_NOMEMORY;
KMPGetNext(T,n2,next);
while(i{
if(j==-1||S[i]==T[j])//继续比较后继字符
{
i++;
j++;
}
else//模式串向右移动
j=next[j];
}
free(next);
return(j>=n2?
i-n2:
-1);
}
Search函数的描述如下:
intSearch(charsearch_str[])
{
chars[STRING_MAXSIZE];
inti=0;
intsearch_loc,search_len,s_len;
LNode*p;
p=L->next;
while(p)//获取修改后的文本信息
{
s[i++]=p->data;
p=p->next;
}
s_len=strlen(s);
search_len=strlen(search_str);
if(search_len<=s_len)
{
search_loc=KMPIndex(s,s_len,search_str,search_len);//利用KMP算法获取查找的位置
returnsearch_loc;
}
else
{
return-1;//未找到
}
}
3.4替换子模块
本模块的主要调用Replace函将输入的被替换的文本转换为替换的文本信息,并显示文本信息。
Replace函数通过调用for循环得到被替换的文本的前一节点的指针*p,以及被替换文本的后一节点的指针*s,调用Init函数使替换文本初始化为连式存储并返回此链的头节点指针存于*w,for循环得到替换文本最后一位节点的指针*w。
通过指针的操作将被替换的文本卸下,并连接替换文本组成新链。
最终打印输出此链。
具体的实现函数如下:
intReplace(charreplaced_str[],charreplace_str[])
{
intj=0;
intreplaced_str_loc,replaced_str_len,reped_len,source_str_len;
LNode*p,*s,*z,*w;
replaced_str_len=strlen(replaced_str);//被替换的字符的长度
reped_len=strlen(replace_str);//需要替换的字符的长度
source_str_len=strlen(source_str);//主串字符的长度
replaced_str_loc=Search(replaced_str);//被替换的字符的位置
if(replaced_str_loc!
=-1)
{
LTmp=Init(replace_str);
p=L;
s=L;
z=LTmp->next;
w=LTmp;
for(j=0;jp=p->next;
for(j=0;j<(replaced_str_loc+replaced_str_len);j++)
s=s->next;
for(j=0;jw=w->next;
p->next=z;
w->next=s->next;
Display();
return0;
}
else
{
printf("**************************************\n");
printf("*主银!
!
您所被替换的文本不存在哦~~*\n");
printf("**************************************\n");
}
}
3.5插入子模块
本模块的主要通过调用Insert函数实现基本功能。
Insert函数是将需要插入的文本信息插入到指定的位置,并显示修改后的文本信息。
此函数采用边生成新节点边插入的方式完成,通过while循环得到插入位置的指针*p,将插入文本的第i位赋值给新生成的结点s->data,p的next指向新生成的结点s,依次循环直到将整个文本插入完成。
具体的实现函数如下:
voidInsert(charinsert_str[],intlocation)
{
inti,j,len_ins,source_str_len;
LNode*p,*s;
len_ins=strlen(insert_str);
source_str_len=strlen(source_str);
if((location<=source_str_len)&&(location>=0))
{
p=L;
j=0;
for(i=0;i{
while(p&&j{
p=p->next;
j++;
}
s=(LinkList)malloc(sizeof(LNode));//生成新结点
s->data=insert_str[i];
s->next=p->next;
p->next=s;
p=p->next;
}
len_ins=strlen(source_str)+len_ins;
Display();
}
else
{
……
}
}
3.6块移动模块
本模块的主要通过调用Move函数实现基本功能,Move函数将所要移动的模块移动到指定的相应位置,并显示修改后的文本信息。
Move函数通过改变next值来实现移动的目的。
思想类似于Replace函数,首先得到块的前一位结点的指针*p,块最后一位节点的指针,要移动位置的指针*w,通过结点的next值得改变得到新链,打印输出。
具体函数如下:
voidMove(charbemoved_str[],intlocation)
{
intj,bemoved_str_loc=0,bemoved_str_len=0,source_str_len;
LNode*p,*s,*w,*temp;
bemoved_str_loc=Search(bemoved_str)+1;
bemoved_str_len=strlen(bemoved_str);
source_str_len=strlen(source_str);
if((bemoved_str_loc)>0)
{
if((location<=source_str_len)&&(location>=0))
{
p=L;
s=L;
w=L;
for(j=0;j{
p=p->next;
}
temp=p->next;
for(j=0;j<(bemoved_str_loc+bemoved_str_len-1);j++)
s=s->next;
for(j=0;jw=w->next;
p->next=s->next;
s->next=w->next;
w->next=temp;
Display();
}
else
{
……;
}
}
else
{
……;
}
}
3.7删除模块
本模块的主要通过调用Delete函数实现基本功能,Delete函数是删除指定的文本。
并输出打印操作完成后的结果。
Delete函数通过调用Search函数得到待删除文本的位置,并通过while循环得到待删除文本的前一个结点的位置指针*q和待删除文本的后一个结点的位置指针*p(如遇到换行符则将*p指针向后移动一位。
),将*q的next值指向*p即得到删除后的文本。
最后打印输出。
具体实现函数如下:
voidDelete(chardelete_str[])
{
intloc;//记录要删除的文本的位置
inti,j=0;
intlen_del;
LNode*p,*q;
p=L;
len_del=strlen(delete_str);
loc=Search(delete_str)+1;
if((loc-1)>=0)
{
for(i=0;i{
while(p->next&&j{
p=p->next;
j++;
}
q=p->next;//删除结点
if(q->next->data==10)
q=q->next;
p->next=q->next;
}
len=strlen(source_str)-len_del;
Display();
}
else
{
……;
}
}
3.8读盘功能模块
本模块的主要通过调用OpenFile函数实现基本功能,OpenFile函数主要实现将存于磁盘内的文件读取,以便后续操作过程中使用。
OpenFile函数以只读的方式调用fopen函数读取文本内容并存于字符数组source_str中,存储完后通过fclose函数将其关闭。
函数实现如下
voidOpenFile()
{
charch,meng[33];
inti=0,flag=1,copy_num;
FILE*fp1;
printf("你猜你要输入什么样儿滴文本路径(我看这个不错f:
\\1.txt)\n");
scanf("%s",way);
if((fp1=fopen(way,"r"))==NULL)
{
while(flag)
{
printf("总统大人,您的文件不在磁盘里呢,是不是在U盘,再¨来一遍!
\n");
scanf("%s",way);
fp1=fopen(way,"r");
if(fp1!
=NULL)
flag=0;
else
flag=1;
}
}
if((fp1=fopen(way,"r"))!
=NULL)
{
while(!
feof(fp1))
{
ch=fgetc(fp1);
source_str[i++]=ch;
}
source_str[i]='\0';
for(i=0;isource_str[i]=source_str[i];
source_str[i]='\0';
for(copy_num=0;copy_numchanged_source_str[copy_num]=source_str[copy_num];
printf("我已经把他印在脑海里了!
给你看下一个画面,不要捉急...\n");
delay();
fclose(fp1);
system("cls");
menu();
}
}
voiddelay()
{
inti,j;
for(i=0;i<55000;i++)
for(j=0;j<11000;j++);
}
3.9存盘功能模块
本模块的主要通过调用save函数实现基本功能,save函数是将改变后的文件存于磁盘,以便下次使用。
Save函数以写的方式调用fopen函数打开源文件,并调用fprintf函数将改变的字符数组changed_source_str写入到其中。
最后,调用fclose函数关闭本文件。
函数实现如下
voidsave()
{
FILE*fp2;
fp2=fopen(way,"w");
fprintf(fp2,"%s",changed_source_str);
fclose(fp2);
}
3.10流程图
4调试分析
4.1遇到的问题
●文本在改变后不能输出功能不能正确执行
打印的还是没有编辑过的前文本内容。
分析发现在供打印输出的字符数组没有被及时的更新,因此每次都是显示原始的信息,这就会使退出时不能将编辑过的文本正确保存。
解决方法:
在Display函数里将编辑过的文本重新赋值到全局变量的字符数组changed_source_str中,此问题得到解决。
●执行查找功能时,输出错误信息
如在含有“abcdefgh”字符的文本中查找“a”