2022年2022年简单行编辑程序 .pdf
数据结构程序设计实验报告简单行编辑程序院 系 : 计 算 机科 学 与 技术 学 院专 业: 软 件工 程 1班姓 名 :丁 珊 珊学号 : E01214269日期 : 2014/9/19名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - 一 、 需 求 分 析1、问 题 描 述: 文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。被编辑的文本文件可能很大,全部读入编辑程序的数据空间 (内存)的做法即不经济,又不总能实现。一种解决方法是逐段的编辑。任何时刻只把待编辑文件的一段放在内存,称为活区。试按这种方法实现一个简单的行编辑程序, 设文件每行不超过320个字符,很少超过 80 个字符。2、此程 序 具备 以 下 功能 :(1) 行插入。 格式:i. 将插入活区中第 行之后。(2) 行删除。 格式:d;删除活区中第 行(到第 行) 。(3) 活区切换。 格式: n 将活区写入输出文件, 并从输入文件中读入下一段,作为新的活区。(4) 活区显示。 格式: p 逐页地(每页20 行)显示活区内容,在每显示的一页之后请用户决定是否继续显示以后各页(如果存在)。印出的每一行要前置行号和一个空格符,行号固定占4 位,增量为 1。各条命令中的行号均须在活区中各行号范围之内,只有插入命令名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 的行号可以等于活区第一行行号减一,表示插入当前的屏幕中第一行之前,否则命令参数非法。二、概要设计1、主页面设计2、存储结构设计typedef struct text char stringSIZE;/存储每一行的元素struct text *next;/指向后一个节点的指针int length; text,*textp;3、系统功能设计1)行插入名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - 2)行删除3)活区切换4)活区显示5)结束4、程序调用关系程序结构流程图:三 、详 细 设 计1 、 数据结构存储定义typedef struct text char stringSIZE;/存储每一行的元素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);/为插入行分配空间开始输入命令i 输入命令 d 输入命令n 输入命令p 输入命令e 插入一行文字删除一行内容切换活区显示活区结束程序名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - 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;inext; p-next=p1-next; p1-next=p; head-length+; printf( 在第%d 行前插入完成 n,hang); return OK; 3、行删除int del(textp &head) /删除 d 命令对应的函数, 用来删 maxmin 中的行,用结构体中的 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;inext; for(i=i-1,q=p-next;inext=q-next; free(q); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - 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;jlength/20;j+) printf(*page%d*n,j+1); for(i=20*j+1;ilength;p=p-next,i+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 17 页 - - - - - - - - - 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.开始界面名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - 2.用户输入一个已经存在的文本文件名称in.txt 并回车,程序将读出内容并存入一个新的文本文件out 中。并输入命令 p,显示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 17 页 - - - - - - - - - 3.输入命令 i,在文本文件中插入文本。4.输入命令 d, 删除选中文本。并输入命令 p, 显示当前活区。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 17 页 - - - - - - - - - 5.输入命令 n,切换活区。并输入命令平,显示。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 17 页 - - - - - - - - - 6.输入命令 e,结束程序并清除活区。五 、源 程 序 设 计#include #include #include #include #include #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 20 typedef struct text char stringSIZE;/存储每一行的元素struct text *next;/指向后一个节点的指针int length; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 17 页 - - - - - - - - - text,*textp; void Createlist(textp &head)/建立一个 80个节点的链表,是整个活区的大小 head=(text *)malloc(sizeof(text); int n=0; head-length=0; textp p,q; while(nnext=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 命令对应的函数,用来删maxmin 中的行,用结构体中的 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;inext; for(i=i-1,q=p-next;inext=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;jlength/20;j+) printf(*page%d*n,j+1); for(i=20*j+1;ilength;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)/释放链表所占的内存名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 17 页 - - - - - - - - - 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;inext; p-next=p1-next; p1-next=p; head-length+; printf( 在第%d 行前插入完成 n,hang); return OK; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 17 页 - - - - - - - - - void LoadFile(textp &head,FILE *fp,int e) /* 从文件读内容到活区 */ textp p=head-next; for(int j=0;jstring,81,fp); for(int i=0;ilength&(!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;ilength;p=p-next,i+) fputs(p-string,out); void HELP()/ 帮助函数,显示一些命令的格式 printf(nt *n); printf(t * 行插入格式:i *n); printf(t * 行删除格式:d *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,inname30,outname30; printf(#欢 迎 使 用 行 编 辑 程 序#n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 17 页 - - - - - - - - - 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(cant open the file! n); if(out=fopen(outname,w)=NULL) printf(cant 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; casee:printf(结束! n);break; default:printf(nnn!input error!); break; /*命令格式非法提示 */ while(c!=e); freemem(head); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 17 页 - - - - - - - - - 六 、用 户 手 册(1)进入程序的界面,出现命令的帮助信息,按任意键开始程序编辑。(2) 输入 INPUT 文件与 OUTPUT 文件的名字打开相应的文件。(3)输入 P命令显示活区的内容。(4)其它的命令操作如下:行插入格式:i 行删除格式:d 活区切换格式:n (5)最后输入 e命令退出程序。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 17 页 - - - - - - - - -