数据结构课程设计之文本编辑器.docx
《数据结构课程设计之文本编辑器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之文本编辑器.docx(28页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之文本编辑器
##大学
数据结构课程设计报告
题目:
简易文本编辑器
院(系):
计算机工程学院
学生姓名:
班级:
学号:
____
起迄日期:
2011年6月20日至2011年6月30日
指导教师:
指导教师评语:
成绩:
签名:
年月日
2010—2011年度第2学期
一、需求分析
1.问题描述:
简易文本编辑器主要是针对文字编辑处理,对于如何编辑一个简易文本编辑器程序我们可以利用线性表示实现其功能,线性表便于插入删除查找功能,而文本编辑器需要用到这些功能,因此可以利用线性表实现。
对于文本编辑器应该具有插入、删除、查找等功能,并且可以显示所有输入数据,可正确存盘、取盘,正确显示编辑的文字长度。
2.基本功能:
简易文本编辑器应该具有的功能:
图形菜单界面:
位置查找:
数据查找:
显示所有输入数据:
插入:
删除文本信息:
可正确存盘、取盘:
正确显示长度:
3.输入输出:
输入数据,数据类型为整形,且输入的字符或数字不多于100个,
输出为输出输入的数据,输出输入数据的长度,输出插入元素及插入后的数据,输出查找元素的,输出的数据均为整形。
二、概要设计
1.设计思路:
首先构造一个线性表,然后利用线性表的存储结构顺序存储方式,实现文本的编辑添加查找删除.
2.数据结构设计:
程序采取了线性结构利用顺序存储的方法,采用该结构的原因是线性表利于存储、插入、删除、查找、修改等功能,使用它可以使程序运行简单方便。
定义程序中用到的抽象数据类型;
抽象数据类型线性表的定义如下:
ADTSqList{
数据对象:
D={ai|ai∈data,i=1,2,3……,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=1,2,3,……,n}
基本操作:
InitList(*L)
操作结果:
构造一个空的线性表L。
GetLength(L)
初始条件:
线性表L已存在。
操作结果:
返回L中数据元素的个数。
GetElem(L,i,*e)
初始条件:
线性表L已存在,1≤i≤L.Length.
操作结果:
查找指定的某元素i,并将值赋给e,用e输出。
Locate(L,i,x)
初始条件:
线性表L已存在,1≤i≤L.Length.
操作结果:
用i返回元素x在线性表中的位置。
InsElem(*L,x,i)
初始条件:
线性表L已存在,1≤i≤L.Length。
操作结果:
在L中第i个位置之前插入新的数据元素j,L的长度加1。
DelElem(*L,i)
初始条件:
线性表L已存在,1≤i≤L.Length。
操作结果:
删除L的第i个数据元素,L的长度减1。
DispList(L)
初始操作:
线性表L已存在。
操作结果:
输出线性表中的所有元素。
save(*L)
初始条件:
线性表L已存在。
操作结果:
将线性表中的数据写入文件,文件保存。
read(*L)
初始条件:
线性表L已存在。
操作结果:
读出文件中的数据。
2主程序
Voidmain()
{
初始化;
do{
接受命令;
处理命令;
}while(“命令”!
=“退出”)
}
3.软件结构设计:
主程序模块:
intmain()
线性表模块:
voidInitList(SqList*L);
文本编辑模块:
intGetLength(SqListL);//长度
intGetElem(SqListL,inti,int*e);//位置查找
intLocate(SqListL,inti,intx);//数据查找
intInsElem(SqList*L,intx,inti);//插入位置i数据j
intDelElem(SqList*L,inti);//删除
voidDispList(SqListL);//显示
三、详细设计
1.定义程序中所有用到的数据及其数据结构,及其基本操作的实现;
#defineMaxSize100
classSqList
{
public:
intdata[MaxSize];
intlength;
public:
SqList();
voidInitList(SqList*L);//初始化
intGetLength(SqListL);//长度
intGetElem(SqListL,inti,int*e);//位置查找
intLocate(SqListL,inti,intx);//数据查找
intInsElem(SqList*L,intx,inti);//插入位置i数据j
intDelElem(SqList*L,inti);//删除
voidDispList(SqListL);//显示
voidsave(SqList*L);//文件保存
voidread(SqList*L);//文件读取
voidshowmenu();//菜单
};
2.主函数和其他函数的伪码算法;
intmain()//--------------------------------主函数
{
SqListL;
inti;
intj;
inte;
L.InitList(&L);//参数是指针时,实参应为地址--空表
printf("\n\n\n\n\t\t\tWelcomtouseourTXTeditionsystem!
\n");
printf("\n\n\t\t\t欢迎您使用文本编辑器软件!
\n");
printf("\n\n\n\n\n\n\npressEntertocontinue...\n");
L.read(&L);
intchr;
while((chr=getchar())!
='\n')
{
L.InsElem(&L,chr,L.length+1);//连续插入元素
}
printf("输入数据:
");
L.DispList(L);
system("pause");
while
(1){
system("cls");//清屏
L.showmenu();
intn;
cin>>n;
switch(n)
{
case0:
printf("<0>输入数据的长度为:
%d\n",L.GetLength(L));
system("pause");
break;
case1:
cout<<"输入插入的位置:
";
cin>>i;
if(i>L.length)
i=L.length+1;
cout<<"输入要插入的字符:
";
getchar();
fflush(stdin);//清除键盘缓冲区的内容
j=getchar();
fflush(stdin);
L.InsElem(&L,j,i);
printf("<1>在数据的第%d个位置插入元素%c:
\n",i,j);
printf("插入后的数据:
");
L.DispList(L);
system("pause");
break;
case2:
cout<<"查找的位置是:
";
cin>>i;
L.GetElem(L,i,&e);
printf("<2>在输入的数据中第%d个元素是:
%c\n",i,e);
system("pause");
break;
case3:
cout<<"查找的元素是:
";
cin>>e;
printf("<3>查找的元素%d是:
第%d个元素\n",e,L.Locate(L,i,e));
system("pause");
break;
case4:
cout<<"删除的位置是:
";
cin>>i;
printf("<4>在数据中删除第%d个元素\n",i);
L.DelElem(&L,i);
printf("删除后的数据:
");
L.DispList(L);
system("pause");
break;
case5:
cout<<"<5>谢谢使用"<exit(0);
break;
default:
break;
}
L.save(&L);
}
return0;
}
SqList:
:
SqList()//------构造函数
{
data[0]=0;
length=0;
}
voidSqList:
:
InitList(SqList*L)
{
//传入的参数用指针----------------------构造空表
L->length=0;
return;
}
intSqList:
:
GetLength(SqListL)//-------------求表的长度
{
returnL.length;
}
intSqList:
:
GetElem(SqListL,inti,int*e)//----求表中某个数据元素
{
if(i<1||i>L.length)
{/*无效的i值*/
return0;
}
else
{
*e=L.data[i-1];
//改变指针的值前面用*
return1;
}
return1;
}
intSqList:
:
Locate(SqListL,inti,intx)//-------------按值查找
{
for(i=0;i{if(L.data[i]==x)
returni;}
}
intSqList:
:
InsElem(SqList*L,intx,inti)//---------------插入
{
intj;
if(i<1||i>L->length+1)
{
/*无效的参数i*/
return0;
}
for(j=L->length;j>=i;j--)
{
/*将位置为i的结点及之后的结点后移*/
L->data[j]=L->data[j-1];
}
L->data[i-1]=x;/*在位置i处放入x*/
L->length++;/*线性表长度增1*/
return1;
}
intSqList:
:
DelElem(SqList*L,inti)//---------------------删除
{
intj;
if(i<1||i>L->length)
{
//删除时,i大于线性表的长度
return0;
}
for(j=i;jlength;j++)
{
L->data[j-1]=L->data[j];
}
L->length--;
return1;
}
voidSqList:
:
DispList(SqListL)//---------------------------显示
{
inti;
for(i=1;i<=L.length;i++)
{
printf("%c",L.data[i-1]);
}
printf("\n");
return;
}
voidSqList:
:
save(SqList*L)
{
inti;
FILE*file;
file=fopen("C:
\\data.txt","wb");
if(!
file)
{
printf("打开文件出错!
!
");
return;
}
else
fseek(file,0,0);
for(i=1;ilength;i++){
fwrite((L->data)+(i-1),sizeof(int),1,file);
}
fclose(file);
}
voidSqList:
:
read(SqList*L)
{
inti;
inttem;
FILE*file;
i=L->length;
file=fopen("C:
\\data.txt","rb");
if(!
file)
{
printf("打开失败");
return;
}
else
{
fseek(file,0,0);
}
while(!
feof(file))
{
fread(&tem,sizeof(int),1,file);
InsElem(L,tem,L->length+1);
}
L->DelElem(L,L->length);
fclose(file);
return;
}
voidSqList:
:
showmenu()
{
cout<<"\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★"<<<"\t\t※※"<<<"\t\t※简易文本编辑器※"<<<"\t\t※※"<<<"\t\t※0.数据长度.※"<<<"\t\t※1.插入数据.※"<<<"\t\t※2.查找位置.※"<<<"\t\t※3.查找元素.※"<<<"\t\t※4.删除元素.※"<<<"\t\t※5.退出.※"<<<"\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★"<<<"\t\t\t选择:
";
fflush(stdin);//清除键盘缓冲区的内容
return;
}
3.主要函数的程序流程图,实现设计中主程序和其他子模块的算法,以流程图的形式表示。
1.查找位置函数.
Y
N
2.查找元素函数.
N
Y
N
Y
3.插入元素函数.
N
Y
N
Y
4.删除元素函数.
N
Y
N
Y
4.画出函数之间的调用关系图。
四、调试分析
1.实际完成的情况说明(完成的功能,支持的数据类型等);
(1)本程序可以对一段文字进行插入、删除、查找、显示保存文件等操作。
(2)程序支持整形,输入的数据均为整形,且输入数据不超过100组数据。
2.程序的性能分析,包括时空分析;
程序的时间和空间复杂度在线性表算法上,由于线性表的存储结构是顺序存储,所以时间复杂度为O(L.Length),n线性表长度,空间复杂度为O(n)。
3.上机过程中出现的问题及其解决方案;
(1)开始文本编辑器的存储结构选的是串,利用模式匹配进行查找,后来因为模式匹配掌握的不够好,写出的算法错误太多,且不能实现太多的功能,故而后来选择利用掌握较熟练的线性表实现文本编辑器的功能。
(2)程序没有编译错误,但是不出结果,利用步步调试,改正逻辑错误,有些函数的参数须加引用。
4.程序中可以改进的地方说明;
(1)该程序可以利用链表或串,存取数据实现文本编辑器的各项功能,可以使程序功能更完善。
5.程序中可以扩充的功能及设计实现假想。
(1)可以实现替换功能。
在线性表的所有数据中,选择某一位置的数据,替换为想要的数据,可以先利用查找功能,查找选取的位置,然后删除该位置的数据,最后在该位置插入替换后的数据。
五、测试结果
合法数据:
输入要连续插入的数据:
xingmingbanjizhuanyenianjixuehao。
执行0操作,输入0,输出为32。
执行1操作,输入1,输入插入位置为12,插入数据为1,输出为xingmingban1jizhuanyenianjixuehao。
执行2操作,输入2,输入要查找的位置为4,输出为g。
执行3操作,输入3,输入要查找的元素为g,输出为第4个位置。
执行4操作,输入4,输入要删除的位置为4,输出为xinmingban1jizhuanyenianjixuehao。
执行5操作,输入5,输出“谢谢使用”。
非法数据:
没有保存文件时,输出为“打开文件失败!
”。
六、用户手册
1.本程序的运行环境为DOS操作系统。
2.进入演示程序后首先要在D盘里建一个文件,文件名为“data.txt”,并在其中添加要操作的数据(也可以不添加数据,仅建一个文件),来存储数据使用。
3.提示输入线性表要在原文件基础上要添加的数据。
4.以整形的形式输入线性表数据的值。
5.之后显示线性表的所有元素。
6.之后提示输入要操作的功能选项(0~5)。
7.之后提示执行所选功能所需输入的数据。
8.执行完所有功能后选择5退出并保存数据。
(1)开始窗口。
(2)输出线性表的长度。
(3)插入数据。
(4)查找某一位置的数据
(5)查找某一元素的位置。
(6)删除某一数据。
(7)退出文本编辑器
七、体会与自我评价
本程序是在线性表的基础上改进的,线性表的操作数是浮点形,而文本编辑器的操作数是整形,在线性表的程序上加进插入删除查找数据结构,然后建立一个文件保存线性表中的数据,就是我写的程序。
本次课程设计还算顺利,但是在设计过程中由于自己的不细心,忽略了一些关键的细节,导致了在编写过程中出现了一些错误。
例如:
少了分号,或忘了定义函数,又如能运行但输出结果错误,结果不正确。
又由于自己打字时犯得小错误,导致出现不易发现的错误,最终在老师及编程能力比较强的同学帮助下,查找到并及时改正。
该程序不仅可以利用线性表还可以利用串、单链表司实现,通过做该程序,我又对课本做了新的解读,加深了对所学知识的印象及了解,同时也了解了我还有许多不足,对许多所学过的知识掌握得不够透彻,不够深入,应用不够灵活,今后我会弥补这方面的不足,加深理解课本知识,同时注重应用。
通过本次课程设计,我对课本知识又了解了新的内容,对该掌握的的知识加深了了解。
通过对线性表的应用,查找课本资料加深了对线性表的了解,并学会了灵活运用。
通过调试,我学会了借助逐步调试功能和数据窗口,加快找到程序中的错误点,调试能力有所提高。
本程序中运用了大量的循环结构和条件结构,在编写程序时要注意条件的判断和循环条件的正确编写。
通过本次课程设计,不仅锻炼了我的实际操作能力,而且培养了严密的思维能力和严谨的态度。
本次课程设计的确令我受益匪浅,而且增加了编程的兴趣。
源代码:
#include
#include
#include
#include
#include
#include
usingnamespacestd;
#defineMaxSize100
classSqList
{
public:
intdata[MaxSize];
intlength;
public:
SqList();
voidInitList(SqList*L);//初始化
intGetLength(SqListL);//长度
intGetElem(SqListL,inti,int*e);//位置查找
intLocate(SqListL,inti,intx);//数据查找
intInsElem(SqList*L,intx,inti);//插入位置i数据j
intDelElem(SqList*L,inti);//删除
voidDispList(SqListL);//显示
voidsave(SqList*L);//文件保存
voidread(SqList*L);//文件读取
voidshowmenu();//菜单
};
SqList:
:
SqList()
{
data[0]=0;
length=0;
}
voidSqList:
:
InitList(SqList*L)
{
//传入的参数用指针----构造空表
L->length=0;
return;
}
intSqList:
:
GetLength(SqListL)//求表的长度
{
returnL.length;
}
intSqList:
:
GetElem(SqListL,inti,int*e)//求表中某个数据元素
{
if(i<1||i>L.length)
{/*无效的i值*/
return0;
}
else
{
*e=L.data[i-1];
//改变指针的值前面用*
return1;
}
return1;
}
intSqList:
:
Locate(SqListL,inti,intx)/*按值查找*/
{
for(i=0;i{if(L.data[i]==x)
returni;}
}
intSqList:
:
InsElem(SqList*L,intx,inti)//插入
{
intj;
if(i<1||i>L->length+1)
{
/*无效的参数i*/
return0;
}
for(j=L->length;j>=i;j--)
{
/*将位置为i的结点及之后的结点后移*/
L->data[j]=L->data[j-1];
}
L->data[i-1]=x;/*在位置i处放入x*/
L->length++;/*线性表长度增1*/
return1;
}
intSqList:
:
DelElem(SqList*L,inti)//删除
{
intj;
if(i<1||i>L->length)
{
//删除时,i大于线性表的长度
return0;
}
for(j=i;jlength;j++)
{
L->data[j-1]=L->data[j];
}
L->length--;
return1;
}
voidSqList:
:
DispList(SqListL)//显示
{
inti;
for(i=1;i<=L.length;i++)
{
printf("%c",L.data[i-1]);
}
printf("