简易文本编辑器--数据结构课设.doc
《简易文本编辑器--数据结构课设.doc》由会员分享,可在线阅读,更多相关《简易文本编辑器--数据结构课设.doc(25页珍藏版)》请在冰点文库上搜索。
![简易文本编辑器--数据结构课设.doc](https://file1.bingdoc.com/fileroot1/2023-4/28/41de66c0-2931-4867-a81f-4baa77f40f2b/41de66c0-2931-4867-a81f-4baa77f40f2b1.gif)
摘要
当下C++语言是一门重要的课程学习,学会运用并结合其他的知识一起解题是一件值得我们重视的,数据结构是一门结合C++知识的重要课程,因此我们要学会将平时课本的知识运用到我们现实生活当中,这样才能让我们所学的知识更加深刻。
简易文本编辑器的问题就是一个例子,传统的纸质文档已经不能满足大家的需求,有容易丢失、查找不方便等缺点。
计算机信息管理为人们的生活、工作提供了方便,提高了效率。
“简易文本编辑器”就是为了帮助老师、同学或其他一些需要使用文本编辑的人员进行管理和分析的一种计算机应用程序。
关键词:
简易文本编辑器,数据结构,顺序表。
目录
一、需求分析 1
1.1问题描述 1
1.2基本任务 1
二、概要设计 1
2.1主界面设计 1
2.2数据结构设计 1
三、详细设计 2
3.1清空内容模块 2
3.2打开文件模块 2
3.3输入模块 2
3.4插入模块 2
3.5删除模块 2
3.6替换模块 2
3.7显示模块 2
3.8保存模块 3
3.9系统层次图 3
四、测试结果 3
4.1文本编辑器主界面 3
4.2系统功能 4
五、调试分析 7
六、心得体会 8
七、参考文献 9
八、程序源代码 10
一、需求分析
1.1问题描述
传统的纸质文档已经不能满足大家的需求,有容易丢失、查找不方便等缺点。
计算机信息管理为人们的生活、工作提供了方便,提高了效率。
“简易文本编辑器”就是为了帮助老师、同学或其他一些需要使用文本编辑的人员进行管理和分析的一种计算机应用程序。
1.2基本任务
通过用户调查分析及实际需求,系统需要实现如下基本任务:
(1)输入数据信息建立文本;
(2)打开文本读取已保存的信息;
(3)插入新的信息到文本中;
(4)删除不再需要的文本信息;
(5)替换不需要的文本信息;
(6)显示所有的文本信息;
(7)保存所输入、插入、替换过的文本信息;
(8)清空文本信息。
二、概要设计
2.1主界面设计
为了实现简易文本编辑器的各项功能,设计一个含有多个菜单项的主控菜单模块以操作系统的各项功能,进而方便用户使用系统。
2.2数据结构设计
为实现数据的有序存储,该编辑器应该用顺序存储结构来存储输入的信息。
顺序表是数据结构中线性表的一种,它是用一块地址连续的存储空间依次存储线性表的元素。
其特点为:
在顺序表上逻辑关系相邻的俩个元素在物理位置上也相邻;在顺序表上可以随即存取表中的元素。
三、详细设计
3.1清空内容模块
清空以前的文本信息,将用数组存的数据内容全部置为0。
3.2打开文件模块
确认打开文件并提示未保存的数据将会丢失,如果未选择打开文件,则返回主菜单。
3.3输入模块
输入文本信息,从主菜单中选择输入,提示输入内容,并统计文本字符数和行数。
3.4插入模块
插入文本信息,首先在数组中查找要插入点,如果找到该插入点,提示输入插入信息,确认插入信息后,提示选择向前插入信息还是向后插入信息,如果未找到插入点,显示未找到要插入的位置。
3.5删除模块
删除文本信息,首先在数组中查找要删除的信息,如果找到该信息,提示是否确认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息。
3.6替换模块
替换文本信息,首先在数组中查找要被替换的信息,如果找到该信息,提示输入要替换的信息内容,否则提示未找到要被替换的信息。
3.7显示模块
显示当前文本信息,遍历用数组存入的信息,并输入到外部显示器上。
3.8保存模块
保存当前信息,并提示输入文件名,确认保存之后提示保存成功。
3.9系统层次图
简易文本编辑器
清空内容
输
入
保
存
显
示
替
换
删
除
插
入
打开文件
图3-1系统层次图
四、测试结果
4.1文本编辑器主界面
主界面功能,如图4—1所示。
图4—1文本编辑器主界面
4.2系统功能
⑴输入文本信息功能,如图4—2所示。
图4—2输入界面
⑵查找文本信息,如图4—3所示。
图4—3查找功能界面
⑶显示文本信息,如图4—4所示。
图4—4显示文本界面
⑷插入操作,如图4—5所示。
图4—5插入功能界面
⑸删除操作,如图4—6所示。
图4—6删除功能界面
⑹替换文本内容,如图4—7所示。
图4—7替换功能界面
⑺文件保存,如图4—8所示。
图4—8保存功能界面
五、调试分析
程序设计没有按照一定的流程来,导致程序臃肿,可重复利用率太低,比如程序中的chazhao函数,在替换,删除等的过程中可以充分利用到,从而减少代码的长多,提高可读性和减少时间的复杂性,设计开始的时候没有充分考虑到,到最后无法在短时间内修改完成;
程序的选择语句运行比较的多,当初是为了程序的安全和便捷,选择了较多的选择,确认步骤,这样一来使得程序中的选择语句比较的多,比较乱。
这个在概要设计中没有充分的理清思路,导致程序的可读性较差。
六、心得体会
这是第一次比较全面的设计一个可执行多种功能的程序的课程设计,暴露出较多的知识点的缺乏,比如文件的打开与保存等。
程序的运行结果与理论推导结果基本吻合,即该算法与程序设计基本满足课程设计要求。
该程序的优点是简单易懂,不存在理解上的障碍,很自然地能想到这种解法。
但是该程序比较臃肿,可重复利用率低,还有待修改和完善。
通过这次数据结构的课程设计使我对所学知识有了更好的理解,增强了自己的动手能力,但同时也发现了自己的不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。
通过这个实验,使我基本操作有了一定的思路,知道该从哪里着手去完成一项功能编译,也让我学会了如何通过书籍查阅到自己想要的信息,并有一个思维方向去解决编译时出现的问题,提高了我的编程效率,我想这对我以后的学习会有很大的帮助,会让我有信心去完成下一个实验。
七、参考文献
[1]严蔚敏吴伟名编著,《数据结构》,清华大学出版社,2007年9月
[2]谭浩强编著,《c语言程序设计》,清华大学出版社
[3]钱能.C++程序设计教程(第二版)[M].北京:
清华大学出版社,2005
八、程序源代码
#include
#include
#include
#include
#defineMAX10000
#define_CRT_SECURE_NO_DEPRECATE //在vs中取消warning的警告
voidmenu();
voidshuru(chartext[]);
voidbc(chartext[]);
voiddakai(chartext[]);
voiddayin(chartext[]);
voidchazhao(chartext[],intl);
voidtihan(chartext[],intl);
intstrindex(chartext[],chart[],inti2,intl);
voidshanchu(charp[],intl);
voidcs(chartext[]);
voidcharu(chartext[],intl);
voidtuichu(intstatus);
chartext[MAX]=""; //文本编辑域
charname[20]=""; //文件保存的位置
intstatus=0; //显示是否保存过的状态
intntext; //文本编辑的位置
voiddakai(chartext[])
{
system("cls");
FILE*fp;
charpd,ch;
charname[30];
inti=0;
printf("输入A:
确定打开文件(未保存的数据将会丢失)M:
返回主菜单");
fflush(stdin);
pd=getchar();
if(pd=='A'||pd=='a')
{
printf("请输入要打开文件名字(例如c:
\\a.txt)");
scanf("%s",name);
while((fp=fopen(name,"r"))==NULL)
{
printf("\n打开文件失败,请重新输入要打开的文件名:
");
scanf("%s",name);
}
cs(text);
while(!
feof(fp))
{
ch=fgetc(fp);
text[i]=ch;
i++;
}
text[i]='\0';
ntext=i;
fclose(fp);
printf("\n文件读取成功\n文件内容为\n");
dayin(text);
}
if(pd=='M'||pd=='m')
menu();
}
voidbc(chartext[])
{
system("cls");
FILE*fp;
charpd;
chartmp;
inti;
printf("\n输入【A】保存;任意键返回主菜单不保存\n");
fflush(stdin);
pd=getchar();
if(!
(pd=='A'||pd=='a'))
{
menu();
}
else
{
if(name[20]==NULL)
{
printf("\n请输入保存文件名(例如:
c:
\\a.txt):
");
scanf("%s",name);
}
while((fp=fopen(name,"w+"))==NULL)
{
printf("文件不存在,请重新输入文件名:
");
scanf("%s",name);
}
printf("\nA:
确定;B:
取消:
");
while(scanf("%c",&tmp)!
=EOF)
{
if(tmp=='A'||tmp=='a')
{
for(i=0;i fprintf(fp,"%c",text[i]);
fclose(fp);
status=1;
printf("\n文件保存成功\n");
break;
}
if(tmp=='B'||tmp=='b')
{
break;
}
}
}
}
voidcs(chartext[])
{
inti;
for(i=0;i {
text[i]='\0';
}
ntext=0;
status=0;
}
intstrindex(chartext[],chart[],inti2,intl)//查找要操作的数据的位置(模式匹配)
{
inti1=l,j=0;
while(i1 {
if(text[i1]==t[j]) //继续匹配下一个字符
{
j++;
i1++;
//主串和子串依次匹配下一个字符
}
else //主串、子串指针回溯重新开始下一次匹配
{
i1=i1-j+1; //主串从下一个位置开始匹配
j=0;
//子串从头开始匹配
}
}
if(j>=i2)
{
return(i1-i2);
} //返回匹配的第一个字符的下标
else
return(-1); //模式匹配不成功
}
voidmenu()
{
system("cls");
time_ttimep;
time(&timep);
printf("%s",ctime(&timep));
printf("信息与计算科学1209010314范亚飞\n");
printf("\n\n\n\n\n\n\n\n\n\t\t\tWelcomtouseourTXTeditionsystem!
\n");
printf("\n\n\t\t\t欢迎您使用文本编辑器软件!
\n");
printf("\n\n\n\n\n\n\n\n\npressEntertocontinue...\n");
getchar();
loop:
system("cls");
printf("\n\n\n\n\t\t******************简易文本编辑器*****************\n\n");
printf("\t\t\t\t----0.清空内容--\n");
printf("\t\t\t\t----1.打开文件--\n");
if(ntext==0){
printf("\t\t\t\t----2.输入内容--\n");
}
else{
printf("\t\t\t\t----2.继续输入--\n");
}
printf("\t\t\t\t----3.查找------\n");
printf("\t\t\t\t----4.插入------\n");
printf("\t\t\t\t----5.删除------\n");
printf("\t\t\t\t----6.替换------\n");
printf("\t\t\t\t----7.显示内容--\n");
printf("\t\t\t\t----8.保存------\n");
printf("\t\t\t\t----9.退出------\n");
printf("\n\t\t*********************选项************************\n");
printf("\n\t\t\t\t输入选项0-9:
");
charn;
fflush(stdin);
n=getchar();
if(n>='0'&&n<='9')
{
switch(n)
{
case'0':
cs(text);break;
case'1':
dakai(text);break;
case'2':
shuru(text);break;
case'3':
chazhao(text,0);break;
case'4':
charu(text,1);break;
case'5':
shanchu(text,0);break;
case'6':
tihan(text,0);break;
case'7':
dayin(text);break;
case'8':
bc(text);break;
case'9':
tuichu(status);
default:
break;
}
}
else
{
printf("\n输入有误,请重新输入:
");
fflush(stdin);
n=getchar();
}
system("pause");
gotoloop;
}
voidchazhao(chartext[],intl)
{
system("cls");
inti,t,a=-1;
charpattern[20],bd,pd;
printf("原文为:
\n");
dayin(text);
printf("请输入您要查找的内容");
scanf("%s",pattern);
printf("您查找的内容是:
%s\n",pattern);
t=strlen(pattern);
loop:
a=strindex(text,pattern,t,l);
if(a!
=-1)
{
l=a+t;
}
inths=1,ls=0;
for(i=0;i<=a;i++)
{
ls++;
if(text[i]=='\n')
{
hs++;ls=0;
}
}
if(a==-1)
{
printf("查找到结尾没有找到\n输入【R】将重头查找;任意键返回主菜单");
l=0;
fflush(stdin);
pd=getchar();
}
else
{
printf("已经找到在第%d行第%d列,输入【R】继续查找下一处;任意键返回主菜单",hs,ls);
fflush(stdin);
bd=getchar();
if(bd=='R'||bd=='r')
gotoloop;
}
if(pd=='R'||pd=='r')
{l=0;chazhao(text,l);}
}
voiddayin(chartext[])
{
system("cls");
printf("现在文本的内容为:
\n");
printf("%s\n",text);
inths=1,i;
for(i=0;i {
if(text[i]=='\n')
{
hs++;
}
}
printf("\n文本共有%d行\n",hs);
}
voidshuru(chartext[])
{
system("cls");
printf("请输入内容(输入@结束输入并返回主菜单):
\n");
printf("%s",text);
charc;
inti=ntext,j=ntext;
fflush(stdin);
while((c=getchar())!
='@')
{
text[i]=c;
i++;
ntext=i;
continue;
}
intcout=0,zf=0,h=1,hs=1,zfs=0;
for(;cout {
zf++;
if(text[cout]=='\n')
{h++;zf--;}
if(text[cout]=='')
zf--;
}
for(cout=j;cout {
zfs++;
if(text[cout]=='\n')
{hs++;zfs--;}
if(text[cout]=='')
zfs--;
}
printf("统计:
文本一共有%d个字符,%d行,本次输入了%d个字符,%d行\n",zf,h,zfs,hs);
}
voidshanchu(charp[],intl)
{
inti,a=-1,t2=0;
charx[20],px,pd,pdx,c;
system("cls");
printf("%s",p);
printf("\n输入【A】执行查找删除内容;任意键返回主菜单:
");
fflush(stdin);
px=getchar();
if(px=='a'||px=='A')
{
printf("\n输入您要删除的内容,以@结束:
");
fflush(stdin);
while((c=getchar())!
='@')
{
if(c=='@')
{
break;
}
else
{
x[t2]=c;
t2++;
continue;
}
}
loop:
a=strindex(p,x,t2,l);
inths=1,ls=0;
for(i=0;i<=a;i++)
{
ls++;
if(p[i]=='\n')
{
hs++;ls=0;
}
}
if(a==-1)
{
printf("已查找结束,您要删除的内容不存在\n输入【R】重新输入要删除的内容;其他键将返回主菜单:
");
l=0;
fflush(stdin);
pdx=getchar();
}
else
{
printf("你要删除的内容在第%d行第%d列\n输入【A】确定删除;输入【B】寻找下个词;其他键将返回主菜单:
",hs,ls);
fflush(stdin);
pd=getchar();
l=t2+a;
if(pd=='a'||pd=='A')
{
for(i=a;i {
p[i]=p[i+t2];
}
ntext=ntext-t2;
printf("删除成功,删除后的内容为:
\n%s\n",text);
}
elseif(pd=='b'||pd=='B')
gotoloop;
}
if(pdx=='r'||pdx=='R')
shanchu(text,l);
}
}
voidcharu(chartext[],intl)//向文本中插入内容
{
system("cls");
inti=0,t=0,t2=0,a=-1,b;
charcr[20]="",pd,x[500],c,d;
printf("\n当前文本信息为:
\n");
printf("%s",text);
printf("\n输入您要在哪个内容前插入,以@结束:
");
fflush(stdin);
while((c=getchar())!
='@')//用一个数组接收要插入在哪个内容之前
{
if(c=='@')
{
break;
}
else
{
cr[t]=c;
t++;