数据结构课程设计建文本编辑器.docx
《数据结构课程设计建文本编辑器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计建文本编辑器.docx(30页珍藏版)》请在冰豆网上搜索。
数据结构课程设计建文本编辑器
重庆交通大学信息科学与工程学院
数据结构课程设计报告书
专业:
计算机科学与技术
课程设计名称:
《数据结构课程设计》
题目:
简易文本编辑器
班级:
姓名:
学号:
指导教师:
完成时间:
2013年6月27日
目录
一.设计的目的和要求……………………………………………………………3
课程设计的目的………………………………………………………………3
基本要求………………………………………………………………………3
二.课程设计任务要求……………………………………………………………3
需求分析………………………………………………………………………3
三.具体设计………………………………………………………………………3
主程序流程图…………………………………………………………………4
详细设计功能分析……………………………………………………………4
函数分析源程序代码………………………………………………………6
四.调试分析和测试结果………………………………………………………20
代码测试截图结果分析……………………………………………………20
五.总结心得与体会……………………………………………………………25
一.课程设计目的和要求
●设计目的
数据结构课程设计是一门实践性非常强的课程,不但结合了C语言的设计基本知识,更加注重技能的培养,是学生能够允许渐进的把握C语言C++的程序设计的技能。
通过此课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高,同时提以下几个方面的能力。
1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
二.课程设计任务要求
●需求分析
1.具有图形菜单界面;
2.查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除
3.可正确存盘、取盘;
4.正确显示总行数。
三.具体设计
●主程序流程图如(图1)所示
●程序中用链表来保存文本,每一行为一个单向链表,每一行的表头保存在一个行链表中,形成了一个2维链表,结构如下(图2)所示:
●详细设计功能实现
(一)打开文件
1.提示用户输入文件路径
2.判断文件路径是否有效,若无效,则提示错误信息并返回,否则继续执行。
3.若文件成功打开并且文件指针没有到文件尾,则从文件中一次读取一个字符,并将该字符添加到一列单链表节点中,直至遇到换行符(ASCII码10)。
当列单链表形成后,它的首地址将被保存至行单链表的相应节点的数据域中,如此动作,直至文件指针指向文件尾部而结束。
(二)新建文件
1.若行链表中有数据存在,则提示用户保存文件。
2.提示用户输入新建文件的保存路径。
3.测试新文件路径是否有效。
(三)保存文件
1.打开文件。
2.遍历行单链表,遍历行单链表节点指向的列单链表,并将数据输出到文件,每个列单链表遍历完后,输出换行符到文件。
3.关闭文件
(图1)
(四)插入字符串
1.提示用户输入要插入字符串的位置(行号row,列号col)以及要插入的字符串。
2.先在行单链表中找到该行(第row行),若超出现有行数,则添加空行补齐;
3.将字符串插入该行(第row行)节点指向的列链表中的col-1位置,若超出现有节点数,则添加保存字符为空格的节点补齐。
(五)删除字符串
(1)提示用户输入要删除字符串的开始位置(行号row,列号col)以及要插入的字符串的长度len。
(2)在链表中定位到该行节点,若不存在,则提示无法删除并返回;否则继续执行。
(3)在该行中定位到该col字符节点node,若不存在,则提示无法删除并返回;否则继续执行。
(4)删除从node字符节点开始的len个节点。
若不满len个,则全部删除。
(六)查找替换
1.提示用户输入要查找的字符串。
2.遍历链表,找到每一个出现此字符串的位置并输出。
3.询问用户是否要进行替换。
若选是,则提示用户输入要替换后的字符串,然后先在链表中删除原字符串,再在该位置插入要替换为的字符串。
(七)行移动
1.提示用户输入要移动的行row和移动后的位置pos。
2.将行链表中的row-1节点移动到pos-1位置。
(八)列移动
1.提示用户输入要移动的列col和移动后的位置pos。
2.遍历每一行(列链表),将每一行的col-1节点移动到pos位置处;若col-1节点不存在则不处理。
(九)显示文本
(1)遍历行、列链表,并将数据输出到控制台;
(图2)
●函数分析源程序代码
#include
#include
#include
usingnamespacestd;
//#include"Struct.h"
//1、具有图形菜单界面;
//2、查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除
//3、可正确存盘、取盘;
//4、正确显示总行数。
//字符节点
structNode
{
charch;
Node*next;
};
//行节点
structRow
{
Node*line;
Row*next;
};
//创建一个Node对象
Node*createNode(charch)
{
Node*p=newNode;
p->ch=ch;
p->next=NULL;
returnp;
}
//创建一个Row对象
Row*createRow(Node*line)
{
Row*p=newRow;
p->line=line;
p->next=NULL;
returnp;
}
//定位到index处
Node*locate(Node*line,intindex)
{
Node*p=line;
inti=-1;
while(p!
=NULL&&i{
p=p->next;
i++;
}
returnp;
}
Row*locate(Row*list,intindex)
{
Row*p=list;
inti=-1;
while(p!
=NULL&&i{
p=p->next;
i++;
}
returnp;
}
//插入节点
boolinsert(Node*list,intindex,charc)
{
Node*p=locate(list,index-1);
if(p)
{
Node*node=createNode(c);
node->next=p->next;
p->next=node;
returntrue;
}
returnfalse;
}
boolinsert(Row*list,intindex,Node*line)
{
Row*p=locate(list,index-1);
if(p)
{
Row*row=createRow(line);
row->next=p->next;
p->next=row;
returntrue;
}
returnfalse;
}
//删除节点
boolremove(Node*list,intindex)
{
Node*p=locate(list,index-1);
Node*q=NULL;
if(p&&p->next)
{
q=p->next;
p->next=q->next;
deleteq;
returntrue;
}
returnfalse;
}
//清空链表
voidclear(Node*line)
{
Node*p=line->next;
Node*q;
while(p)
{
q=p->next;
deletep;
p=q;
}
}
boolremove(Row*list,intindex)
{
Row*p=locate(list,index-1);
Row*q=NULL;
if(p&&p->next)
{
q=p->next;
p->next=q->next;
clear(q->line);//清空字符链表
deleteq->line;//删除字符链表表头
deleteq;
returntrue;
}
returnfalse;
}
voidclear(Row*text)
{
Row*p=text->next;
Row*q;
while(p)
{
q=p->next;
clear(p->line);
deletep->line;//删除字符链表表头
deletep;
p=q;
}
}
voidLine(inti)
{
if(i==1)
{
cout<<"-----------------------------------------------------------------------"<}
elseif(i==2)
{
cout<<"======================================================================="<}
}
intYesOrNo()
{
charc;
cin>>c;
if(c=='Y'||c=='y')
{
return1;
}
elseif(c=='N'||c=='n')
{
return0;
}
return-1;
}
//主菜单
voidMenu()
{
cout<<"**********************************************************************"<cout<<"*简易文本编辑器*"<cout<<"**********************************************************************"<cout<<"\t1.打开文件"<cout<<"\t2.新建文件"<cout<<"\t3.保存文件"<cout<<"\t4.插入字符串"<cout<<"\t5.删除字符串"<cout<<"\t6.查找替换"<cout<<"\t7.行移动"<cout<<"\t8.列移动"<cout<<"\t9.显示文本"<cout<<"\t0.退出"<Line
(1);
}
//输出当前文本
voidPrintText(Row*text)
{
cout<Line
(2);
cout<<"当前文本为:
"<Line
(1);
Row*p=text->next;
Node*q;
inti=0;
while(p!
=NULL)
{
i++;
cout<<"行"<
q=p->line->next;
while(q!
=NULL)
{
cout<ch;
q=q->next;
}
cout<p=p->next;
}
Line
(1);
cout<<"总共"<
Line
(2);
}
//打开文件
boolOpenFile(char*fileName,Row*text)
{
ifstreamfile(fileName,ios:
:
in);
if(!
file)
{
cout<<"文件读取失败!
"<returnfalse;
}
charc;
Row*rp;
rp=text;
while(!
file.eof())
{
Node*line=newNode;
line->next=NULL;
Node*p=line;
file.get(c);
while(c!
=10&&!
file.eof())
{
Node*q=createNode(c);
q->next=NULL;
p->next=q;
p=p->next;
file.get(c);
}
/*if(c==10)
{
row.add('\n');
}*/
if(!
file.eof())
{
Row*rq=createRow(line);
rp->next=rq;
rp=rp->next;
}
}
file.close();
cout<<"文件读取完成!
"<returntrue;
}
//创建文件
boolCreateFile(constchar*fileName,Row*text)
{
ofstreamfile(fileName);
if(!
file)
{
cout<<"文件创建失败!
"<returnfalse;
}
file.close();
cout<<"文件创建成功!
"<returntrue;
}
//保存
boolSaveFile(constchar*fileName,Row*text)
{
ofstreamfile(fileName);
if(!
file)
{
cout<<"文件保存失败!
"<returnfalse;
}
Row*p=text->next;
Node*q=NULL;
while(p!
=NULL)
{
q=p->line->next;
while(q!
=NULL)
{
//if(q->data=='\n')
file<ch;
q=q->next;
}
file<p=p->next;
}
file.close();
cout<<"文件保存成功!
"<returntrue;
}
//插入字符串
voidInsertStr(Row*text,introw,intcol)
{
inti=-1,j=-1;
Row*rp,*rq;
Node*np,*nq;
rp=text;
while(rp->next&&i{
rp=rp->next;
i++;
}
while(i{
nq=createNode('');//定义一个新行链表
rq=createRow(nq);
rp->next=rq;
rp=rp->next;
i++;
}
np=rp->line;
while(np->next&&j{
np=np->next;
j++;
}
while(j{
nq=createNode('');
np->next=nq;
np=np->next;
j++;
}
cin.get();
strings;
getline(cin,s);
for(intk=0;k{
nq=createNode(s[k]);
nq->next=np->next;
np->next=nq;
np=np->next;
}
}
//行移动
boolMoveRow(Row*text,introw,intpoz)
{
if(row==poz)
{
returntrue;
}
Row*p=locate(text,row-1);
Row*t=locate(text,poz-1);
Row*q;
if(p&&p->next&&t)
{
q=p->next;
p->next=q->next;
q->next=t->next;
t->next=q;
returntrue;
}
returnfalse;
}
//列移动
voidMoveCol(Row*text,intcol,intpoz)
{
if(col==poz)
return;
Row*rp=text->next;
while(rp)
{
Node*np=locate(rp->line,col-1);
Node*nt=locate(rp->line,poz-1);
Node*nq;
if(np&&np->next&&nt)
{
nq=np->next;
np->next=nq->next;
nq->next=nt->next;
nt->next=nq;
}
rp=rp->next;
}
}
//查找替换
voidFindStr(Row*text)
{
stringstr,rep;
intpos,k=0,row=1,col=0;
cout<<"请输入你要查找的字符串:
"<cin>>str;
Row*p=text->next;
while(p)
{
stringline;
Node*nq=p->line->next;
while(nq)
{
line.append(1,nq->ch);
nq=nq->next;
}
pos=line.find(str.c_str(),0);
while(pos!
=string:
:
npos)
{
col=pos;
k++;
cout<第"<cout<<"是否替换?
(Y/N)";
intyon=YesOrNo();
while(yon==-1)
{
cout<<"是否替换?
(Y/N)";
yon=YesOrNo();
}
if(yon==1)
{
cout<<"将"<";
cin>>rep;
intj;
for(j=0;j{
remove(p->line,col);
}
for(j=0;j{
insert(p->line,col+j,rep[j]);
}
cout<<"替换成功!
"<}
pos=line.find(str.c_str(),col+str.length());
}
row++;
p=p->next;
}
if(k==0)
{
cout<<"当前文本中找不到该字符串!
"<}
}
voidDelStr(Row*text,introw,intcol,intlen)
{
Row*rp=locate(text,row);
if(rp==NULL)
{
cout<<"无法删除,因为该位置没有字符串!
"<return;
}
Node*np=locate(rp->line,col-1);
if(np==NULL)
{
cout<<"无法删除,因为该位置没有字符串!
"<return;
}
Node*nq=np->next;
strings;
intk=0;
while(nq&&k{
s.append(1,nq->ch);
np->next=nq->next;
deletenq;
nq=np->next;
k++;
}
cout<<"成功删除字符串"<
}
intmain()
{
boolflag=false;
intsel,row,col,poz;
Row*text=newRow;
text->next=NULL;
stringfileName;
Menu();
cout<<"请选择操作:
";
cin>>sel;
while(sel!
=0)
{
switch(sel)
{
case1:
//打开文件
cout<<"请输入要打开的文件路径(例如E:
\\1.txt):
";
cin>>fileName;
flag=OpenFile((char*)fileName.c_str(),text);
if(flag)
{
PrintText(text);
}
break;
case2:
//新建文件
if(flag)
{
cout<<"要保存前一个文件吗?
(Y/N)";
intyon=YesOrNo();
while(yon==-1)
{
cout<<"要保存前一个文件吗?
(Y/N)";
yon=YesOrNo();
}
if(yon==1)
{
SaveFile((char*)fileName.c_str(),text);
}
flag=false;
}
clear(text);
cout<<"请输入要新建的文件路径(例如E:
\\1.txt):
";
cin>>file
|
|
|