数据结构实验4.docx
《数据结构实验4.docx》由会员分享,可在线阅读,更多相关《数据结构实验4.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构实验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;iS.chars[i]=T[i];
S.len=len;
returnOK;
}
(2)取子串位置
intIndex(HStringS,HStringT,intpos)
{//取串T中和主串S中相同字串在第pos位置为第一次出现的位置
next=newint[T.len];
GetNext(T,next);
while(iif(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;icout<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;iS.chars[i]=T[i];
S.len=len;
returnOK;
}
intStrLen(HStringS)
{
returnS.len;
}
voidGetNext(HStringT,int*next)
{
inti=0,j=-1;
next[0]=-1;
while(iif(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(iif(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;istd:
:
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;iStrInit(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;iStrInit(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;
}
实验结果:
总结和感想:
这次实验要求我们熟悉串的基本操作,掌握串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法。
要求全屏幕文本编辑器通过终端对文本文件进行创建、插入、删除、修改、存储等操作,用户可完成对文本的插入、删除、修改等功能。