当前位置:文档之家› 简单行编辑程序

简单行编辑程序

数据结构程序设计实验报告简单行编辑程序院系:计算机科学与技术学院专业:软件工程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、存储结构设计typedef struct text{char string[SIZE];//存储每一行的元素struct text *next;//指向后一个节点的指针int length;}text,*textp;3、系统功能设计1)行插入2)行删除3)活区切换4)活区显示5)结束4、程序调用关系程序结构流程图:三、详细设计1 、数据结构存储定义typedef struct text{char string[SIZE];//存储每一行的元素struct text *next;//指向后一个节点的指针 int length;}text,*textp;2、行插入int insert(textp &head,FILE *out){int hang,i;textp p,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;i<hang;i++)p1=p1->next;p->next=p1->next;p1->next=p;head->length++;}}printf("在第%d行前插入完成\n",hang);return OK;}3、行删除int del(textp &head) //删除d命令对应的函数,用来删max-min中的行,用结构体中的flat表示是否被删除{text *p,*q;int min,max,i;scanf("%d %d",&min,&max);if(head==NULL){printf("\nlist null!\n");return OK;}p=head;for(i=1;i<min;i++)/*找到要删除的第一行的前一行*/p=p->next;for(i=i-1,q=p->next;i<max;i++)/*删除到最后一行*/{p->next=q->next;free(q);q=p->next;}head->length--;printf("第%d行到第%d行删除完成!\n",min,max);return OK;}4、活区切换Status LoadFile(textp head,FILE *fp) /*从文件读内容到活区*/{textp p;for(p=head;p&&(!feof(fp));p=p->next){if(!fgets(p->string,80,fp)) break;p->flat=1;}return 0;}Status SaveFile(textp head,FILE *out) /*存储活区的函数*/{textp p;for(p=head;p;p=p->next)if(p->flat==1){fputs(p->string,out); /*输出活区的内容到指定的文件*/p->flat=0;}return OK;}5、活区显示void display(textp head)//显示P命令对应的函数,用来显示活区的内容{int i;int j=head->length/20;int k=0;textp p=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,结束程序并清除活区。

五、源程序设计#include<string.h>#include<stdio.h>#include<stdlib.h>#include<io.h>#include<process.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define ActiveMaxLen 100#define SIZE 80#define x 20typedef struct text{char string[SIZE];//存储每一行的元素struct text *next;//指向后一个节点的指针int length;}text,*textp;void Createlist(textp &head)//建立一个80个节点的链表,是整个活区的大小{head=(text *)malloc(sizeof(text));int n=0;head->length=0;textp p,q;while(n<80){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");}int del(textp &head)//删除d命令对应的函数,用来删max-min中的行,用结构体中的flat表示是否被删除{text *p,*q;int min,max,i;scanf("%d %d",&min,&max);if(head==NULL){printf("\nlist null!\n");return OK;}p=head;for(i=1;i<min;i++)/*找到要删除的第一行的前一行*/p=p->next;for(i=i-1,q=p->next;i<max;i++)/*删除到最后一行*/{p->next=q->next;free(q);q=p->next;}head->length--;printf("第%d行到第%d行删除完成!\n",min,max);return OK;}void display(textp head)//显示P命令对应的函数,用来显示活区的内容{int i;int j=head->length/20;int k=0;textp p=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;}}}void freemem(textp &head)//释放链表所占的内存{text *p=head->next;while(p){head->next=p->next;free(p);p=head->next;head->length--;}printf("活区清除\n");}int insert(textp &head,FILE *out){int hang,i;textp p,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;i<hang;i++)p1=p1->next;p->next=p1->next;p1->next=p;head->length++;}}printf("在第%d行前插入完成\n",hang);return OK;void LoadFile(textp &head,FILE *fp,int e) /*从文件读内容到活区*/{textp p=head->next;for(int j=0;j<e;j++)fgets(head->string,81,fp);for(int i=0;i<head->length&&(!feof(fp));i++){fgets(p->string,81,fp);p=p->next;}}void SaveFile(textp head,FILE *out,FILE *in,int &e) /*存储活区的函数*/{textp p=head->next;e=e+80;for(int i=0;i<head->length;p=p->next,i++)fputs(p->string,out);}void HELP()//帮助函数,显示一些命令的格式{printf("\n\t**********************************************************\n");printf("\t *** 行插入格式: i<行号><回车><文本><回车> **\n");printf("\t *** 行删除格式: d<回车><行号1>[<空格><行号2>]<回车> **\n");printf("\t *** 活区切换格式: n<回车> **\n");printf("\t *** 活区显示格式: p<回车> **\n");printf("\t *** 退出格式: e<回车> **\n");printf("\t**********************************************************\n");}void main()//主函数,用来接受命令//编辑函数,用来接受处理编辑命令{int e=0;textp head;FILE *in,*out;char c,inname[30],outname[30];printf("################################欢迎使用行编辑程序#############################\n");HELP();/*打开输入、输出文件*/printf("Enter the infile name:");scanf("%s",inname);printf("Enter the outfile name:");scanf("%s",outname);if((in=fopen("in.txt","r"))==NULL)printf("can't open the file! \n");if((out=fopen(outname,"w"))==NULL){printf("can't iiopen the file!\n");exit(0);}Createlist(head);LoadFile(head,in,e);do{printf("input order:");fflush(stdin);c=getchar();switch(c){case 'p':display(head);break;case 'n':SaveFile(head,out,in,e);LoadFile(head,in,e);printf("活区切换...\n完成\n");break;case 'd':del(head);break;case 'i': /*插入行*/insert(head,in);break;case'e':printf("结束!\n");break;default:printf("\n\n\n!!!input error!!!"); break; /*命令格式非法提示*/}}while(c!='e');freemem(head);}六、用户手册(1)进入程序的界面,出现命令的帮助信息,按任意键开始程序编辑。

相关主题