还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
实验报告(课程设计)课程名称数据结构实验项目名称文章编辑学院计算机与软件学院指导教师一报告人」实验时间实验报告提交时间教务处制English++;elseifss[i]=33ss[i]=64||ss[i]=91ss[i]=96||ss[i]=123ss[i]=126Punnum++;elseifss[i]==*Spacenurrn-+;i++;greenColor;coutvv”文字:“vvsumvv”数字:“vvFignumvv字母:vvEnglishvv”标点符号:“vvPunnumvv”空格:“vvSpacenumvvendl;whiteColor;voidtongjidelstringss〃统计在删除插入过程中各种字符数目的变化inti=0J=0;whileiss.lengthsum-;ifss[i]=48ss[i]=57Fignum--;elseifss[i]=ass[i[v=z||ss[i]=Ass[i]=TEnglish-;elseifss[i]=33ss[i]=64||ss[i]=91ss[i]=96||ss[i]=123ss[i]=126Punnum-;elseifss[i]==**Spacenum-;j++;ifjss.lengthbreak;i++;greenColor;coutvv”文字:“vvsumvv数字:vvFignumvv字母:vvEnglishvv”标点符号:vvPunnumvv”空格:“vvSpacenumvvendl;whiteColor;fstreamfile;〃定义文件filevoidcaozuointm〃按输入的数值进行相应的操作ifm=1m=6switchm〃
1.打开文件system^cls^;〃清屏函数file.opend:\\file.txtios::in;charin
[2];intnum=0;cout«”打开文本如下”«endl;S=M;while!file.eoffile.readin1;in
[1]=W;ifin[O]!=\OS+=in
[0];cout«in;file.close;cout«endl;tongjiS;〃统计字符串S中各种字符的数目jiemian;break;〃2输入systemdcis;lnput;//输入jiemian;break;〃
3.删除intnewpos;strings1=Hs2=H;stringitem;cout«S«endl;coutvv”请输入要删除的字符:“vvendl;cin»item;getchar;GetNextitemnext;〃获取子串nextnewpos=KMPFindSnextitemsearch;〃查找到要删除字符串所在的位置ifnewpos==0redColor;coutvv”要删除的字符串不存在!vvendl;whiteColor;elseintstartpos=0;coutvvitemvv”在主串中出现在首次位置为:“vvsearch
[0]/80+1vv”行“vvsearch
[0]%80+1vv”歹『vvendl;forintt=0;tvnewpos;t++forinti=startpos;isearch[t];i++s1+=S[i];forintj=search[t]+item.length;jsearch[t+1];j++s1+=S[j];startpos=search[t+1];tongjidelitem;forintj=search[t]+item.length;jS.length;j4-4-s1+=S0];S=s1;redColor;coutvv”删除后的字符串为:vvendl;whiteColor;cout«S«endl;jiemian;break;〃
4.插入system—cis;cout«S«endl;〃输出原字符串intnewposmn;strings1=^H^s2=^^;〃定义空字符串stringitem;whiletruegreenColor;coutvv”请输入要插入的位置:“vvendl;coutvv”请输入要插入的行:“vvendl;cin»m;coutvv”请输入要插入的列「vvendl;cin»n;whiteColor;newpos=m-1*80+n-1;〃运行窗口默认值为每行80ifnewposS.length||newpos0redColor;coutvv”插入位置有误,请重新输入:“vvendl;whiteColor;elsebreak;greenColor;coukv”请输入要插入的字符:vvendl;whiteColor;cin»item;tongjiitem;ifnewpos==0item+=S;S=item;elseifnewpos==S.length-1S=S+item;elseforinti=0;inewpos;i++s1+=S[i];fori=newpos;i=S.length;i++s2+=S[i];S=s1+item+s2;greenColor;coutvv”插入后的结果如下:“vvendl;whiteColor;cout«S«endl;jiemian;break;〃5•查找OKsystemC^ls!;stringfind;intpos;cout«S«endl;greenColor;coutvv”请输入要查找的字符:vvendl;whiteColor;cin»find;〃输入要查找的字符,输出其出现的首位置GetNextfindnext;pos=KMPFindSnextfindsearch;〃子串在主串中的位置ifpos==0redColor;coutvv”主串中不包含耍查找的字符串Tvvendl;whiteColor;elseintstartpos=0;redColor;coutvvfindvv”在主串中出现在首次位置为:“vvsearch
[0]/80+1**行n«search
[0]%80+1«n歹首次出现的字符串变色部分所示“vvendl;coutvvfindvv”在主串中总共出现了“vvposvv次vvendl;whiteColor;forintt=0;tpos;t++forinti=startpos;isearch[t];i++cout«S[i];greenColor;forintj=search[t];jsearch[t]4-find.length;j+4-cout«S[j];whiteColor;startpos=search[t]+find.length;forintj=startpos;jS.length;j+4-cout«S[j];cout«endl;jiemian;break;〃6存盘systemHclsM;intj=0;ofstreamofs”d:\\file.txt”;forinti=O;i=S.length;i++ofs«S[i];j++;ifj==80ofs«\n;j=0;file.close;redColor;cout«”你已经成功将文本保存在D盘vvendl;whiteColor;jiemian;break;elseredColor;coutvv”输入有误请重新输入输入数字范围为0-6!M«endl;whiteColor;jiemian;intmainjiemian;hout=GetStdHandleSTD_OUTPUT_HANDLE;whiletrueintchose;cin»chose;ifchose!=0caozuochose;elseifchose==0redColor;coutvv”此次程序运行到此结束,谢谢使用!Zvendl;〃
0.退出whiteColor;break;return0;
八、PPT打印版每页6个PPT页面指导教师批阅意见成绩评定:指导教师签字:备注:注
1、报告内的项目或内容设置,可根据实际情况加以调整和补充
2、教师批改学生实验报告时间应在学生提交实验报告时间后10实验项目名称
一、问题描述描述算法设计的内容、约束条件,要求达到的目标等内容由老师公布输入一页文字,每行最多不超过80个字符,共N行;程序可以统计出文字、数字、空格的个数要求在光标下与记事本相似做插入、删除等操作要求能够存盘,并能对老文件打开进行修改操作采用的数据结构及其算法线性结构[采用顺序存储方式];查找、插入、删除
二、基本要求描述算法设计项目应达到的基本要求应该实现基本的删除插入查找打开文件以及存盘等操作.并能对打开的文件里的内容进行插入删除查找等操作,并且在进行完这些操作之后能够进行存盘.
三、分析与实验分析算法设计方法,拟采用的数据结构类结构与主要算法实现原理等内容拟采用链表进行操作,与字符串结合.主要运用了KMP算法进行查找操作在删除中也有涉及.voidGetNextstringpintnext[]〃求模式串p的next[j]的值intj=0k=-1;next
[0]=-1;intlength=p.length-1;whilejlengthifk==-i||pO]==p[k]k++;j++;next[j]=k;elsek=next[k];intKMPFindstringpintnext[]stringqintsearch[]〃用KMP算法在主串中查找子串p为主串q为子串inti=0j=0k=0plength=p.lengthqlength=q.lengthflag=Ot=O;whileiplengthifj==-1IIP[i]==q[j]i++;j++;elsej=next[j];ifj==qlengthflag++;search[t]=i-qlength;//flag存放的是每一次匹配到的字符的首位置t++;returnflag;Search□数组存放子串出现的位置.
四、实验步聚详细介绍实验操作步骤(程序流程图及必要说明)存盘:退出直接输入进行各种操作查找操作插入操作删除操作存盘操作存盘的时候每行存的是80个字符.
六、实验总结主要说明算法的特点,特别是重点说明独创或创新部分,相关实验最有价值的内容,在哪些方面需要进一步了解或得到帮助,以及编程实现算法设计的感悟等内容刚开始做的时候并没有考虑则多,只是想实现查找某个字符出现的次数但是那样太简单了与实验目的不符,最后用KMP算法实现各种个数的字符的查找,并且在此基础上进行各种操作(删除)存盘和打开文件的时候出现一些问题也自行解决了.在此次试验中意识到数据结构算法的灵活性.之前学的KMP算法是进行子串和主串的匹配没有考虑则多,在此次试验中实现了多个循环过程从而达到实验目的.
七、程序清单程序清单如下#includeiostream#includefstream#includestring#includecstdlib#includeconio.h#includewindows.husingnamespacestd;#defineMax100000structLNodechardata;LNode*next;LNode*LinkList;HANDLEhout;stringS;intsum=0Punnum=0Fignum=0Spacenum=0English=0;〃定义全局变量统计数字字母空格标点符号的个数intnext[Max];〃定义next数组intsearch[Max];LNode*SearchLinkListLNode*Lintposnum〃查找位置intj;LNode*p;P=L;j=1;whilepjposnump=p-next;j++;if!p||jposnumreturnNULL;returnp;intSearchLNode*Lcharitem〃查找元素intj=0;LNode*p;P=L;whilepifp-data==itemj++;p=p-next;returnj;intlnsertLinkListLNode*Lintitemintpos//链表的插入LNode*p5*s;p=SearchLinkListLpos-1;if!preturn-1;s=newLNode;s-data=item;S+=s-data;s-next=p-next;p-next=s;return1;LNode*CreatLinkListchar*chintlen〃创建单链表inti;LNode*L*s;iflen=0returnNULL;s=newLNode;s-data=ch
[0];S=ch
[0];s-next=NULL;L=s;fori=2;i=len;i++lnsertLinkListLch[i-1]i;returnL;intDeleteLinkListLNode*Lintpos〃按位置删除,待与光标连接一起intitem;LNode*p*q;p=SearchLinkListLpos-1;if!preturn-1;q=p-next;p-next=p-next-next;item=q-data;deleteq;returnitem;intShowLinkListLNode*L〃链表的输出LNode*p;if!Lreturn-1;P=L;whilep-nextcout«p-data;p=p-next;cout«p-data«endl;return1;voidblueColor〃将字体变为蓝色HANDLEhOut=GetStdHandleSTD_OUTPUT_HANDLE;SetConsoleTextAttributehOutFOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY;//前景色_力口强voidredColor〃将字体变为红色HANDLEhOut=GetStdHandleSTD_OUTPUT_HANDLE;SetConsoleTextAttributehOutFOREGROUND_RED|FOREGROUND_INTENSITY;//前景色_力口强voidgreenColor//字体变为绿色HANDLEhOut=GetStdHandleSTD_OUTPUT_HANDLE;SetConsoleTextAttributehOutFOREGROUND_GREEN|FOREGROUND_INTENSITY;//前景色_力口强voidwhiteColor〃将字体恢复为白色HANDLEhOut=GetStdHandleSTD_OUTPUT_HANDLE;SetConsoleTextAttributehOutFOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN;voidGetNextstringpintnext[]//求模式串p的next[j]的值intj=0k=-1;next
[0]=-1;intlength=p.length-1;whilejlengthifk==-1IIp[j]==p[k]k++;k=next[k];intKMPFindstringpintnext[]stringqintsearch[]〃用KMP算法在主串中查找子串p为主串q为子串inti=0j=0k=0plength=p.lengthqlength=q.lengthflag=0t=0;whileiplengthifj==-1||p[j]==q[j]i++;j++;elsej=next[j];ifj==qlengthflag++;search[t]=i-qlength;//flag存放的是第一次匹配到的字符的首位置t++;returnflag;voidjiemian〃主界面函数blueColor;*****H«endl;coutvv”*****
1.打开文件
2.输入
3.删除
4.插入
5.查找
6.存盘0•退出*****n«endl;endl;coutvv”请根据菜单提示输入要执行的操作!“vvendl;whiteColor;voidlnput〃输入sum=OPunnum=O5Fignum=OSpacenum=OEnglish=O;coutvv”请输入文章内容:“vvendl;inti=0;charch
[100000]end;〃主函数中以数组方式输入getchar;whileend=getchar!=#!sum++;ch[i]=end;ifch[i]=48ch[i]=57Fignum++;elseifch[i]=ach[i]=z||ch[i]=Afch[i]=ZEnglish++;elseifch[i]=33ch[i]=64||ch[i]=91ch[i]=96||ch[i]=123ch[i]=126Punnum+4-;elseifch[i]==*Spacenum++;i++;systemnclsn;greenColor;coutvv”文字:«sum«数字:«Fignum«字母:M«English«M标点符号:“vvPunnumvv”空格:“vvSpacenumvvendl;whiteColor;LinkList=CreatLinkListchsum;〃创建链表voidtongjistringss〃统计在删除插入过程中各种字符数目的变化inti=0J=0;whileiss.lengthsum++;ifss[i]=48ss[i]=57Fignum++;elseifss[i]=ass[i]=z||ss[i]=Ass[i]=T。