数据结构实验4.docx

上传人:b****3 文档编号:3857298 上传时间:2022-11-25 格式:DOCX 页数:14 大小:47.25KB
下载 相关 举报
数据结构实验4.docx_第1页
第1页 / 共14页
数据结构实验4.docx_第2页
第2页 / 共14页
数据结构实验4.docx_第3页
第3页 / 共14页
数据结构实验4.docx_第4页
第4页 / 共14页
数据结构实验4.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构实验4.docx

《数据结构实验4.docx》由会员分享,可在线阅读,更多相关《数据结构实验4.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构实验4.docx

数据结构实验4

计算机系数据结构实验报告(4)

姓名:

学号:

专业班级:

实验目的:

掌握串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法。

问题描述:

全屏幕文本编辑器通过终端对文本文件进行创建、插入、删除、修改、存储等操作。

用户可完成对文本的插入、删除、修改等功能。

实验要求:

1、对光标实现如下操作:

上、下、左、右移动一个字符位置;向前、后翻页;光标移至文件首、尾;光标移至本行首、尾。

2、实现基本编辑命令:

I----在当前光标前插入内容,按ESC结束

F----在当前光标后插入内容,按ESC结束

D----删除光标所在行

ND---删除光标位置开始的n行

N-----删除光标上的字符

W----将修改后的文本保存下来

Q----退出编辑状态。

算法分析:

(一)串基本操作算法:

(1)字符串初始化

StatusStrAssign(HString&S,char*T)//生成一个其值为串常量*T的串S

{

intlen=strlen(T);

if(S.chars!

=NULL)

deleteS.chars;

S.chars=newchar[len];

if(S.chars==NULL)

returnWRONG;

for(i=0;i

S.chars[i]=T[i];

S.len=len;

returnOK;

}

(2)取子串位置

intIndex(HStringS,HStringT,intpos)

{//取串T中和主串S中相同字串在第pos位置为第一次出现的位置

next=newint[T.len];

GetNext(T,next);

while(i

if(j==-1||S.chars[i]==T.chars[j])

{

i++;

j++;

}

else

j=next[j];

if(j>=T.len)

returni-T.len+1;

else

return0;

}

(3)打印字符串

voidStrPrint(HStringS)//输出串S

{

for(i=0;i

cout<

cout<

:

endl;

}

(二)文本操作函数

(1)打开文本文件

voidOpen()//打开文本文件

{

if(filename[0]!

='\0')//判断当前文件是否处于打开状态

cout<<"文件已经打开!

"<

else

{

cout<<"输入文件名";

cin>>filename;

fstreamFile(filename);

if(!

File)//文件名不存在,创建新文件

cout<<"新文件"<

else

{

while(!

File.eof())//判断文件是否为空,若否,读入行数据给str

{

File.getline(str,LINE_WORD);

if(n>=MAX_LINE)//判断文件是否超出最大行数

{

returnerror;

return;

}

StrAssign(T[n],str);

n++;

}

File.close();

}

}

}

(2)保存文本文件

voidSave()//保存文本

{

ofstreamFile(filename);

if(!

File)

returnerror;

for(i=0;i

{

File.write(T[i].chars,T[i].len);

if(i!

=n-1)

File<

}

File.close();

returnOK;

}

实验内容和过程:

测试数据:

Hello,xinconan!

Welcome!

It'satestfile.

//HString.h

#include

enum{OK=0,WRONG=-1};//定义一个枚举类型

typedefintStatus;

structHString//定义字符串结构体

{

char*chars;//字符串指针

intlen;//串长度

};

voidStrInit(HString&S)//字符串初始化

{

S.chars=NULL;

S.len=0;

}

StatusStrAssign(HString&S,char*T)//生成一个其值为串常量*T的串S

{

inti;

intlen=strlen(T);

if(S.chars!

=NULL)

deleteS.chars;

S.chars=newchar[len];

if(S.chars==NULL)

returnWRONG;

for(i=0;i

S.chars[i]=T[i];

S.len=len;

returnOK;

}

intStrLen(HStringS)

{

returnS.len;

}

voidGetNext(HStringT,int*next)

{

inti=0,j=-1;

next[0]=-1;

while(i

if(j==-1||T.chars[i]==T.chars[j])

{

i++;

j++;

next[i]=j;

}

else

j=next[j];

}

intIndex(HStringS,HStringT,intpos)//取串T中和主串S中相同字串在第pos位置为第一次出现的位置

{

int*next,i=pos-1,j=0;

next=newint[T.len];

GetNext(T,next);

while(i

if(j==-1||S.chars[i]==T.chars[j])

{

i++;

j++;

}

else

j=next[j];

if(j>=T.len)

returni-T.len+1;

else

return0;

}

voidStrPrint(HStringS)//输出串S

{

inti;

for(i=0;i

std:

:

cout<

std:

:

cout<

:

endl;

}

//sy4.cpp

#include

#include

#include"HString.h"

#defineMAX_LINE100//MAX_LIEN为最大行数

#defineLINE_WORD80//LINE_WORD为每行最大字符数

#definePATH_LEN30//PATH_LEN为文件路径名最大长度

HStringT[MAX_LINE];

charstr[LINE_WORD];//定义每行的字符串

charfilename[PATH_LEN]="";

intn=0;//行数

usingnamespacestd;

voidOpen()//打开文本文件

{

if(filename[0]!

='\0')//判断当前文件是否处于打开状态

cout<<"文件已经打开!

"<

else

{

cout<<"请输入文件名(最大"<

";

cin>>filename;

fstreamFile(filename);

if(!

File)//文件名不存在,创建新文件

cout<<"新文件"<

else

{

while(!

File.eof())//判断文件是否为空,若否,读入行数据给str

{

File.getline(str,LINE_WORD);

if(n>=MAX_LINE)//判断文件是否超出最大行数

{

cout<<"文件太大"<

return;

}

StrAssign(T[n],str);

n++;

}

File.close();

}

}

}

voidPrint()//输出文本

{

inti;

for(i=0;i

{

cout<

";

StrPrint(T[i]);//调用字符串输出函数,输出文本中的每一行

}

}

voidInsert()//插入

{

inti,L,M;

cout<<"在第L行前面插入M行,输入LM:

";

cin>>L>>M;

if(L+M>MAX_LINE)

{

cout<<"行数超出范围!

"<

return;

}

if(M<0||L-1>n)

cout<<"行数参数有误!

"<

else

{

for(i=n-1;i>=L-1;i--)

T[i+M]=T[i];

n+=M;

cout<<"请顺序输入待插入内容:

"<

for(i=L-1;i

{

cin>>str;

StrInit(T[i]);

StrAssign(T[i],str);

}

cout<<"插入完成!

"<

}

}

voidDelete()//删除

{

inti,L,M;

cout<<"从第L行起删除M行请输入LM:

";

cin>>L>>M;

if(L<0||L+M>n+1)

cout<<"行数超出范围!

"<

else

{

for(i=L+M-1;i<=n-1;i++)

{

StrInit(T[i-M]);

T[i-M]=T[i];

}

for(i=L+M;i

StrInit(T[i]);

n-=M;

cout<<"删除完成!

"<

}

}

voidModify()//修改

{

inti;

cout<<"请输入要修改的行号:

";

cin>>i;

if(i>n)

cout<<"行号错误!

"<

else

{

cout<<"请输入要改写为的内容:

";

cin>>str;

StrAssign(T[i-1],str);//将改写的内容读入到T中的i-1行

}

}

voidSearch()//查找字符串

{

inti,k,f=-1;

HStringH;

charb[2];

cout<<"请输入要查找的字符串:

";

cin>>str;

StrInit(H);

StrAssign(H,str);//将读入的字符串生成H

for(i=0;i

{

k=1;

while(k)

{

k=Index(T[i],H,k);//调用取字串位置函数,在HString.h中

if(k)

{

cout<<"第"<

cout<<"第"<

(Y/N)";

cin>>b;

if(b[0]!

='Y'&&b[0]!

='y')

{

f=0;

break;

}

else

k++;

}

}

}

if(f)

cout<<"没有找到!

"<

}

voidSave()//保存文本

{

inti;

ofstreamFile(filename);

if(!

File)

{

cout<<"存盘失败!

";

return;

}

for(i=0;i

{

File.write(T[i].chars,T[i].len);

if(i!

=n-1)

File<

}

File.close();

cout<<"保存完成!

"<

}

intmain()

{

inti;

for(i=0;i

StrInit(T[i]);//初始化T

while(i)

{

cout<<"请选择:

1.打开文件2.显示文件内容"<

cout<<"3.插入行4.删除行"<

cout<<"5.修改行6.查找字符串"<

cout<<"7.存盘8.退出"<

cin>>i;

switch(i)//调用各功能

{

case1:

Open();

break;

case2:

Print();

break;

case3:

Insert();

break;

case4:

Delete();

break;

break;

case5:

Modify();

break;

case6:

Search();

break;

case7:

Save();

break;

case8:

return0;

break;

default:

cout<<"错误,重新选择!

"<

}

}

return0;

}

实验结果:

总结和感想:

这次实验要求我们熟悉串的基本操作,掌握串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法。

要求全屏幕文本编辑器通过终端对文本文件进行创建、插入、删除、修改、存储等操作,用户可完成对文本的插入、删除、修改等功能。

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

当前位置:首页 > 解决方案 > 其它

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

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