还剩7页未读,继续阅读
文本内容:
四川大学计算机学院学生实验报告实验名称文本编辑指导老师姓名学号班级物联网8班日期2022/12/15实验题目文本编辑,字符串操作实验目的与要求实现对文本的插入、删除、替换、查找等功能掌握类的使用C++掌握字符串模式匹配算法,如简单字符串模式匹配算法,首尾字符串模式匹配算法,字KMP符串模式匹配算法等实验的环境、操作系统1Windows
8.
1、编译器2Visual Studio
2022、库函数3C++、计算机4x86算法描述在中,有类,它是由类型实现的一个类,可以表示一段字符,并且有着大C++string char量的库函数可以使用,非常方便,因此,我们可以采用它辅助构建我们自己的类,从而实现对字符串的操作,即对文本的编辑、类1mystring我们希翼能够将我们想要作用在一个串中的操作函数封装在一个类中,从而能够非常方便地进行定义、实现每次通过类创建一个对象,通过对象可以获得一个类的串文mystring string本,对象可以使用类中的函数实现对该对象下的类串进行操作string如下是类的定义mystring#ifndef MYSTRING_Httdefine MYSTRING_H#include stringusingnamespace std;class mystringpublic:mystring;〃查找int searchstring P;〃替换void exchangeint n,char s;〃插入void insertint n,char s;〃删除void delint n;〃输出void show;protected:〃主串string T;;#endif可以看到通过的类,我们得到一个受保护的类型主串,也就是我们想要进行mystring string操作的文本在公有类型中,有查找、替换、插入、删除以及输出函数,分别对主串实现对“T”应的操作、构造函数实现2对于类而言,每创建一个对象都需要有构造函数进行初始化在类中,构造函数mystring主要是获得想要操作的串,运用函数获得getline、查找函数实现3查找函数需要找到主串中是否有子串采用简单字符串模式匹配算法查找从中第一T P,P个字符在中第一次浮现的位置开始,即第个字符T pos首先将子串从第个字符起与主串的第位字符起挨次对应字符,若全部对应相等,P Tpos则表明已经找到匹配,成功终止;否则,将子串从第个字符起与主串的第个字符起P Tpos+1挨次比较对应字符,过程与之前类似如此进行,直到某次成功匹配,或者某次中无足够剩T余字符与中各字符对应比较为止为实现普通性,可以初始化P pos=0在某一趟匹配中,模式串的所有字符都与目标串中的对应字符相等,这是匹配成功,返P T回本趟匹配在目标串中开始的位置,也就是模式串中的第个字符在目标串中的位置T P T已经挪移到最后可能与比较的位置,但对应字符不是彻底相同,则表示目标串中没PTT有浮现与模式串相同的子串,匹配失败,返回P-Lint mystring::searchstringPint i=0,j=0;whileiT.lengthjP.lengthifT[i]==P[j]i++;j++;else〃匹酉已成功〃匹配失败ifj=P.lengthreturn i-j+l;else return-1;、替换函数实现4替换串中某个位置的字符,函数参数需要给出位置和替换上的字符当给出的位置数据T大于主串长度时,无法插入当位置数据不大于长度时,直接替换即可、插入函数实现5函数参数给出插入的位置,我们在这里给出第个字符,在它的前面插入字符在位n n+1置添加字符后,原先在第位置后面的字符都向后移位由于是一个容器,大小空间不n string变,因此需要单独添加最后一个字符幸运的是,类中重载了运算符J”和“+”,直接string运用字符串加之最后一个字符即可Tvoid mystring::insertint n,char sint m=T.length;char a=T[T.length-l];ifnT.length无法插入}elseforfint i=m-l;i=n-l;i-T[i+l]=T[i];T[n-l]=s;〃中类串相加即可添加字符到末尾T+=a;c++string、删除函数实现6删除需要位置参数,当位置参数大于长度时不可操作,否则可以进行操作将第个位置n字符由第个位置字符赋值,直到最后一个位置由于的容器性质,其长度不变,所n+1string以最后一个位置没有字符,为此需要缩短串的长度,运用类中的函数即可T stringsubstrvoid mystring::delint nifnT.length无法删除}elseforint i=n-l;iT.length;i++T[i]=T[i+l];}T=T.substrO,T.length-l;、输出函数7类中重载“”运算符,可以直接输出整个串string源程序清单Main,cppttinclude iostream#include stringusingnamespace std;loop*/int mainintargc,char**argvmystring k;查找字符串在第的位置k.exchange3/y;替换后的串k.show;cout«endl;k.insert6/q;插入后的串k.show;cout«endl;k.del5;删除后的串k.show;cout«endl;int mystring::searchstring Pinti=OJ=O;whileiT.lengthjP.lengthifT[i]==P[j]i++;j++;else i=i-j+l;j=O;〃匹酉已成功〃匹配失败ifj=P.lengthreturn i-j+l;else return-1;void mystring::exchangeintn,char sifnT.length无法替换}else T[n-l]=s;}void mystring::insertintn,char sintm=T.length;char a=T[T.length-l];ifnT.length无法插入elseforint i=m-l;i=n-l;i-T[i+l]=T[i];T[n-l]=s;〃中类串相加即可添加字符到末尾T+=a;c++string}void mystring::delintnifnT.length无法删除}elseforfint i=n-l;iT.length;i++;T[i]=T[i+l]}}T=T.substrO,T.length-l;void mystring::show cout«T;运行结果、通过键盘输入文本1Directions:For this part,you are allowed30minutes to write anessay on Albert Einsteins commentingIremark“I have no special talents,but passionately curious.You cangive one example or two toam onlyyour、运行结果如图illustrate ofview.You should write at least150words butno morethan2002point words.新或皮件夹\C:\U sers\Ad oI RDeskto p\mystri ngexe除人文本;it3Directions For this part.you areal lowed38itinutes towrite anes kaycomB«nting onAlbertEinttein$remark,I ha^eno special talents.Wt1a Lnonly paGionatelycurious.You cangiueon©example ortwo toillustrate yoijr point of ui»w,Vou should write atleast156words butru sorethan269words找字符中SF卜”•£,海心苣67m咨换后的*:Diyections Forthis part you aredll owed36niruteG towrite anos oaycomoenting ontAlbert Einstein^3remark I haue nooprcial talents,but Ia Lonly peooionatelgcurious.ou cangiue・oneexample ortwo to illuotrateyo Rjrpointof ui»w You shouldwrit♦at Hast156words butnc”•than淅入后的主:200words DiyecqtionoFor thicpartyou are allowed30ninut^G towrite ane csay9卜所COBWanting onAlbert EinctoinG remark”Ihau»no specialtal9ntc,but Ionly passionatelycuriouo.Vou canglut on-exaaple ortwo toillustrate y«ur pointof uiew.Youshouldwrite atl»a9t卜.150words butno morthan206word回*后的忤Diyeqtions Forthispart,youar»alloMod38minutes towrite anos comoenting on AlbertEinGteins remarkI hasno specialtalents,but Ia Lonly paooionatelgcurious.Vou cangiue one・・example ortwo toillustrate yowr pointof ui»w Vou shouldwrite atleast150words butno orthan203words■握终操作结束的自怨i DiyeqtioneFer thispart,you areallowed3G ainutestowrite an OGGcoHventingonAlbertEinctem GremarkMI haveno Gpecialtal9ntG.b ytlam onlypascicnatry curious,You eargiue on^exanple or[HO toillustrsay com»«ntingonAlbert Einsteins remarkI nospecialtalents,but I■i only passionatelycurious.You cangiue oneexampleortwo toillustrate your pointof UXOM.VOU shouldwriteatleast158wordsbut rtcacre than269words是线择作空束的:叼Diyeqtiono:Forthispart ijouareallowed30■mutes towriteanoss coamentingronAlbertEinsteins renark“I hauenospecialtalents,b utI amonlypassionatelycurious.Vou can”.glue on*txaiaple ortwotoillustr ateyour pointofuiVoushouldurite at150uords butno morethan206words.proc-”it-d aft^r
5.1G1oecondo withreturn ualg0请探住商定#续・•・实验运行结果分析程序开始运行,通过键盘键入或者文件打开获取字符串在上图的演示之中,浮现“请输入文本”字样时,通过键盘输入文本,通过程序算法,这个输入的串将存入到对象的k string类型变量中T中的测试默认将查找的子串设定为随后按照函数中的算法进行查找,Main“essay”,search首先匹配主串中的第一个浮现位置,匹配到第二个位置主串中与子串的不匹配,继续T“e”“c”“s”循环重新匹配当到达的第位置是再次浮现字符,并且往后的匹配均成功,于是找到T67e”的位置,在第位,输出“essay”67随后进行替换操作,参数传入通过函数调用,找到中的第三个位置,n=3,s=y,exchange T即,替换为并输出更改后的串“r”“y”,接着是插入,参数输入为通过函数调用,找到中的第六个位置,即,n=6,s=q,insert T“t”在其前面插入,并输出更改后的串“q”最后进行的操作是删除,参数输入位置通过函数,找到第个位置上字符,并n=5,del5“c”进行删除操作,输出更改后的串实验在操作系统环境下运行稳定,与编译器完美兼容实现了对文本中的字Windows
8.1符串的编辑,能够完成查找、插入等基本操作虽然存在稍微的漏洞,但整体框架实现得比较成功该程序每次只能对一段文本进行操作,暂时不能实现多文段操作未来可以稍加改进,实现更多的功能。