简单行编辑程序.docx
- 文档编号:25497783
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:22
- 大小:296.90KB
简单行编辑程序.docx
《简单行编辑程序.docx》由会员分享,可在线阅读,更多相关《简单行编辑程序.docx(22页珍藏版)》请在冰豆网上搜索。
简单行编辑程序
数据结构程序设计
实验报告
简
单
行
编
辑
程
序
院系:
计算机科学与技术学院
专业:
软件工程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));//为插入行分配空间
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 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;i p=p->next; for(i=i-1,q=p->next;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,结束程序并清除活区。 五、源程序设计 #include #include #include #include #include #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW-2 #defineActiveMaxLen100 #defineSIZE80 #definex20 typedefstructtext { charstring[SIZE];//存储每一行的元素 structtext*next;//指向后一个节点的指针 intlength; }text,*textp; voidCreatelist(textp&head)//建立一个80个节点的链表,是整个活区的大小 { head=(text*)malloc(sizeof(text)); intn=0; head->length=0; textpp,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"); } 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;i p=p->next; for(i=i-1,q=p->next;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;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;j fgets(head->string,81,fp); for(inti=0;i 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;i fputs(p->string,out); } voidHELP()//帮助函数,显示一些命令的格式 { 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"); } voidmain()//主函数,用来接受命令 //编辑函数,用来接受处理编辑命令 { inte=0; textphead; FILE*in,*out; charc,inname[30],outname[30]; printf("################################欢迎使用行编辑程序#############################\n"); HELP(); /*打开输入、输出文件*/ printf("Entertheinfilename: "); scanf("%s",inname); printf("Entertheoutfilename: "); scanf("%s",outname); if((in=fopen("in.txt","r"))==NULL) printf("can'topenthefile! \n"); if((out=fopen(outname,"w"))==NULL) { printf("can'tiiopenthefile! \n"); exit(0); } Createlist(head); LoadFile(head,in,e); do { printf("inputorder: "); 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! ! ! inputerror! ! ! ");break;/*命令格式非法提示*/ } }while(c! ='e'); freemem(head); } 六、用户手册 (1)进入程序的界面,出现命令的帮助信息,按任意键开始程序编辑。 (2)输入INPUT文件与OUTPUT文件的名字打开相应的文件。 (3)输入P命令显示活区的内容。 (4)其它的命令操作如下: 行插入格式: i<行号><回车><文本><回车> 行删除格式: d<回车><行号1>[<空格><行号2>]<回车> 活区切换格式: n<回车> (5)最后输入e命令退出程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 编辑 程序