数据结构课程设计建文本编辑器.docx

上传人:b****5 文档编号:11553068 上传时间:2023-03-19 格式:DOCX 页数:30 大小:445.48KB
下载 相关 举报
数据结构课程设计建文本编辑器.docx_第1页
第1页 / 共30页
数据结构课程设计建文本编辑器.docx_第2页
第2页 / 共30页
数据结构课程设计建文本编辑器.docx_第3页
第3页 / 共30页
数据结构课程设计建文本编辑器.docx_第4页
第4页 / 共30页
数据结构课程设计建文本编辑器.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

数据结构课程设计建文本编辑器.docx

《数据结构课程设计建文本编辑器.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计建文本编辑器.docx(30页珍藏版)》请在冰豆网上搜索。

数据结构课程设计建文本编辑器.docx

数据结构课程设计建文本编辑器

重庆交通大学信息科学与工程学院

数据结构课程设计报告书

专业:

计算机科学与技术

课程设计名称:

《数据结构课程设计》

题目:

简易文本编辑器

班级:

姓名:

学号:

指导教师:

完成时间:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1