简易文本编辑器课程设计报告_第1页
简易文本编辑器课程设计报告_第2页
简易文本编辑器课程设计报告_第3页
简易文本编辑器课程设计报告_第4页
简易文本编辑器课程设计报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

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;

12、if(ch=#) temp-length=i; temp-next=null; break; temp-next=(linklist *)malloc(sizeof(linklist) ; temp-next-pre=temp; temp=temp-next; for(i=0;idatai=0;temp-row=num+1;system(cls);return temp;void printword()int i,j;/*记录文本行数变量j,记录每行字符数变量i*/linklist *p;p=head-next;system(cls); headword();printf(n当前文章的内容是:

13、);for(j=0;j=num&p!=null;j+)for(i=0;(idatai)!=#;i+)printf(%c,p-datai);p=p-next; printf(n当前文章行数为:%dn,hang);void searchword(char *str1,linklist* temp) char data20 ; int i,j,k=0,sum=0;int l=1; temp=head-next; strcpy(data,str1); for(i=0;i=num;i+) for(j=0;jdataj)=datak) k+; else if(datak!=0)j=j-k;k=0; if(

14、datak=0) sum+;j=j-k+1;printf(tt第%d次出现在第%d行第%d列n,l,i+1,j+1);l+;k=0;continue; temp=temp-next; printf(ttt字符串总共出现次数为:%dnn,sum); c=sum;n=i*80+j; void delword(char *str2) char data20; linklist *temp,*term; int i,j,k,m,y,num;strcpy(data,str2);for(y=0;yc;y+) num=80;k=0,m=0; temp=head; for(i=0;inext; for(j=0

15、;jdataj)=datak) k+; else if(datak!=0) j=j-k;k=0; if(datak=0) num=j;break; if(num80) break; for(;i=num;i+) for(;j80;j+) if(j+1data80-k+num=temp-dataj+1; elsetemp-dataj-k+1=temp-dataj+1; term=temp; temp=temp-next; j=0; linklist * insertword(linklist *temp) char data20; int h,l;printf(ntt请输入要插入的字符或字符串:

16、);getchar();gets(data);printf(ntt当前文章内容为:);printword();printf(ntt请输入要插入的行:);scanf(%d,&h);printf(ntt请输入要插入的列:);scanf(%d,&l); int i=(h-1)*80+l; linklist *a;int n=strlen(data);int m ;int insertrow=i/80+1;int row=temp-row;int j;if(insertrow=row)for(m=temp-length-1;m=(i%80)&n0;m-)temp-datam+n=temp-datam;

17、for(m=(i%80),j=0;mdatam=dataj; elseint r=0;for(int p=insertrow; plength-1-r;m=0&n0;m-)temp-datam+n=temp-datam;a=temp;temp = temp-pre;temp-length = 80;for(m = temp-length-n,j=0;mlength;m+,j+)a-dataj=temp-datam;for(m=temp-length-n-1;m=(i%80);m-) temp-datam+n=temp-datam;for(m=(i%80),j=0;mdatam =dataj;r

18、eturn temp;void replace() int k,m,n,i,j; sscanf(chpt,%d%d%d,&k,&m,&n); /* 读入参数 */ if(mlast|n=link_size)/* 检查参数合理性 */ printf(error!n); return; /* 先完成删除 */ if(nlast) n=last; /* 修正参数 */ for(i=m;i=n;i+) /* 删除正文 */ free(lineptri-1); for(i=m,j=n+1;j=m;i-) lineptri+k-1=lineptri-1; for(i=0;i6)&(t1) printf(对

19、不起,无此功能,请输入正确的功能序号!n);elseswitch(t) case 1: system(cls); headword(); temp=creatword(); break; case 2: save(name); break;case 3: load(name); break; case 4: printword(); printf(n); printf(按回车键继续); getchar(); getchar(); system(cls); break; case 5: system(cls); bmenu(temp); break;if(t=6) break;while(1);void main()head=(linklist *)malloc(sizeof(linklist);linklist *temp;menu(temp);5课程设计心得及存在问题本程序是在线性表的基础上改进的,用到了双向链表和一些c+里面的知识。线性表的操作数是浮点形,而文本编辑器的操作数是字符型,在线性表的程序上加进插入删除查找数据结构,然后建立一个文件保存线性表中的数据,就是我写的程序。本次课程设计还算顺利,但是在设计过程中由于自己的不细心,忽略了一些关键的细节,导致了在编写过程中出现了一些错误。例如:少了分号,或忘了定义

温馨提示

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

评论

0/150

提交评论