《简易文本编辑器课程设计报告.doc》由会员分享,可在线阅读,更多相关《简易文本编辑器课程设计报告.doc(24页珍藏版)》请在金锄头文库上搜索。
1、中北大学数 据 结 构课 程 设 计 说 明 书学生姓名:张兴凯学 号:1021011547学 院:软件学院专 业:软件工程题 目: 简易文本编辑器成绩指导教师何志英2011年12月20日 1设计目的简易文本编辑器2设计内容和要求1)具有图形菜单界面;2)查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除3)可正确存盘、取盘;4)正确显示总行数。3本设计所采用的数据结构 本程序是对输入的文字进行操作,故使用的数据结构为单链表操作线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继
2、存储位置的域称为指针域。另有全局变量*head,作为文章的头指针。 在文章内容创建部分中使用线性表的链式存储,并使用全局变量对文本的各种信息进行存储; 文章的内容统计、删除、查找、插入都采用链表操作完成。4功能模块详细设计4.1 详细设计思想本程序所定义函数的设计思想:CreatWord()文本内容输入函数定义LinkList指针变量*temp: LinkList *temp;定义文本输入变量ch,记录文本行数变量j,记录每行字符数变量i;申请动态存储空间:head-next=(LinkList *)malloc(sizeof(LinkList);首行头指针的前驱指针为空:head-pre=N
3、ULL;利用循环进行文本输入PrintWord()当前文本输出函数定义文本行数变量j,每行字符数i:int i,j;定义指针变量:LinkList *p;将指针p指向链表表头: p=head-next;利用循环输出链表中信息: for(j=0;j=NUM&p!=NULL;j+)=for(i=0;(idatai)!=#;i+)=printf(%c,p-datai);p=p-next; SearchWord( ) 文本内容查找函数定义一个数组,用来记录需要查找的字符内容:char Data20;定义定义文本行数变量j,每行字符数i,记录字符出现的次数变量:利用循环进行查找操作,核心算法为:if(t
4、emp-datai)=Datak) k+;/将输入的查找字符与链表中信息比较,找到第一个相同的字符 else if(Datak!=0)i=i-k; k=0; / /从主串第i-k个位置重新查找 if(Datak=0) sum+;/此字符出现的次数加1 i=i-k+1; /i记录下该字符串出现的位置 printf(tt第%d次出现在第%d行第%d列n,l,j+1,i); l+; k=0;continue; temp=temp-next; /指向下一行DeleteWord( ) 文本内容删除函数定义一个数组用来存储需要删除的字符或者字符串:char Data20;定义指针变量:LinkList *
5、temp,*term;使用VC+中拷贝函数讲形参中需要删除的字符或字符串赋值给已定义的数组:strcpy(Data,str2);使用循环进行删除操作:其核心算法为:for(j=0;j=NUM;j+) for(i=0;idatai)=Datak) k+; else if(Datak!=0) i=i-k;k=0; if(Datak=0) num=i;break; if(num80) break; 首先是使用循环查找到需要删除字符或者字符串的字符数以及字符或者字符串的位置,以便于删除; for(;j=NUM;j+) for(;i80;i+) if(i+1data80-k+num=temp-datai
6、+1; /删除的字符串不在最后一行,将下一行的字符(由temp指向)前移到前行else temp-datai-k+1=temp-datai+1; /当要删除的字符串在最后一行只要将最后一行的字符前移 term=temp; temp=temp-next; j=0;/在使用循环,从查找到的字符或者字符串开始进行删除,在一行删除完毕之后,转至下一行进行删除。本程序所定义的函数:1、HeadWord() 标题函数,即一个输出标题,永远出现在程序的最顶端。2、save() 文件存储函数3、load() 文件读取函数4、CreatWord() 文本输入函数5、PrintWord() 当前文本内容输出函数6
7、、SearchWord() 文章内容查找函数7、DelWord() 文章内容删除函数8、InsertWord() 文章内容插入函数9、Replace() 文章内容替换函数10、Bmenu() 第二子菜单函数11、menu() 主菜单函数12、main()主函数4.2 运行结果(1)执行完menu() 主菜单函数后的结果(2) 输入文章内容的结果(3)读取当前文本内容信息(4) 进入文本内容处理菜单(5)查找文章中字符或者字符串(6)显示当前文章内容(7)返回主菜单4.3 核心代码#include stdafx.h#include stdio.h#include conio.h#includem
8、alloc.h#includestring.h#includeiostream.h#includestdlib.h#define Link_Size 100int NUM,C,N,hang; /*定义全局变量,Num用来记录行号,C用来记录子串在主串中出现的总次数*/#define MAXLEN 80char bufferMAXLEN,fname120;char *lineptrLink_Size;FILE *fp;int modified=0,/*正文被修改标志*/ last;/*当前正文行数*/char *chpt;/*输入命令行字符指针*/typedef struct _list/*行表
9、结构*/ char data80;/*记录一行字符*/int length;/*记录一行字符长度*/ struct _list *next;/* 后继指针*/struct _list *pre;/*前趋指针*/int row;/*记录整篇文章的行数*/LinkList;LinkList *head; /*定义全局变量*head,文章首行头指针*/void HeadWord()printf(tt*n);printf(tt* 欢迎使用简单的文本编辑器 *n);printf(tt*n);int save(char *fname) int i; FILE *fp; char name80; if(!*
10、fname) printf(filename:); gets(name); else strcpy(name,fname); if(fp=fopen(name,wb)=NULL) return 0; for(i=0;ilast;i+) fputs(lineptri,fp); free(lineptri); fclose(fp); printf(file %s already saved.,name); getch(); return 1;int load(char *fname) FILE *fp; char ch,*p; int i; if(fp=fopen(fname,rb)=NULL)
11、return 0; while(!feof(fp) ch=getc(fp); if(ch=x09) for(i=0;inext=(LinkList *)malloc(sizeof(LinkList); head-pre=NULL;temp=head-next; temp-pre=NULL; temp-length=0; for(i=0;idatai=0;printf(开始创建文本,请输入文章(按#结束):n);for(j=0;jLink_Size;j+) for(i=0;idatai=ch; temp-length+;if(ch=n)hang+; if(ch=#) NUM=j; break; if(ch=#) temp-length=i; temp-next=NULL; break; temp-next=(LinkList *)malloc(sizeof(LinkList) ; temp-next-pre=temp; temp=temp-next;