数据结构课程设计文章编辑器报告_第1页
数据结构课程设计文章编辑器报告_第2页
数据结构课程设计文章编辑器报告_第3页
数据结构课程设计文章编辑器报告_第4页
数据结构课程设计文章编辑器报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学号数据结构课程设计设计说明书文章编辑起止日期:2012年1月2日至2012年1月6日学生姓名班级09计算机一班成绩指导教师(签字)电子与信息工程系2012年1月6日

天津城市建设学院课程设计任务书2011—2012学年第1学期电子与信息工程系计算机科学与技术专业09级1班级课程设计名称:数据结构课程设计设计题目:文章编辑完成期限:自2012年1月2日至2012年1月6日共1周设计依据、要求及主要内容〔可另加附页〕:一、设计目的熟悉各种数据结构和运算,会使用数据结构的根本操作解决一些实际问题。二、设计要求〔1〕重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;〔2〕按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;〔3〕学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;〔4〕认真编写课程设计报告。三、设计内容文章编辑程序静态存储一页文章,每行最多不超过80个字符,共N行,要求:〔1〕分别统计出其中英文字母数和空格数及整篇文章总字数;〔2〕统计某一字符串在文章中出现的次数,并输出该次数;〔3〕删除某一子串,并将后面的字符前移。目录一、需求分析 3二、总体设计 3三、详细设计 4四、调试与测试 7五、源程序及运行结果 10六、心得体会 19七、参考文献 19文章编辑程序一、需求分析文章编辑,顾名思义就是对文章进行读写、统计、修改等操作。首先我们需要通过函数读取或者录入文章,然后设计模块统计需要分类统计各类字符的个数,当然有时候我们也需要查询某个字符或者字符串在文章中出现的次数,对于某个字符或者字符串,后来经过改良需要删除,就要设计函数实现,并且为了保证文本的页面一致性,我们需要实现分行输出,并且在删除子串以后后续字符前移。为此,我设计了文章编辑程序。二、总体设计程序组成框图程序流程图三、详细设计程序主要包括六个模块第一个模块是是文本获取模块,由三个函数组成,getdata分别调用getdata1、getdata2,实现读取文件和键盘输入两种文本获取方式函数伪代码如下Voidgetdata(){Case1:getadata1();Case2:getdata2();}Voidgetdata1(){f1=fopen(filename,"r");//以文件名翻开文件while((a=getc(f1))!=EOF) {if(j==79){s[i++][j]='\n';j=0;} if(a!='\n'){s[i][j++]=a;} elses[i++][j]=a; }}Voidgetdata2(){while((a=getchar())!='#')//键盘输入文本 { if(j==79){s[i++][j]='\n';j=0;} if(a!='\n'){s[i][j++]=a;} elses[i++][j]=a; }}第二个模块是文本输出模块,通过函数show_text()实现,伪代码如下:voidText::show_text(){ cout<<"文本如下:"<<endl;}第三个模块是指令集显示模块,便于随时查看命令,进行新的操作函数伪代码”voidText::help(){cout<<"请选择操作指令"<<endl<<endl;cout<<"================================================================================"<<endl;cout<<"☆count:分别统计各类字符总数☆"<<endl<<endl;cout<<"☆search:统计所查字符☆"<<endl<<endl;cout<<"☆delete:删除特定字符☆"<<endl<<endl;cout<<"☆help:查看程序指令集合☆"<<endl<<endl; cout<<"☆return:返回选择文件☆"<<endl<<endl;cout<<"☆exit:退出文本编辑程序☆"<<endl<<endl; cout<<"================================================================================"<<endl;}第四个模块是分类统计字符模块,用来统计各类字符信息并传递到终端。通过voidText::count()函数实现,函数伪代码:voidText::count()//分别统计各类字符个数{ intcc,cp,cn,co,sum; cc=cp=cn=co=sum=0; for(inti=0;i<len;i++) for(intj=0;j<80;j++) { 扫描并分类统计字符信息 } cout<<"文章字符统计如下"<<endl<<endl; cout<<"字母个数为:"<<cc<<endl; cout<<"空格个数为:"<<cp<<endl; cout<<"数字个数为:"<<cn<<endl; cout<<"文章总字数:"<<sum<<endl;}第五个模块是子串查找模块,该模块对用户在终端输入的子串在目标串中运用顺序查找进行检索,统计匹配次数,并将结果反应给用户,由voidText::search_str()函数实现函数伪代码:voidText::search_str(){ charstr[80],*p;intq,count=0; cout<<"请输入一个字符子串:"<<endl; cin>>str; p=str;/ 匹配…..cout<<str<<"在文章中的出现次数为:"<<count<<endl<<endl;}第六个模块是子串删除模块,该模块对用户输入的子串在目标串中运用顺序查找进行检索并删除,后续字符前移,通过voidText::delete_str()函数实现函数伪代码:voidText::search_str(){ charstr[80],*p;intq,count=0; cout<<"请输入一个字符子串:"<<endl; cin>>str; p=str;匹配并删除cout<<"删除字符"<<str<<"后的文本为:"<<endl<<endl;show_text();}四、调试与测试修改程序能够正确编译执行后出现的问题及解决方法:文本输出局部正确,后面出现乱码。查找资料说是没有对数组内存初始化,可以通过memset函数实现,在获取文本的时候同时对数组内存初始化,解决问题。加上memset函数之后分类统计字符的时候输出异常。具体是文章总字数sum不正确,仔细检查是for循环的过程中,sum每次都自增,没有设置自增条件,通过对sum++加上if条件后解决问题。加上自增if条件后删除子串时如果遇见同一子串连续出现数次,只能删除一半这是因为每次匹配时j的值变化,需要复原,然后J++如果不删除前面匹配过直接复原即可,删除的话后续子串前移,自增后前移的第一个值将不会匹配,通过设置不同的j值复原解决五、源程序及运行结果程序源代码:#include<iostream>#include<fstream>//输入输出文件流类头文件usingnamespacestd;constintN=800;classText//定义Text类{private: chars[N][80]; charfilename[30]; charstr[90]; intlen; voidgetdata1(); voidgetdata2(); voidgetdata(); voidshow_text(); voidcount(); voidsearch_str(); voiddelete_str(); voidhelp();public: Text() {cout<<"★您好,欢送使用文本编辑程序!★"<<endl<<endl; cout<<"================================================================================"<<endl; cout<<"================================================================================"<<endl; }voidMain_Work();};voidText::getdata(){ intchose;//选择文本 cout<<"请选择文件来源"<<endl<<endl; cout<<"1、翻开文件"<<endl<<endl;cout<<"2、手动输入"<<endl<<endl; cin>>chose; switch(chose) { case1:getdata1();break; case2:getdata2();break; }}voidText::getdata1(){ cout<<"请输入文本名:"<<endl; cin>>filename; cout<<endl; FILE*f1;chara;inti=0,j=0; f1=fopen(filename,"r");//通过文件名与文件流关联cout<<"正在读取数据"<<endl<<endl; len=0; memset(s,0,sizeof(s));while((a=getc(f1))!=EOF)//从文件逐个读取字符并传递a直到文件结束 { if(j==79){s[i++][j]='\n';j=0;}//每行不超过80个字符 if(a!='\n'){s[i][j++]=a;}//如果没有回车就一直传递 elses[i++][j]=a;//如果遇见回车换行输入 } len=i+1;//计算行数 cout<<"数据读取完毕:"<<endl;}voidText::getdata2()//从键盘输入字符{ cout<<"请输入一段字符,以#号结束"<<endl; memset(s,0,sizeof(s)); chara;inti=0,j=0; while((a=getchar())!='#')//以#号结束 { if(j==79){s[i++][j]='\n';j=0;} if(a!='\n'){s[i][j++]=a;} elses[i++][j]=a; } len=i+1;}voidText::show_text(){ cout<<"文本如下:"<<endl; for(inti=0;i<len;i++) for(intj=0;j<80;j++) { if(s[i][j]!='\0') cout<<s[i][j]; } cout<<endl;}voidText::help(){cout<<"请选择操作指令"<<endl<<endl;cout<<"================================================================================"<<endl;cout<<"☆count:分别统计各类字符总数☆"<<endl<<endl;cout<<"☆search:统计所查字符☆"<<endl<<endl;cout<<"☆delete:删除特定字符☆"<<endl<<endl;cout<<"☆help:查看程序指令集合☆"<<endl<<endl; cout<<"☆return:返回选择文件☆"<<endl<<endl;cout<<"☆exit:退出文本编辑程序☆"<<endl<<endl; cout<<"================================================================================"<<endl;}voidText::count()//分别统计各类字符个数{ intcc,cp,cn,co,sum; cc=cp=cn=co=sum=0; for(inti=0;i<len;i++) for(intj=0;j<80;j++) { if(s[i][j]>='0'&&s[i][j]<='9')cn++; if(s[i][j]>='A'&&s[i][j]<='Z'||s[i][j]>='a'&&s[i][j]<='z')cc++; if(s[i][j]=='')cp++; if(s[i][j]!='\0')sum++;//只要字符不为空,就计入总数 } cout<<"文章字符统计如下"<<endl<<endl; cout<<"字母个数为:"<<cc<<endl; cout<<"空格个数为:"<<cp<<endl; cout<<"数字个数为:"<<cn<<endl; cout<<"文章总字数:"<<sum<<endl;}voidText::search_str(){ charstr[80],*p;intq,count=0;//定义子串指针 cout<<"请输入一个字符子串:"<<endl; cin>>str; p=str;//从键盘输入子串 for(inti=0;i<len;i++) for(intj=0;j<80;j++) { q=j;//保存j的初值while(*p!='\0')//匹配直至子串最后一个字符 if(*p==s[i][j]){j++;p++;}//如果字符匹配,目标串和子串同时右移 elsebreak;//如果字符不匹配跳出循环 if(*p=='\0')count++;//完全匹配时count加1 p=str;//子串复原 j=q;//复原j的值 }cout<<str<<"在文章中的出现次数为:"<<count<<endl<<endl;}voidText::delete_str(){charstr[80],*p;intq,m;cout<<"请输入一个字符子串:"<<endl;cin>>str;p=str;for(inti=0;i<len;i++) for(intj=0;j<80;j++) { q=j; while(*p!='\0') if(*p==s[i][j]){j++;p++;} elsebreak; m=j-q;//删除子串后移动的距离〔子串长度〕 if(*p=='\0') { for(j=q;s[i][j+m]!='\0';j++)s[i][j]=s[i][j+m];//字符前移 s[i][j]='\0';//前移之后末尾长度为子串长度的字符设为结束符 j=q-1;//删除一次子串,目标串前移之后,j++〔再次匹配需要-1〕 } elsej=q;//不删除子串,前面的已经匹配过,所以不需要-1 p=str;//子串复原 }cout<<"删除字符"<<str<<"后的文本为:"<<endl<<endl;show_text();}voidText::Mai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论