简单行编辑程序题目:简单行编辑程序班级:计算机科学与技术(非师范)姓名:学号:完成日期:2010-6-251.需求分析以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?并明确规定:文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。(1)输入的形式和输入值的范围;无范围(2)输出的形式;字符串(3)程序所能达到的功能;实现以下4条基本编辑命令:(1)行插入。格式:i行号回车文本回车将文本插入活区中第行号行之后(2)行删除。格式:d行号1[□行号2]回车删除活区中第行号1行(到第行号2行)。两种格式的例子是:“d10↙”和“d10□14↙”(3)活区切换。格式:n回车将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。(4)活区显示。格式:p回车(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。2.概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。typedefstructtext{charstring[80];//存储每一行的元素structtext*next;//指向后一个节点的指针structtext*pre;//指向前一个节点的指针intnum;//每一行元素的长度intflat;//确定此行是否被删除的标志}text;FILE*fp,*out;//fp是执行被打开的文件,out指向被写入的文件text*head;//链表的头指针intn=0,sum,delnum,xiugai=0,page=0;//file://修改用来指示文件是否被修改过,如果修改过才回存盘。page用来计算显示的//file://页数.delnum用来存储被删除的字节数,sum存储一页的总字节数3.详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数和过程的调用关系图。cmd=getchar();printf(\n请输入命令(按E键退出):);cmd=getchar();switch(cmd){case'e':case'E':if(xiugai==1)saveall();freemem();if(fp)fclose(fp);if(out)fclose(out);system(cls);return0;case'o':case'O':Openfiles();break;case'p':case'P':Createlist();display();break;case'n':case'N':saveanddisplay(10);break;case'd':case'D':del();break;case'i':case'I':insert();break;default:printf(\n\n\n!!!输入错误!!!);4.调试分析当我调试程序时发现前面的子程序调用后面的子程序竟然是错误的,明明已经定义了的子程序竟然没有定义这令我大为不解不过后来当我把被调用的程序放到前面,程序就顺利运行了。5.用户使用说明说明如何使用你编写的程序,详细列出每一步的操作步骤。当你使用这个程序时,会出现一个简单的提示界面,你可以选择相应的help选项,来看操作说明。6.测试结果列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。7.附录带注释的源程序。如果提交源程序软盘,可以只列出程序文件名的清单。#defineNULL0#defineOK0#includeiostream#includestdio.h#includestdlib.h#includestring.h#includectype.h#includeconio.htypedefstructtext{charstring[80];//存储每一行的元素structtext*next;//指向后一个节点的指针structtext*pre;//指向前一个节点的指针intnum;//每一行元素的长度intflat;//确定此行是否被删除的标志}text;FILE*fp,*out;//fp是执行被打开的文件,out指向被写入的文件text*head;//链表的头指针intn=0,sum,delnum,xiugai=0,page=0;//file://修改用来指示文件是否被修改过,如果修改过才回存盘。page用来计算显示的//file://页数.delnum用来存储被删除的字节数,sum存储一页的总字节数voidbyebye()//没有具体用处,只是写着玩的,在屏幕上显示一个bye{puts(\t\t\t******************);puts(\t\t\t*****);puts(\t\t\t*****);puts(\t\t\t*****);puts(\t\t\t*****************);puts(\t\t\t****);puts(\t\t\t****);puts(\t\t\t****);puts(\t\t\t*****************);}voidHELP()//帮助函数,显示一些命令的格式{printf(\n\t**********************************************************\n);printf(\t**打开文件:o行号文件名回车**\n);printf(\t**行插入格式:i行号回车文本回车**\n);printf(\t**行删除格式:d行号1[空格行号2]回车**\n);printf(\t**活区切换格式:n回车**\n);printf(\t**活区显示格式:p回车**\n);printf(\t**注意:在执行所有命令前必须先用o命令打开文件,并**\n);printf(\t**用p命令显示出来!!!**\n);printf(\t**********************************************************\n);system(pause);printf(\n\n\n);}voidABOUT()//也是写着玩的{printf(\n\t\t*****************************************\n);printf(\t\t**welcometotheprogram**\n);printf(\t\t**allworkandnoplaymakejackadullboy**\n);printf(\t\t**enjoyyourwork**\n);printf(\t\t*****************************************\n);system(pause);system(cls);printf(\n\n\n);}voidCreatelist()//建立一个十个节点的链表,是文本中的一页{text*p1,*p2;p1=p2=(text*)malloc(sizeof(text));head=NULL;while(n10){n=n+1;if(n==1)head=p1;else{p2-next=p1;p1-pre=p2;p1-flat=0;}p2=p1;p1=(text*)malloc(sizeof(text));}p2-next=NULL;}voidfreemem()//释放链表所占的内存{text*p;for(p=head;head!=NULL;){head=p-next;free(p);p=head;}}intOpenfiles()//打开文件的函数{charname[30],outname[30];puts(请输入要打开的文件名:);scanf(%s,name);if((fp=fopen(name,r+))==NULL){printf(打不开原文件!\n);exit(0);}puts(请输入要写入的文件名:);scanf(%s,outname);if((out=fopen(outname,w+))==NULL){printf(打不开目标文件!\n);exit(0);}return0;}intdisplay()//从文件中读入到链表中,并显示出来{inti;charconti='y';text*p;while((!feof(fp))&&(conti=='y'||conti=='Y')){page++;printf(\t\t第%d页\n,page);for(i=0,p=head,sum=0;(i10)&&(!feof(fp));i++,p=p-next){fgets(p-string,sizeof(p-string),fp);puts(p-string);p-flat=1;p-num=strlen(p-string);sum=sum+p-num;}puts(Continue?(Y/N):);conti=getche();if(feof(fp)){puts(\n文件已经结束!);return0;}}return0;}intsaveanddisplay(inthang)//命令n执行的函数,用来将活区的内容显示并读入下一页内容{inti,endflat=0;charconti='y';text*p=NULL;page++;for(i=0,p=head;ihang;i++,p=p-next)//file://将活区写入文件if(p-flat==1){fputs(p-string,out);p-flat=0;}if(!feof(fp))printf(\t\t第%d页\n,page);for(i=0,p=head,sum=0;(i10)&&(!feof(fp));i++,p=p-next)//从文件读入活区if(fgets(p-string,sizeof(p-string),fp)){puts(p-string);p-flat=1;p-num=strlen(p-string);sum=sum+p-num;}if(feof(fp))printf(文件已经结束!);return0;}intsaveall()//退出编辑函数后执行的函数,将所有的内容存盘{inti,endflat=0;charconti='y';text*p;for(i=0,p=head;i10;i++,p=p-next)//file://将活区写入文件if(p-flat==1){fputs(p-string,out);p-flat=0;}while(!feof(fp))//将其余的内容写入文件fputc(fgetc(fp),out);return0;}intdel()//删除d命令对应的函数,用来删min-max中的行,用结构体中的flat表示是否被删除{text*p1,*p2,*p3;intmin,max,i;xiugai=1;scanf(%d%d,&min,&max);if(head==NULL){printf(\nlistnull!\n);return0;}p1=p2=head;for(i=0;imin-1;i++)/*找到要删除的第一行*/p1=p1-next;for(i=0;imax;i++)/*找到要删除的最后一行*/p2=p2-next;for(delnum=0;p1!=p2;p1=p1-next)/*删除中间的节点,将flat赋值0*/{p1-flat=0;delnum=delnum+p1-num;}for(i=0,p3=head;i10;i++,p3=p3-next)//显示删除后的结果if(p3-