简易文本编辑器--数据结构课设

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要
当下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 <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define MAX 10000
#define _CRT_SECURE_NO_DEPRECA TE //在vs中取消warning的警告void menu();
void shuru(char text[]);
void bc(char text[]);
void dakai(char text[]);
void dayin(char text[]);
void chazhao(char text[],int l);
void tihan(char text[],int l);
int strindex(char text[],char t[],int i2,int l);
void shanchu(char p[],int l);
void cs(char text[]);
void charu(char text[],int l);
void tuichu(int status);
char text[MAX]=""; //文本编辑域
char name[20]=""; //文件保存的位置
int status=0; //显示是否保存过的状态
int ntext; //文本编辑的位置
void dakai(char text[])
{
system("cls");
FILE *fp;
char pd,ch;
char name[30];
int i=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();
}
void bc(char text[])
{
system("cls");
FILE *fp;
char pd;
char tmp;
int i;
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<ntext;i++)
fprintf(fp,"%c",text[i]);
fclose(fp);
status=1;
printf("\n文件保存成功\n");
break;
}
if (tmp=='B' || tmp=='b')
{
break;
}
}
}
}
void cs(char text[])
{
int i;
for (i=0;i<ntext;i++)
{
text[i]='\0';
}
ntext=0;
status=0;
}
int strindex(char text[],char t[],int i2,int l) //查找要操作的数据的位置(模式匹配) {
int i1=l,j=0;
while (i1<ntext&&j<i2)
{
if (text[i1]==t[j]) //继续匹配下一个字符
{
j++;
i1++;
//主串和子串依次匹配下一个字符
}
else //主串、子串指针回溯重新开始下一次匹配
{
i1=i1-j+1; //主串从下一个位置开始匹配
j=0;
//子串从头开始匹配
}
}
if (j>=i2)
{
return(i1-i2);
} //返回匹配的第一个字符的下标
else
return(-1); //模式匹配不成功
}
void menu()
{
system("cls");
time_t timep;
time (&timep);
printf("%s",ctime(&timep));
printf("信息与计算科学1209010314 范亚飞\n");
printf("\n\n\n\n\n\n\n\n\n\t\t\tWelcom to use our TXT edition system!\n");
printf("\n\n\t\t\t 欢迎您使用文本编辑器软件!\n");
printf("\n\n\n\n\n\n\n\n\npress Enter to continue...\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:");
char n;
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");
goto loop;
}
void chazhao(char text[],int l)
{
system("cls");
int i,t,a=-1;
char pattern[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;
}
int hs=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')
goto loop;
}
if (pd=='R'||pd=='r')
{l=0;chazhao(text,l);}
}
void dayin(char text[])
{
system("cls");
printf("现在文本的内容为:\n");
printf("%s\n",text);
int hs=1,i;
for (i=0;i<ntext;i++)
{
if (text[i]=='\n')
{
hs++;
}
}
printf("\n文本共有%d行\n",hs);
}
void shuru(char text[])
{
system("cls");
printf("请输入内容(输入@结束输入并返回主菜单):\n");
printf("%s",text);
char c;
int i=ntext,j=ntext;
fflush(stdin);
while ((c=getchar())!='@')
{
text[i]=c;
i++;
ntext=i;
continue;
}
int cout=0,zf=0,h=1,hs=1,zfs=0;
for(;cout<ntext;cout++)
{
zf++;
if(text[cout]=='\n')
{h++;zf--;}
if(text[cout]==' ')
zf--;
}
for(cout=j;cout<ntext;cout++)
{
zfs++;
if(text[cout]=='\n')
{hs++;zfs--;}
if(text[cout]==' ')
zfs--;
}
printf("统计:文本一共有%d个字符,%d行,本次输入了%d个字符,%d行\n",zf,h,zfs,hs);
}
void shanchu(char p[],int l)
{
int i,a=-1,t2=0;
char x[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);
int hs=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<ntext;i++)
{
p[i]=p[i+t2];
}
ntext=ntext-t2;
printf("删除成功,删除后的内容为:\n%s\n",text);
}
else if (pd=='b'||pd=='B')
goto loop;
}
if(pdx=='r'||pdx=='R')
shanchu(text,l);
}
}
void charu(char text[],int l) //向文本中插入内容
{
system("cls");
int i=0,t=0,t2=0,a=-1,b;
char cr[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++;
continue;
}
}
loop:
a=strindex(text,cr,t,l); //查找并返回要插入的位置点
int hs=1,ls=0;
for (b=0;b<a;b++)
{
ls++;
if (text[b]=='\n')
{
hs++;
ls=0;
}
}
if (a==-1)
{
printf("\n查找到结尾没有找到插入点,输入【R】查找其他;按其他键返回菜单:\n");
l=0;
fflush(stdin);
d=getchar();
fflush(stdin);
}
else
{
printf("\n您要插入的位置是第%d行,第%d列之前\n【A】.不是此位置向后继续找插入点\n【B】.在此位置插入\n按其他键返回菜单\n请选择:",hs,ls+1);
fflush(stdin);
pd=getchar();
if (pd=='a'||pd=='A')
{
l=a+t;
goto loop;
}
else if (pd=='b'||pd=='B')
{
printf("\n\n输入您要插入的内容,以@结束:");
fflush(stdin);
while ((c=getchar())!='@')
{
if (c=='@')
{
break;
}
else
{
x[t2]=c;
t2++;
continue;
}
}
for (i=ntext;i>=a;i--)
{
text[i+t2]=text[i];
}
for (i=0;i<t2;i++)
{
text[i+a]=x[i];
}
ntext=ntext+t2;
printf("\n当前文本信息为:\n");
for (i=0;i<=ntext-1;i++)
printf("%c",text[i]);
printf("\n文本插入成功\n");
fflush(stdin);
getchar();
}
}
if (d=='r'||d=='R')
{
l=0;
charu(text,l);
}
status=0;
}
void tihan(char p[],int l) //内容替换
{
int t=0,t1=0,i,a,b;
char c,th[20],d,d1,bth[20];
int i2;
system("cls");
printf("\n当前文本信息为:\n");
for (i2=0;i2<=ntext-1;i2++)
printf("%c",p[i2]);
printf("\n输入要被替换的内容,以@结束:");
fflush(stdin);
while ((c=getchar())!='@') //t指替换前内容的长度{
if (c=='@')
{
break;
else
{
bth[t]=c;
t++;
continue;
}
}
loop:
a=strindex(p,bth,t,l); //查找要被替换的内容的位置
int hs=1,ls=0;
for (b=0;b<a;b++)
{
ls++;
if (p[b]=='\n')
{
hs++;
ls=0;
}
}
if (a==-1)
{
printf("\n查找到结尾没有找到要被替换的内容\n输入【R】查找其他内容,按其他键返回主菜单键\n");
l=0;
d=getchar();
fflush(stdin);
}
else
{
printf("\n\n已经找到要查找的数据在第%d行第%d列\n输入【A】继续向后查找相同内容\n输入其他键将进行替换操作\n请选择:",hs,ls+1);
fflush(stdin);
l=t+a;
char pd;
pd=getchar();
if (pd!='a'&&pd!='A')
{
printf("\n是否要替换该内容?\nA:替换给内容;其他键返回主菜单\n请选择:");
fflush(stdin);
d1=getchar();
if (d1=='a'||d1=='A')
printf("\n输入要替换的内容,以@结束:");
fflush(stdin);
while ((c=getchar())!='@') //t1指替换后的内容长度
{
if (c=='@')
{
break;
}
else
{
th[t1]=c;
t1++;
continue;
}
}
if (t==t1) //将要被替换的内容和替换后的内容进行长度比较
{
for (i=0;i<t1;i++)
p[i+a]=th[i];
}
else
{
if (t>t1)
{
for (i=0;i<t1;i++)
{
p[i+a]=th[i];
}
for (i=a+t1;i<ntext;i++)
{
p[i]=p[i+t-t1];
}
ntext=ntext+t1-t;
}
else
{
for (i=ntext;i>=a;i--)
{
p[i+t1-t]=p[i];
}
for (i=0;i<t1;i++)
{
p[i+a]=th[i];
}
ntext=ntext+t1-t;
}
}
printf("替换成功");
printf("\n当前文本信息为:\n");
for (i2=0;i2<=ntext-1;i2++)
printf("%c",p[i2]);
getchar();
status=0;
}
}
else
goto loop;
}
if(d=='r'||d=='R')
tihan(text,l);
}
void tuichu(int status)
{
char pd;
if(status)
exit(0);
else
printf("还未保存文件,确定退出?(Q.直接退出;Y.保存后退出");
fflush(stdin);
pd=getchar();
if(!(pd=='Q'||pd=='q'))
bc(text);
exit(0);
}
int main()
{
menu();
return (0);
}。

相关文档
最新文档