《文章编辑数据结构设计报告.docx》由会员分享,可在线阅读,更多相关《文章编辑数据结构设计报告.docx(28页珍藏版)》请在课桌文档上搜索。
1、文章编辑设计报告一、实训目的及要求数据结构是计算机课程的一门重要的根底课,它的教学要求大致有三个重要方面:其一就是让学生学会分析研究计算机加工的数据对象的特性,以便为数据选择适当的物理结构和逻辑结构;其二,根据结构,选择适当的算法,并初步掌握算法的时间分析和空间分析;其三,学习复杂的程序设计。本综合实训利用VisualStudio2008集成编程环境为实践工具,通过上机实践培养学生分析具体问题、解决实际问题的能力,训练和培养学生的数据抽象能力和程序设计的能力。数据结构是一门实践性较强的课程,以养学生的数据抽象能力和程序设计的能力为目的。在实训时应注重培养学生的实际操作能力。本综合实训安排了20
2、学时的实验课时,完成4次上机作业。具体要求如下:1 .学习和理解每个实训题目的根本理论和方法;2 .掌握每个实验的实现步骤和关键技术;3 .准备好实验所需要的资源和文档;4 .上机实现程序,得到通过调试的正确程序。5 .根据每个实验的不同要求,完成实验报告的WOrd文档。二、实训环境WindowsXPVisualStudio2010三、实训内容文章编辑1)问题描述输入一页文字,程序可以统计出文字、数字、空格的个数。2)根本要求静态存储一页文章,每行最多不超过80个字符,共N行;要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;13
3、)删除某一子串,并将后面的字符前移。(4)替换字符串15)可以保存到文件中,也可以在文件中翻开四、算法描述及实训步骤定义一个串,可使用顺序串或者链表串。实现串的插入、删除、修改、保存在文件中选择界面输入字串统计字串删除子串替换子串保存一串F换、遍历等功能。并能够把串显示字串/*文本每行以字符串形式存储,行与行之间以链表存储*/usingnamespacestd;typedefstructlinechar*data;structline*next;LINE;/*创立一链表,同时向里面输入文本数据*intstrlength(str*s)/*统计字母数*/intCountLetterCLlNE*&h
4、ead)(1.INE*p=head;intcount=0;dointLen=Strlen(P-data);/*计算当前data里的数据元素的个数*/for(inti=O;idatai=a&pdataiv=z)|(p-datai=A&pdataiK=Z)/*计算字母数可count+;while(p=p-next)!=NULL);/*遍历链表*/returncount;/*返回文章的字母总数*/)/*统计数字数刃intCountNumber(LINE*&head)(1.INE*p=head;intcount=0;do(intLen=StrIen(P.data);/*计算当前data里的数据元素的个
5、数*/for(inti=O;idatai=48&p-datalJnext)!=NULL);/*遍历链表*/returncount;)/*统计空格数刃intCountSpaceCLINE*&head)(1.INE*p=head;intcount=0;do(intLen=StrIen(P.data);/*计算当前data里的数据元素的个数*/for(inti=O;idataij=32)Coimt+;/*计算空格数,空格ASCII码为32*/WhiIe(P=P-next)!=NULL);/*遍历链表*/returncount;/*统计文章的总字数*/intCountAlKLINE*&head)1.I
6、NE*p=head;外保存链表的首地址木/intcount=0;d。/*计算总字符数列(count+=strlen(p-data);)While(P=P-next)!=NULL);/木遍历链表率/returncount;)/*统计str在文章中出现的次数*/intFindStringCLINE&head,char*str)(1.INE*p=head;intcount=0;inth=0;intIelII=O;/*保存当前行的总字符数率/intlen2=strlen(str);/待统计字符串的长度*/intij,k;doIenI=Strlel(p-data);/*当前行的字符数*/for(i=0;
7、ivlenl;i+)/*字符匹配*/(if(p-datai=strOJ)(k=0;for(j=0;jdatai+j=strj)k+;if(k=len2)count+;i=i+k-l;)*遍历链表*/while(p=p-next)!=NULL);returncount;)*删除指定的字符串*/voiddelstringword(char*s,char*str)*s为输入的字符串,*str为将要删除的字符*/char*p=strstr(s,str);/*从字符串s中寻找str第一次出现的位置木/chartmpl80J;intlen=strlen(s);intI=Ien-Strlen(P);intj
8、=i+strlen(str);intcount=0;for(intm=0;mi;m+)tmpcount+=sm;for(intn=j;nlen;n+)tmpcount+=sn;tmpcountj=,0;strcpy(s,tmp);/*返回新的字符串*/)/*替换指定的字符串*/voidrepstringword(char*s,char*str,char*strb)*s为输入的字符串,*str为将要被替换的字符,Strb为替换字符阳(char*p=strstr(s,str);/*从字符串S中寻找str第一次出现的位置本/chartmp80J;intq=0;intk=strlen(strb);in
9、tlen=strlen(s);inti=len-strlen(p);intj=i+strlen(str);intcount=0;for(intm=0;mi;m+)tmpcount+=sm;for(into=0;ok;o+)tmplcount+J=strbq+J;for(intn=j;n文程除一 K4统普删显盒请选择操作序号:(。-T):,的字符串:na为:3清按任意键继续一.bdsandasndkasnkbncncSajajkjnsaknc ansJkajajskjcn JasnckasnkcSakcnkascajajk请按任意键继续. . 一 K C 软件vc+6.0MSDev98MyPrQ
10、jects7Debug7,exe请选择操作序号:(04请撤递黄搀电麦符:强请输入替换的子符:ajaj*12 3 4 5 6 0r r rUUUU UU iswi 婺XX支文程 统誉删显盒4,请选择操作序号:(。一Y):请降人寥蒯陡的某一字符串:於蒯那M后的文章为三bdsadasndkasnkbncncSaJkjnsakncansJkajskJcnSnCkaSnkCSakcnkascajk请按任意键继续.请选择操作序号:(加一4):现在的文早内谷为:bdsandasndkasnkbncncSajkJnsakncansjkajskjcnSnCkaSnkCSakcnkascaJk请按任意键继续.文件
11、(F)漏塞(E)悟式(。)查看(V)帮助(三)insist墓工主支文程删显毒1234560请选择操作序号:(04)保存到文件中成功!请按任意趣正续.一.MsandasndkasnkbncncSajkjnsakncansjkajskjcnsnckasnkcSakcnkascajk七、源代码:#include#include#include#include*文本每行以字符串形式存储,行与行之间以链表存储*/usingnamespacestd;typedefstruct1ine(char+data;structline*next;LINE;*创立一链表,同时向里面愉入文本数据*/输入文字voidCr
12、eate(LINE&head)1.INE*p=newLINE;*首先为链表建立一个附加表头结点*/head=p;/*将P付给表头指针*/chartmp1000=0;inttemp=0;printf(ntt*);printfntt*1输入文章*”);printf(*ntt*2读取文章*):printf(*ntt*);Printf(ntt请选择操作的序号:);选择输入方式,1为键盘输入,2为读取文件输入scanf(*%d*,&temp);if(temp=l)键盘输入(fflush(stdin);清空输入缓存Printf(请输入一页文章,以H为结尾(每行最多输入80字符!):n);whiIe(I)w
13、hile(l)(gets(tmp);*输入字符串!*/if(strlen(tmp)80)Printf(每行最多输入80字符,请重新输入!n);elsebreak;)p=p-next=newLINE;p-data=newcharstrIen(tmp)+l;*为结点分配空间?*/strcpy(p-data,Imp);if(tmpstrlen(tmp)-1=t#)/*除去最后一个控制符#*/(p-datastrlen(tmp)-l三*0,:break;)p-next=NULL;/*最后的一个指针为空?*/head=head-next;FILE*fp;键盘输入保存为文件1.INE*q=head;if(
14、fp=fopen(*d:write.txt*,w+)=NULL)Printf(翻开文件出错!n);system(*pause*);exit(O);)whiIe(q-next!=NULL)fputs(q-data,fp);fputs(*n*,fp);q=q-next;)fputs(q-data,fp);fputs(*n*,fp):fputs(*#*,fp);fclose(fp);Printf(保存到文件中成功!”);system(*pause*);break;)elseif(temp=2)文件读取输入inti,j=0;FILE*fp;读取文件charch;if(fp=fopen(*d:write
15、.txt*,*r*)=NULL)Printf(文件无法翻开,退出程序!n*);system(*pause*):exit(0);)WhiIe(ch=fgetc(fp);tmpj=ch;if(ch=,)break;j+;ch=fgetc(fp):p=p-next=newLINE;p-data=newcharstrlen(tmp)+l;*为结点分配空间?*/strcpy(p-data,tmp);if(lmpIstrlen(Imp)T=#)*除去最后一个控制符#*/p-datastrlen(tmp)-l三,0,;fclose(fp);break;)for(i=0;inext=NULL;/*最后的一个指
16、针为空?*/head=head-next;break;)else其他情况处理fflush(stdin);Printf(”请输入1或2!*);)/*统计字母数*/intCountLetter(LINE*&head)1.INE*p=head;intcount=0;dointLen=StrIen(P-data);*计算当前data里的数据元素的个数*/for(inti=0;idatai=a,p-dataidatai=,A,Z,)/*计算字母数*/count+;)while(p=p-next)!=NULL);*遍历链表*/returnCoUnt;*返回文章的字母总数*/)/*统计数字数*/intCou
17、ntNumber(LINE*Ahead)1.INE*=head:intcount=0;do(intLen=Strlen(p-data);/*计算当前data里的数据元素的个数*/for(inti=0;idatai=48&p-datainext)!=NULL);/*遍历链表*/returncount;/*统计空格数*/intCountSpace(LINE*&head)(1.INE*p=head;intcount=0;dointLen=Strlen(p-data):*计算当前data里的数据元素的个数*/for(inti=0;idatai=32)COUnt+;/*计算空格数,空格ASCn码为32*
18、/)while(p=p-next)!=NULL);/*遍历链表*/returncount;)/*统计文章的总字数*/intCountAll(LINE&head)(1.INE*p=head;/*保存链表的首地址*/intcount=0;do/*计算总字符数*/(count+=strlen(p-data);while(p=p-next)!=NULL);/*遍历链表*/returncount;)/*统计str在文章中出现的次数*/intFindString(LINE*&head,char*str)1.INE*p=head;intcount=0;inth=0;intIenI=0;/*保存当前行的总字符
19、数*/intlen2=strlen(str);/*待统计字符串的长度*/inti,jk;doIenI=Strlen(P-data);/*当前行的字符数*/for(i=0;idatai=str0)k=0:for(j=0;jdatai+j=strj)k+;if(k=len2)(count+;i=i+k-l;)while(p=p-next)!=NULL):/*遍历链表*/returncount;I/*删除指定的字符串*/voiddeistringword(char*s,char*str)*s为输入的字符串,*str为将要删除的字符*/char*p=strstr(s,str);/*从字符串S中寻找st
20、r第一次出现的位置*/chartmp80;intIen=Strlen(s);inti=len-strlen(p);intj=i+strlen(str);intcount=0;for(intm=0;mi;m+)tmpcount+=sm;for(intn=j;ndata,str)!=NULL)deistringword(p-data,str);)whi1e(strstr(p-data,str)!=NULL);while(p=p-next)!=NULL);)*向屏幕输出文章*/voidOutPut(LINE*head)1.INE*p=head;doprintf(*%sn*,p-data);while
21、(p=p-next)!=NULL);)voidrepstringword(char*s,char*str,char*strb)*s为输入的字符串,*str为将要被替换的字符,Strb为替换字符*/(char*p=strstr(s,str);/*从字符串S中寻找str第一次出现的位置*/chartmp80:intq=0;intk=strlen(strb);intlen=strlen(s);inti=len-strlen(p);intj=i+strlen(str);intcount=0;for(intm=0;mi;m+)tmpcount+=sm;for(into=0;ok;o+)tmpcount+
22、=strbq+;for(intn=j;n0,;strcpy(s,tmp);*返回新的字符串*/)voidreplaceString(LINE*fthead,char*str,char*stra)(1.INE*p=head;do确定所有重复字符,并调用子函数替换doif(strstr(p-data,str)!=NULL)repstringword(p-data,str,stra);while(strstr(p-data,str)!=NULL);)while(p=p-next)!=NULL);1intmain()1.INEthead:charc;charstrl20,str220,str380,s
23、tr480;Create(head);Printf(输入的文章为:n);OutPut(head);printf(*n*);fflush(stdin);while(l)SyStem(cis);printf(*ntt*)printf(*ntt*1统计数据*”)printf(*ntt*2统计字符串*)printf(*ntt*3替换字符串*)printf(*ntt*4删除字符串*)printf(*ntt*5显示文章*)printfntt*6保存文章*)printf(*ntt*O退出程序*);printf(ntt*):printf(*ntt请选择操作序号:(04):n);c=getch();if(c=f
24、)Printf(全部字母数:%dn*,CountLetter(head);Printf(数字个数:%dn*,CountNumber(head);Printf(空格个数:%dn*,CountSpace(head);Printf(文章总字数:%dn*,CountAll(head);system(pause);)elseif(c,2,)(printf(*n*);Primf(”请输入要统计的字符串:”);gets(str1);printf(*%s出现的次数为:%dn,strl,FindString(head,strl);printf(*n*);system(pause);elseif(c=三,3,)(
25、Printf(请输入被替换的字符:);gets(str3);Printf(请输入替换的字符:“);gets(str4);replaceString(head,str3,str4);OutPut(head);system(pause);elseif(c=三,4)(Printf(请输入要删除的某一字符串:”);gets(str2);DelString(head,str2):Prinlf(删除s后的文章为:n”,str2);OutPut(head);system(*pause*);)elseif(c=t5,)Printf(现在的文章内容为:”);OutPut(head);system(pause);)elseif(c=三*6,)FILE*fp;健盘输入保存为文件1.INE*q=head;NULL)if(fp=fopen(*d:write.txt*,w+)=Printf(翻开文件出错!n:system(*pause*);exit(0);)whiIe(q-next!=NULL)fputs(q-data,fp);fputs(*n*,fp);q=q-next;)fputs(q-data,fp);fputs(z,n*,fp);fputs(*,fp);fclose(fp);Printf(保存到文件中成功!”);system(pause);elseif(c=O)break;)