简单行编辑程序.docx

上传人:b****2 文档编号:1959959 上传时间:2022-10-25 格式:DOCX 页数:19 大小:295.25KB
下载 相关 举报
简单行编辑程序.docx_第1页
第1页 / 共19页
简单行编辑程序.docx_第2页
第2页 / 共19页
简单行编辑程序.docx_第3页
第3页 / 共19页
简单行编辑程序.docx_第4页
第4页 / 共19页
简单行编辑程序.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

简单行编辑程序.docx

《简单行编辑程序.docx》由会员分享,可在线阅读,更多相关《简单行编辑程序.docx(19页珍藏版)》请在冰豆网上搜索。

简单行编辑程序.docx

简单行编辑程序

数据结构程序设计

实验报告

 

院系:

计算机科学与技术学院

专业:

软件工程1班

姓名:

***

学号:

E********

日期:

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"

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1