简单行编辑程序实验报告材料.docx
- 文档编号:11393252
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:26
- 大小:36.78KB
简单行编辑程序实验报告材料.docx
《简单行编辑程序实验报告材料.docx》由会员分享,可在线阅读,更多相关《简单行编辑程序实验报告材料.docx(26页珍藏版)》请在冰豆网上搜索。
简单行编辑程序实验报告材料
简单行编辑程序课程设计
1.设计要求
1.问题描述
文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。
限制这些操作以行为单位进行的编辑程序称为行编辑程序。
被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法即不经济,又不总能实现。
一种解决方法是逐段的编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
试按这种方法实现一个简单的行编辑程序,设文件每行不超过320个字符,很少超过80个字符。
2.需求分析
该程序要实现以下4条基本的编辑命令:
(1)行插入。
格式:
i<行号><回车><文本>.<回车>
将<文本>插入活区中第<行号>行之后。
(2)行删除。
格式:
d<行号1>[<空格><行号2>.]<回车>例如
删除活区中第<行号1>行(到第<行号2>行)。
(3)活区切换。
格式:
n<回车>
将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。
(4)活区显示。
格式:
p<回车>;逐页地(每页20行)显示活区内容,在每显示的一页之后请用户决定是否继续显示以后各页(如果存在)。
印出的每一行要前置行号和一个空格符,行号固定占4位,增量为1。
各条命令中的行号均须在活区中各行号范围之内,只有插入命令的行号可以等于活区第一行行号减一,表示插入当前的屏幕中第一行之前,否则命令参数非法。
2.概要设计
1.主界面设计
为了实现简单行编辑程序,设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能。
主控菜单运行如下:
2.存储结构设计
该系统采用串的顺序存储结构。
3.系统功能设计
(1)行插入
(2)行删除
(3)文本显示
(4)保存文件
(5)读取文件
(6)退出系统
3.模块设计
1.模块设计
本程序包含主程序模块、菜单选择模块和串操作模块。
调用关系如下
菜单选择模块
串操作模块
主程序模块
2.系统子程序及功能设计
(1)enter(intlinenum)//行插入
(2)voiddelete_text()//行删除
(3)voidlist()//文本显示
(4)voidsave(char*fname)//保存文件
(5)voidload(char*fname)//读取文件
4.详细设计
1.数据结构设计
ADTline{
基本操作:
enter(linenum)
初始条件:
有内存。
操作结果:
linenum+1.
delete_text()
初始条件:
line存在。
操作结果:
若删除的最后一行,则直接删除。
若删除中间一行,则后面的linenum-1。
Load()
初始条件:
存在文件file
操作结果:
打开文件。
}ADTline
2.系统主要子程序详细设计
(1)主程序模块设计
voidmain(intargc,char*argv[])
{
chars[80],choice,fname[80];
intlinenum=1;
start=NULL;
last=NULL;
if(argc==2)load(argv[1]);
do{
choice=menu_select();
switch(choice)
{
case1:
printf("行号:
");
gets(s);
linenum=atoi(s);
enter(linenum);
break;
case2:
delete_text();
break;
case3:
list();
break;
case4:
printf("\t文件名:
");
gets(fname);
save(fname);
break;
case5:
printf("\t文件名:
");
gets(fname);
load(fname);
break;
case6:
exit(0);
}
}while
(1);
}
menu_select()
{
chars[80];
intc;
printf("\t********************欢迎使用简单行编辑程序********************\n");
printf("\t\t\t\t1.行插入\n");
printf("\t\t\t\t2.行删除\n");
printf("\t\t\t\t3.文本显示\n");
printf("\t\t\t\t4.保存文件\n");
printf("\t\t\t\t5.读取文件\n");
printf("\t\t\t\t6.退出\n");
printf("\t**************************************************************\n");
do{
printf("\n\n\t\t请选择:
");
gets(s);
c=atoi(s);
}while(c<0||c>6);
return(c);
}
(2)主要工作函数
/*将文本插在指定行端部*/
enter(intlinenum)
{
structline*info;
for(;;)
{
info=(structline*)malloc(sizeof(structline));
if(!
info)
{
printf("\t!
内存不够!
\n");
return(NULL);
}
printf("%d:
",linenum);
gets(info->text);
info->num=linenum;
if(*info->text)
{
if(find(linenum))patchup(linenum,1);
if(*info->text)start=dls_store(info);
}
elsebreak;
linenum++;
}
return(linenum);
}
/*当文本内容插在文件中间时其下面的内容的行号必须增加1,而删除时,被删除的文本后面的行号必须减1*/
voidpatchup(intn,intincr)
{
structline*i;
i=find(n);
while(i){
i->num=i->num+incr;
i=i->next;
}
}
/*按行号排序后插入*/
structline*dls_store(structline*i)
{
structline*old,*p;
if(last==NULL)
{
i->next=NULL;
i->prior=NULL;
last=i;
return(i);
}
p=start;
old=NULL;
while(p)
{
if(p->num)
{
old=p;
p=p->next;
}
else
{
if(p->prior)
{
p->prior->next=i;
i->next=p;
p->prior=i;
returnstart;
}
i->next=p;
i->prior=NULL;
p->prior=i;
return(i);
}
}
old->next=i;
i->next=NULL;
i->prior=old;
last=i;
returnstart;
}
/*删除一行*/
voiddelete_text()
{
structline*info;
chars[80];
intlinenum;
printf("行号:
");
gets(s);
linenum=atoi(s);
info=find(linenum);
if(info)
{
if(start==info)
{
start=info->next;
if(start)start->prior=NULL;
elselast=NULL;
}
else
{
info->prior->next=info->next;
if(info!
=last)
info->next->prior=info->prior;
elselast=info->prior;
}
free(info);
patchup(linenum+1,-1);
}
}
/*查找一行文本*/
structline*find(intlinenum)
{
structline*info;
info=start;
while(info)
{
if(linenum==info->num)return(info);
info=info->next;
}
return(NULL);
}
/*显示文本*/
voidlist()
{
structline*info;
info=start;
while(info)
{
printf("%d:
%s\n",info->num,info->text);
info=info->next;
}
printf("\n\n");
}
/*存文件*/
voidsave(char*fname)
{
structline*info;
char*p;
FILE*fp;
if((fp=fopen(fname,"w"))==NULL)
{
printf("\tCan'topenthefile!
\n");
exit(0);
}
printf("\tSaved:
\n");
info=start;
while(info)
{
p=info->text;
while(*p)putc(*p++,fp);
putc('\n',fp);
info=info->next;
}
fclose(fp);
}
/*读取文件*/
voidload(char*fname)
{
structline*info,*temp;
char*p;
FILE*fp;
intsize,inct;
if((fp=fopen(fname,"r+"))==NULL)
{
printf("\tCan'topenthefile!
\n");
exit(0);
}
while(start)
{
temp=start;
start=start->next;
free(temp);
}
printf("\n\tReading...\n");
size=sizeof(structline);
start=(structline*)malloc(size);
if(!
start)
{
printf("\n\t内存已经用完!
");
return;
}
info=start;
p=info->text;
inct=1;
while((*p=getc(fp))!
=EOF)
{
p++;
while((*p=getc(fp))!
='\n')p++;
*p='\0';
info->num=inct++;
info->next=(structline*)malloc(size);
if(!
info->next)
{
printf("\n\t内存已经用完!
");
return;
}
info->prior=temp;
temp=info;
info=info->next;
p=info->text;
}
temp->next=NULL;
last=temp;
free(info);
start->prior=NULL;
fclose(fp);
}
5.测试分析
1.主菜单
2.行插入
3.行删除及文本显示
4.保存及读取文件
5.退出
主菜单下输入5并回车即退出“简单行编辑程序”。
6.源程序清单
#include
#include
#include
structline{
chartext[81];
intnum;/*行号*/
structline*next;/*指向下一个输入项目的指针*/
structline*prior;/*指向前一个项目的指针*/
};
structline*start;/*指向表中第一个项目的指针*/
structline*last;/*指向表中最后一个项目的指针*/
structline*find(int),*dls_store(structline*);
voidpatchup(int,int),delete_text(),list(),save(char*),load(char*);
menu_select();
enter(intlinenum);
voidmain(intargc,char*argv[])
{
chars[80],choice,fname[80];
intlinenum=1;
start=NULL;
last=NULL;
if(argc==2)load(argv[1]);/*读取命令行上的文件*/
do{
choice=menu_select();
switch(choice)
{
case1:
printf("行号:
");
gets(s);
linenum=atoi(s);
enter(linenum);
break;
case2:
delete_text();
break;
case3:
list();
break;
case4:
printf("\t文件名:
");
gets(fname);
save(fname);
break;
case5:
printf("\t文件名:
");
gets(fname);
load(fname);
break;
case6:
exit(0);
}
}while
(1);
}
/*显示菜单,供用户选择*/
menu_select()
{
chars[80];
intc;
printf("\t********************欢迎使用简单行编辑程序********************\n");
printf("\t\t\t\t1.行插入\n");
printf("\t\t\t\t2.行删除\n");
printf("\t\t\t\t3.文本显示\n");
printf("\t\t\t\t4.保存文件\n");
printf("\t\t\t\t5.读取文件\n");
printf("\t\t\t\t6.退出\n");
printf("\t**************************************************************\n");
do{
printf("\n\n\t\t请选择:
");
gets(s);
c=atoi(s);
}while(c<0||c>6);
return(c);
}
/*将文本插在指定行端部*/
enter(intlinenum)
{
structline*info;
for(;;)
{
info=(structline*)malloc(sizeof(structline));
if(!
info)
{
printf("\t!
内存不够!
\n");
return(NULL);
}
printf("%d:
",linenum);
gets(info->text);
info->num=linenum;
if(*info->text)
{
if(find(linenum))patchup(linenum,1);
if(*info->text)start=dls_store(info);
}
elsebreak;
linenum++;
}
return(linenum);
}
/*当文本内容插在文件中间时其下面的内容的行号必须增加1,而删除时,被删除的文本后面的行号必须减1*/
voidpatchup(intn,intincr)
{
structline*i;
i=find(n);
while(i){
i->num=i->num+incr;
i=i->next;
}
}
/*按行号排序后插入*/
structline*dls_store(structline*i)
{
structline*old,*p;
if(last==NULL)
{
i->next=NULL;
i->prior=NULL;
last=i;
return(i);
}
p=start;
old=NULL;
while(p)
{
if(p->num)
{
old=p;
p=p->next;
}
else
{
if(p->prior)
{
p->prior->next=i;
i->next=p;
p->prior=i;
returnstart;
}
i->next=p;
i->prior=NULL;
p->prior=i;
return(i);
}
}
old->next=i;
i->next=NULL;
i->prior=old;
last=i;
returnstart;
}
/*删除一行*/
voiddelete_text()
{
structline*info;
chars[80];
intlinenum;
printf("行号:
");
gets(s);
linenum=atoi(s);
info=find(linenum);
if(info)
{
if(start==info)
{
start=info->next;
if(start)start->prior=NULL;
elselast=NULL;
}
else
{
info->prior->next=info->next;
if(info!
=last)
info->next->prior=info->prior;
elselast=info->prior;
}
free(info);
patchup(linenum+1,-1);
}
}
/*查找一行文本*/
structline*find(intlinenum)
{
structline*info;
info=start;
while(info)
{
if(linenum==info->num)return(info);
info=info->next;
}
return(NULL);
}
/*显示文本*/
voidlist()
{
structline*info;
info=start;
while(info)
{
printf("%d:
%s\n",info->num,info->text);
info=info->next;
}
printf("\n\n");
}
/*存文件*/
voidsave(char*fname)
{
structline*info;
char*p;
FILE*fp;
if((fp=fopen(fname,"w"))==NULL)
{
printf("\tCan'topenthefile!
\n");
exit(0);
}
printf("\tSaved:
\n");
info=start;
while(info)
{
p=info->text;
while(*p)putc(*p++,fp);
putc('\n',fp);
info=info->next;
}
fclose(fp);
}
/*读取文件*/
voidload(char*fname)
{
structline*info,*temp;
char*p;
FILE*fp;
intsize,inct;
if((fp=fopen(fname,"r+"))==NULL)
{
printf("\tCan'topenthefile!
\n");
exit(0);
}
while(start)
{
temp=start;
start=start->next;
free(temp);
}
printf("\n\tReading...\n");
size=sizeof(structline);
start=(structline*)malloc(size);
if(!
start)
{
printf("\n\t内存已经用完!
");
return;
}
info=start;
p=info->text;
inct=1;
while((*p=getc(fp))!
=EOF)
{
p++;
while((*p=getc(fp))!
='\n')p++;
*p='\0';
info->num=inct++;
info->next=(structline*)malloc(size);
if(!
info->next)
{
printf("\n\t内存已经用完!
");
return;
}
info->prior=temp;
temp=info;
info=info->next;
p=info->text;
}
temp->nex
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 编辑 程序 实验 报告 材料