简单行编辑程序课程设计一.设计要求1.问题描述文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。
限制这些操作以行为单位进行的编辑程序称为行编辑程序。
被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法即不经济,又不总能实现。
一种解决方法是逐段的编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
试按这种方法实现一个简单的行编辑程序,设文件每行不超过320个字符,很少超过80个字符。
2.需求分析该程序要实现以下4条基本的编辑命令:(1)行插入。
格式:i<行号><回车><文本>. <回车>将<文本>插入活区中第<行号>行之后。
(2)行删除。
格式:d<行号1>[<空格><行号2>.]<回车>例如删除活区中第<行号1>行(到第<行号2>行)。
(3)活区切换。
格式:n<回车>将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。
(4)活区显示。
格式:p<回车>;逐页地(每页20行)显示活区内容,在每显示的一页之后请用户决定是否继续显示以后各页(如果存在)。
印出的每一行要前置行号和一个空格符,行号固定占4位,增量为1。
各条命令中的行号均须在活区中各行号范围之内,只有插入命令的行号可以等于活区第一行行号减一,表示插入当前的屏幕中第一行之前,否则命令参数非法。
二.概要设计1.主界面设计为了实现简单行编辑程序,设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能。
主控菜单运行如下:2.存储结构设计该系统采用串的顺序存储结构。
3.系统功能设计(1)行插入(2)行删除(3)文本显示(4)保存文件(5)读取文件(6)退出系统三.模块设计1.模块设计本程序包含主程序模块、菜单选择模块和串操作模块。
调用关系如下主程序模块菜单选择模块串操作模块2.系统子程序及功能设计(1)enter(int linenum) 据结构设计ADT line{基本操作:enter(linenum)初始条件:有内存。
操作结果:linenum +1.delete_text( )初始条件:line存在。
操作结果:若删除的最后一行,则直接删除。
若删除中间一行,则后面的linenum -1。
Load()初始条件:存在文件file操作结果:打开文件。
} ADT line2.系统主要子程序详细设计(1)主程序模块设计void main(int argc,char *argv[]) {char s[80],choice,fname[80];int linenum=1;start=NULL;last=NULL;if(argc==2) load(argv[1]);do{choice=menu_select();switch(choice){case 1:printf("行号:");gets(s);linenum=atoi(s);enter(linenum);break;case 2:delete_text();break;case 3:list();break;case 4:printf("\t文件名:");gets(fname);save(fname);break;case 5:printf("\t文件名:");gets(fname);load(fname);break;case 6:exit(0);}}while(1);}menu_select(){char s[80];int c;printf("\t**欢迎使用简单行编辑程序**\n");printf("\t\t\t\t1.行插入\n");printf("\t\t\t\t2.行删除\n");printf("\t\t\t\t3.文本显示\n");printf("\t\t\t\t4.保存文件\n");printf("\t\t\t\t5.读取文件\n");printf("\t\t\t\t6.退出\n");printf("\t**\n");do{printf("\n\n\t\t 请选择:");gets(s);c=atoi(s);}while(c<0||c>6);return(c);}(2)主要工作函数/*将文本插在指定行端部*/enter(int linenum){struct line *info;for(;;){info=(struct line *)malloc(sizeof(struct line));if(!info){printf("\t! 内存不够!\n");return(NULL);}printf("%d:",linenum);gets(info->text);info->num=linenum;if(*info->text){if(find(linenum)) patchup(linenum,1);if(*info->text) start=dls_store(info);}else break;linenum++;}return(linenum);}/*当文本内容插在文件中间时其下面的内容的行号必须增加1,而删除时,被删除的文本后面的行号必须减1 */void patchup(int n,int incr){struct line *i;i=find(n);while(i){i->num=i->num+incr;i=i->next;}}/*按行号排序后插入*/struct line *dls_store(struct line *i) {struct line *old,*p;if(last==NULL){i->next=NULL;i->prior=NULL;last=i;return(i);}p=start;old=NULL;while(p){if(p->num){old=p;p=p->next;}else{if(p->prior){p->prior->next=i;i->next=p;p->prior=i;return start;}i->next=p;i->prior=NULL;p->prior=i;return(i);}}old->next=i;i->next=NULL;i->prior=old;last=i;return start;}/*删除一行*/void delete_text(){struct line *info;char s[80];int linenum;printf("行号:");gets(s);linenum=atoi(s);info=find(linenum);if(info){if(start==info){start=info->next;if(start) start->prior=NULL;else last=NULL;}else{info->prior->next=info->next;if(info!=last)info->next->prior=info->prior;else last=info->prior;}free(info);patchup(linenum+1,-1);}}/*查找一行文本*/struct line *find(int linenum) {struct line *info;info=start;while(info){if(linenum==info->num) return(info);info=info->next;}return(NULL);}/*显示文本*/void list(){struct line *info;info=start;while(info){printf("%d:%s\n",info->num,info->text);info=info->next;}printf("\n\n");}/*存文件*/void save(char *fname){struct line *info;char *p;FILE *fp;if((fp=fopen(fname,"w"))==NULL){printf("\t Can't open the file !\n");exit(0);}printf("\t Saved :\n");info=start;while(info){p=info->text;while(*p) putc(*p++,fp);putc('\n',fp);info=info->next;}fclose(fp);}/*读取文件*/void load(char *fname){struct line *info,*temp;char *p;FILE *fp;int size,inct;if((fp=fopen(fname,"r+"))==NULL){printf("\t Can't open the file !\n");exit(0);}while(start){temp=start;start=start->next;free(temp);}printf("\n\t Reading...\n");size=sizeof(struct line);start=(struct line*)malloc(size);if(!start){printf("\n\t内存已经用完!");return;}info=start;p=info->text;inct=1;while((*p=getc(fp))!=EOF){p++;while((*p=getc(fp))!='\n') p++;*p='\0';info->num=inct++;info->next=(struct line*)malloc(size);if(!info->next){printf("\n\t内存已经用完!");return;}info->prior=temp;temp=info;info=info->next;p=info->text;}temp->next=NULL;last=temp;free(info);start->prior=NULL;fclose(fp);}四.测试分析1.主菜单2.行插入3.行删除及文本显示4.保存及读取文件5.退出主菜单下输入5并回车即退出“简单行编辑程序”。