数据结构实验4.docx
- 文档编号:3857298
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:14
- 大小:47.25KB
数据结构实验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;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; } 实验结果: 总结和感想: 这次实验要求我们熟悉串的基本操作,掌握串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法。 要求全屏幕文本编辑器通过终端对文本文件进行创建、插入、删除、修改、存储等操作,用户可完成对文本的插入、删除、修改等功能。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验