您好,欢迎访问三七文档
数据结构程序设计实验报告简单行编辑程序院系:计算机科学与技术学院专业:软件工程1班姓名:丁珊珊学号:E01214269日期:2014/9/19一、需求分析1、问题描述:文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法即不经济,又不总能实现。一种解决方法是逐段的编辑。任何时刻只把待编辑文件的一段放在内存,称为活区。试按这种方法实现一个简单的行编辑程序,设文件每行不超过320个字符,很少超过80个字符。2、此程序具备以下功能:(1)行插入。格式:i行号回车文本.回车将文本插入活区中第行号行之后。(2)行删除。格式:d行号1[空格行号2]回车;删除活区中第行号1行(到第行号2行)。(3)活区切换。格式:n回车将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。(4)活区显示。格式:p回车逐页地(每页20行)显示活区内容,在每显示的一页之后请用户决定是否继续显示以后各页(如果存在)。印出的每一行要前置行号和一个空格符,行号固定占4位,增量为1。各条命令中的行号均须在活区中各行号范围之内,只有插入命令的行号可以等于活区第一行行号减一,表示插入当前的屏幕中第一行之前,否则命令参数非法。二、概要设计1、主页面设计2、存储结构设计typedefstructtext{charstring[SIZE];//存储每一行的元素structtext*next;//指向后一个节点的指针intlength;}text,*textp;3、系统功能设计1)行插入2)行删除3)活区切换4)活区显示5)结束4、程序调用关系程序结构流程图:三、详细设计1、数据结构存储定义typedefstructtext{charstring[SIZE];//存储每一行的元素structtext*next;//指向后一个节点的指针intlength;}text,*textp;2、行插入intinsert(textp&head,FILE*out){inthang,i;textpp,p1;scanf(%d,&hang);p=(textp)malloc(sizeof(text));//为插入行分配空间开始输入命令i输入命令d输入命令n输入命令p输入命令e插入一行文字删除一行内容切换活区显示活区结束程序fflush(stdin);fgets(p-string,80,stdin);/*输入插入行的内容*/p1=head-next;if(head-length==ActiveMaxLen)fputs(p1-string,out);else{if(hang==1){p-next=head-next;head-next=p;head-length++;}else{for(i=2;ihang;i++)p1=p1-next;p-next=p1-next;p1-next=p;head-length++;}}printf(在第%d行前插入完成\n,hang);returnOK;}3、行删除intdel(textp&head)//删除d命令对应的函数,用来删max-min中的行,用结构体中的flat表示是否被删除{text*p,*q;intmin,max,i;scanf(%d%d,&min,&max);if(head==NULL){printf(\nlistnull!\n);returnOK;}p=head;for(i=1;imin;i++)/*找到要删除的第一行的前一行*/p=p-next;for(i=i-1,q=p-next;imax;i++)/*删除到最后一行*/{p-next=q-next;free(q);q=p-next;}head-length--;printf(第%d行到第%d行删除完成!\n,min,max);returnOK;}4、活区切换StatusLoadFile(textphead,FILE*fp)/*从文件读内容到活区*/{textpp;for(p=head;p&&(!feof(fp));p=p-next){if(!fgets(p-string,80,fp))break;p-flat=1;}return0;}StatusSaveFile(textphead,FILE*out)/*存储活区的函数*/{textpp;for(p=head;p;p=p-next)if(p-flat==1){fputs(p-string,out);/*输出活区的内容到指定的文件*/p-flat=0;}returnOK;}5、活区显示voiddisplay(textphead)//显示P命令对应的函数,用来显示活区的内容{inti;intj=head-length/20;intk=0;textpp=head-next;for(j=0;j=head-length/20;j++){printf(**********************page%d************************\n,j+1);for(i=20*j+1;i=head-length;p=p-next,i++){printf(%2d,i);printf(%s,p-string);if(i%20==0)break;}printf(是否继续显示下一页,是输入1,否输入0.\n);scanf(%d,&k);if(k==0)break;if(j==head-length/20-1){printf(没有后续页面了\n);break;}}}四、测试分析1.开始界面2.用户输入一个已经存在的文本文件名称——in.txt并回车,程序将读出内容并存入一个新的文本文件——out中。并输入命令p,显示。3.输入命令i,在文本文件中插入文本。4.输入命令d,删除选中文本。并输入命令p,显示当前活区。5.输入命令n,切换活区。并输入命令平,显示。6.输入命令e,结束程序并清除活区。五、源程序设计#includestring.h#includestdio.h#includestdlib.h#includeio.h#includeprocess.h#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1#defineOVERFLOW-2#defineActiveMaxLen100#defineSIZE80#definex20typedefstructtext{charstring[SIZE];//存储每一行的元素structtext*next;//指向后一个节点的指针intlength;}text,*textp;voidCreatelist(textp&head)//建立一个80个节点的链表,是整个活区的大小{head=(text*)malloc(sizeof(text));intn=0;head-length=0;textpp,q;while(n80){p=(text*)malloc(sizeof(text));n++;if(n==1){head-next=p;p-next=NULL;q=p;head-length++;}else{p-next=q-next;q-next=p;q=p;head-length++;}}printf(活区创建完成\n);}intdel(textp&head)//删除d命令对应的函数,用来删max-min中的行,用结构体中的flat表示是否被删除{text*p,*q;intmin,max,i;scanf(%d%d,&min,&max);if(head==NULL){printf(\nlistnull!\n);returnOK;}p=head;for(i=1;imin;i++)/*找到要删除的第一行的前一行*/p=p-next;for(i=i-1,q=p-next;imax;i++)/*删除到最后一行*/{p-next=q-next;free(q);q=p-next;}head-length--;printf(第%d行到第%d行删除完成!\n,min,max);returnOK;}voiddisplay(textphead)//显示P命令对应的函数,用来显示活区的内容{inti;intj=head-length/20;intk=0;textpp=head-next;for(j=0;j=head-length/20;j++){printf(**********************page%d************************\n,j+1);for(i=20*j+1;i=head-length;p=p-next,i++){printf(%2d,i);printf(%s,p-string);if(i%20==0)break;}printf(是否继续显示下一页,是输入1,否输入0.\n);scanf(%d,&k);if(k==0)break;if(j==head-length/20-1){printf(没有后续页面了\n);break;}}}voidfreemem(textp&head)//释放链表所占的内存{text*p=head-next;while(p){head-next=p-next;free(p);p=head-next;head-length--;}printf(活区清除\n);}intinsert(textp&head,FILE*out){inthang,i;textpp,p1;scanf(%d,&hang);p=(textp)malloc(sizeof(text));//为插入行分配空间fflush(stdin);fgets(p-string,80,stdin);/*输入插入行的内容*/p1=head-next;if(head-length==ActiveMaxLen)fputs(p1-string,out);else{if(hang==1){p-next=head-next;head-next=p;head-length++;}else{for(i=2;ihang;i++)p1=p1-next;p-next=p1-next;p1-next=p;head-length++;}}printf(在第%d行前插入完成\n,hang);returnOK;}voidLoadFile(textp&head,FILE*fp,inte)/*从文件读内容到活区*/{textpp=head-next;for(intj=0;je;j++)fgets(head-string,81,fp);for(inti=0;ihead-length&&(!feof(fp));i++){fgets(p-string,81,fp);p=p-next;}}voidSaveFile(textphead,FILE*out,FILE*in,int&e)/*存储活区的函数*/{textpp=head-next;e=e+80;for(inti=0;ihead-length;p=p-next,i++)fputs(p-string,out);}voidHELP()//帮助函数,显示一些命令的格式{printf(\n\t**********************************************************\n);printf(\t***行插入格式:i行号回车文本回车**\n);printf(\t***行删除格式:d回车行号1[空格行号2]回车**\n);printf(\t***活区
本文标题:简单行编辑程序
链接地址:https://www.777doc.com/doc-4031370 .html