小型文本编辑器_第1页
小型文本编辑器_第2页
小型文本编辑器_第3页
小型文本编辑器_第4页
小型文本编辑器_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

目录TOC\o"1-5"\h\z问题描述 3\o"CurrentDocument"题目内容 3\o"CurrentDocument"基本要求 3需求分析 3\o"CurrentDocument"基本功能 3\o"CurrentDocument"输入、输出形式 3\o"CurrentDocument"测试数据要求 4总体设计 4\o"CurrentDocument"抽象数据类型 4主程序流程图 4\o"CurrentDocument"模块调用关系 5详细设计 5数据类型 5主程序以及其它模块的算法描述 6编码与调试分析 11编码 11调试分析 11使用说明 11测试结果 12课程设计心得体会 13一、 问题描述题目内容:设计一小型文本编辑器,使其具有通常行编辑器(如Vi、Edlin)应具备的基本功能。基本要求:该编辑器应具备对文本文件的查找、插人、删除、修改、字符串替换、统计字数,统计行数等功能,对于超过一屏的长文件,应能够分页显示,并支持通配符*或?设计用户接口命令,实现对文本的编辑。二、 需求分析基本功能:、读写文件;、对文件的查找(包括单个字符的查找,使用通配符*和通配符?查找);、对文件的插入(包括插入单个字符,插入行);、对文件的删除(包括删除单个字符,删除行);、字符的替换(修改);、统计功能(行数,字符数);、文件超过一屏的要分页显示;、设计接口命令,使用户使用方便;、保存文件。输入输出形式:输入:输入文件名,可写入文件内容。文件和Debug在相同目录下。输出:(1)、输出要编辑的文件内容;、每次编辑后都输出文件内容;、输出最终编辑的结果。测试数据要求:要求测试的数据为任意的文本文件,文件每行的字符数不得超过255。文件的数据只能包含52个英文字母和几个常用的标点符号以及空格,不包括特殊符号以及不常用的符号,不包括汉字。三、 总体设计抽象数据类型:该程序一个结构体,一个类。Edit类用来存储字文件的,以及对文件的一些操作,比如说增加、删除、修改等等功能。结构体EditNode中定义一个字符串,该字符串用来存储52个英文字母、空格和一些常用的标点符号。数据结构使用双链表。主程序流程:

开始结束编辑文件保存文件打开文件写入文件删除修改查开始结束编辑文件保存文件打开文件写入文件删除修改查找增加统计主流程图模块调用关系:主函数调用文件的读写,文件的编辑以及文件的保存,文件的编辑函数再调用增加、删除、修改、统计、查找,增加包括单个字符的增加和行增加、删除包括单个字符的删除和行删除、统计包括字符个数统计和行统计、查找支持单个字符的查找、使用通配符*和?的查找。四、详细设计本程序数据结构用的是双链表,每一行作为一个结点。数据类型:结构体的定义:EditNode里包括数据的存储的定义,结点的定义,和行数以及每行的字符数的定义。structEditNode(stringstr; //存放数据

EditNode*front;EditNode*next;intLineNum;intStrNum;};//启示结点//下一结点//启示结点//下一结点//记录行数//记录每个结点的字符数classEdit(public:Edit();voidMenu();voidGotoxy(intx,inty);voidGet_File(char*FileName);voidPaging();voidInput(char*FileName);voidInsertChar();voidOutPut();voidInsertLine(intn);voidDeleChar();voidDeleLine(intLine);voidSearchStr(chara[]);voidCountLine();voidCountStr();voidModifychar();voidMainMenu();voidEditMenu();voidSave(char*FileName);voidWildcard(chars[]);voidWildCard(chars[]);private:EditNode*first;EditNode*end;};//构造函数〃菜单函数//光标定位//从文件中读取函数//显示内容//写入文件//增加一个字符//构造函数〃菜单函数//光标定位//从文件中读取函数//显示内容//写入文件//增加一个字符〃输出〃增加行函数〃删除字符〃删除行函数//查找单个字符//统计行数〃统计字符数〃在指定位置修改字符位置//主菜单//编辑菜单〃保存文件//查找支持通配符*〃查找支持通配符?(1)、将文件中的内容赋给结点:从文件中读取,没找到一行就分配内存空间,将该行数据赋给结点,直到所有的内容都读取完毕,结束。voidEdit::Get_File(char*FileName)(intnumber;intj=1;inti=0;EditNode*pnew;stringstrs;ifstreaminfile(FileName,ios::in);if(!infile)(cerr<<"文件打开失败!〃<<endl;system(〃pause〃);EditMenu();}while(getline(infile,strs,'\n'))(pnew=newEditNode;pnew->next=NULL;pnew->front=end;end->next=pnew;pnew->str=strs;while(strs[i]!='\0')(i++;}number=i;pnew->StrNum=number;pnew->LineNum=j;end=pnew;j++;first->StrNum++;}}分页显示算法描述:每页显示每页不超过5行,这个行数是通过宏定义的可以改变一页的行数,用到while循环,每找到5行就显示在一页,要显示下一页,先用清平函数,这样就可以达到分页的效果。插入一个字符:该函数使用到光标,将光标定位到某个位置,在该位置可以增加一个字符,增加一个字符时需要移动在增加的字符后面的字符位置,如果超过该行的最大字符个数(255)就会向下一行移动。具体算法:temp=p;if(p->StrNum==Maxsize)(while(p->StrNum==Maxsize)(p=p->next;}for(i=p->StrNum;i>=1;i--)(p->str[i]=p->str[i-1];}p->str[0]=p->front->str[Maxsize-1];p->StrNum++;p=p->front;while(p!=temp)(intj=Maxsize-1;while(j>=1)(p->str[j]=p->str[j-1];j--;}p->str[j]=p->front->str[Maxsize-1];p=p->front;}j=Maxsize-1;while(j>x)(p->str[j]=p->str[j-1];j--;}ch=getch();p->str[j]=ch;}else(for(i=n;i>x;i--)(p->str[i]=p->str[i-1];}ch=getch();p->str[i]=ch;p->StrNum++;}增加行函数算法分析:增加行即增加一个结点,首先用while循环找到要增加的位置,然后再该位置分配内存空间s,让后将要插入的字符串赋给该结点。具体算法设计:while(p->LineNum!=n)(p=p->next;}s=newEditNode;q=p->front;s->front=q;s->next=q->next;q->next->front=s;q->next=s;删除行函数的算法设计与分析:删除行即删除一个结点,首先用一个for循环找到要删除的结点,然后将该空间释放,从而删除了该结点。具体算法设计:for(i=0;i<count;i++)(if(p->LineNum==Line)break;p=p->next;}temp=p->next;p->front->next=p->next;p->next->front=p->front;删除单个字符:首先,光标定位到要删除的字符,然后删除该字符,删除后器字符后面的字符都要向前移动。具体算法设计:temp=p;for(i=x+1;i<p->StrNum;i++)(p->str[i-1]=p->str[i];}p->str[i-1]='\0';while(p->StrNum==Maxsize)(if(p->next)(p->str[Maxsize-1]=p->next->str[0];for(j=1;j<p->next->StrNum;j++)(p->next->str[j-1]=p->next->str[j];}p=p->next;}p->StrNum--;if(p->StrNum==0)((p->front)->next=p->next;(p->next)->front=p->front;first->StrNum--;}else(p->str[p->StrNum]='\0';}p=temp;修改函数算法分析与设计:首先,光标定位在要修改的字符上,然后输入修改后的字符,将该字符赋给光标所在的位置。具体算法设计:ch=getch();p->str[x]=ch;Gotoxy(x,y);cout<<ch;查找单个字符:用了一个while循环一个for循环,将该字符所在的所有位置都找到。具体的算法设计:for(k=0;k<count;k++)(j=0;i=0;while((p->str[i]!='\0')&&j<snum)(if(p->str[i]==a[j])(i++;j++;}else(i=i-j+1;j=0;}五、 编码与调试分析编码:在编码过程中,可以说是困难重重。、刚开始增加删除时,增加或删除一行还好解决直接增加或删除一个结点就可以了,但是增加或删除单个字符比较困难,因为,如果增加或删除一个字符需要移动字符,这样整个结点需要改变并且要增加的位置很难确定,后来又查了些资料研究了一下插入时字符串的移动,最后解决了这个问题,并使用光标移动解决了位置的确定。、在程序运行时会一晃而过,看不到程序运行的结果,再加上system("pause”)可以系统暂停程序运行结果,在按任意键可以继续运行程序。、程序中还存在的问题:因为使用到光标,所以光标移动时容易出错,还有待于解决。调试:其实,编码的时候,调试是十分重要的,因为一个大型的程序,你不可能一下就知道错误所在,只有通过调试,你才能慢慢的找到问题错误的原因,从而解决问题。就本程序来说,有很多地方在做的时候忽略了部分的异常处理,但是在调试过程中就会发现这些问题,从而改正。六、 使用说明首先打开的是首界面,可以选择功能,创建新的文件,在创建新的文件时就要输入文件名,值得一提的是输入的文件名称得包括后缀扩展名。比如说,输入一

温馨提示

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

评论

0/150

提交评论