数据结构课程设计——简单行编辑程序电子信息工程学院
课程设计报告
设计名称: 数据结构课程设计
简单行编辑程序姓名: 学号:
专业班级: 电子信息工程学院系 (院):
设计时间:
设计地点: EDA实验室
指导教师评语:
成绩:
签名:
年月日
数据结构课程设计报告第 1 页,共 15 页
1(课程设计目的
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2(课程设计任务与要求:
任务
问题描述:
文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。
被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法即不经济,又不总能实现。一种解决方法是逐段的编辑。任何时刻只把待编辑文件的一段放在内存,称为活区。试按这种方法实现一个简单的行编辑程序,设文件每行不超过320个字符,很少超过80个字符。
要求:
实现以下4条基本的编辑命令:
(1)行插入。格式:i<行号><回车><文本>. <回车>
将<文本>插入活区中第<行号>行之后。
(2)行删除。格式:d<行号1>[<空格><行号2>.]<回车>例如
删除活区中第<行号1>行(到第<行号2>行)。例如:例如:“d10?”和
d1014?”。 (3)活区切换。格式:n<回车>
将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。
(4)活区显示。格式:p<回车>
逐页地(每页20行)显示活区内容,在每显示的一页之后请用户决定是否继续显示以后各页(如果存在)。印出的每一行要前置行号和一个空格符,行号固定占4位,增量为1。
各条命令中的行号均须在活区中各行号范围之内,只有插入命令的行号可以等于活区第一行行号减一,表示插入当前的屏幕中第一行之前,否则命令参数非法。
数据结构课程设计报告第 2 页,共 15 页
3(课程设计说明书
一需求分析
(1)、被编译的文本文件可能很大,全部读入编辑程序的数据空间(内存)的做法既不经济,也不总
能实现。任何时刻只把待编辑文件的一段放在内存,称为活区。 (2)、活区的大小用行数ActiveMaxLen(可设为100)来描述。可以以标准行块为单位为各行分配存
储,每个标准行块可含81个行块。
(3)、将输入文件中的内容的ActiveMaxLen – x(x由用户自己定义)行的内容读入活区中。然后
分别对活区中的内容进行编辑。
(4)、分别实现各命令的函数,然后对客户的需求实行相应的操作。对命令格式不正确的进行处理。
二概要设计
ADT line{
基本操作:
enter(linenum)
初始条件:有内存。
操作结果:linenum +1.
delete_text( )
初始条件:line存在。
操作结果:若删除的最后一行,则直接删除。
若删除中间一行,则后面的linenum -1。
Load( )
初始条件:存在文件file
操作结果:打开文件。
} ADT line
三详细设计
1)将文本插在指定行端部
enter(int linenum)
{
struct line *info;
for(;;)
{
info=(struct line *)malloc(sizeof(struct line)); if(!info)
{
printf("\t! 内存不够~\n");
数据结构课程设计报告第 3 页,共 15 页
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);
}
else break;
linenum++;
}
return(linenum);
}
2)删除一行
void delete_text()
{
struct line *info;
char s[80];
int linenum;
printf("\tlinenum :");
gets(s);
linenum=atoi(s);
info=find(linenum);
if(info)
{
if(start==info)
{
start=info->next;
if(start) start->prior=NULL; else last=NULL;
}
else
{
info->prior->next=info->next;
if(info!=last)
info->next->prior=info->prior;
else last=info->prior;
}
free(info);
patchup(linenum+1,-1);
}
}
数据结构课程设计报告第 4 页,共 15 页3)存文件
void save(char *fname)
{
struct line *info;
char *p;
FILE *fp;
if((fp=fopen(fname,"w"))==NULL)
{
printf("\t Can't open the file !\n"); exit(0);
}
printf("\t Saving :\n");
info=start;
while(info)
{
p=info->text;
while(*p) putc(*p++,fp);
putc('\n',fp);
info=info->next;
}
fclose(fp);
}
4)读取文件
void load(char *fname)
{
struct line *info,*temp;
char *p;
FILE *fp;
int size,inct;
if((fp=fopen(fname,"r+"))==NULL)
{
printf("\t Can't open the file !\n"); exit(0);
}
while(start)
{
temp=start;
start=start->next;
free(temp);
}
printf("\n\t Reading...\n");
size=sizeof(struct line);
start=(struct line*)malloc(size);
if(!start)
{
数据结构课程设计报告第 5 页,共 15 页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=(struct line*)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);
}
四设计与调试分析
这个程序的源程序是我在图书馆资料上找的,当时不能运行,main的界面也不是现在这样。
源程序里面也没有存文件和读取文件的功能,我先对源程序进行调试分析,把里面的错误一一
改正,编写出mian程序。然后在里面添加了存文件和打开文件的功能,使的程序更加完善。
本程序在运行时,必须选择“3.Display a line”才能将输入,删除或者打开后的文件显示出
来,这就有点浪费时间,使得操作有点复杂。
五用户手册
1(本程序在win-tc下运行。
2(在进行输入,删除或者打开文件的操作后,再选择“3.Display a line”将输入,删除或者想
数据结构课程设计报告第 6 页,共 15 页要打开的文件内容显示出来。
3(在执行“5.Open the file”时,输入想要打开文件的正确路径,回车。如果想要打开的文件不存在,则跳出运行。
4(在进行保存文件的操作时,在提示后输入想要保存的正确路径名,再按回车,文件即被保存。
六测试成果
图(1):
图(2):
数据结构课程设计报告第 7 页,共 15 页图(3):
图(4):
七附录(源程序清单)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
struct line{
数据结构课程设计报告第 8 页,共 15 页
char text[81];
int num; /*行号*/
struct line *next; /*指向下一个输入项目的指针 */
struct line *prior; /*指向前一个项目的指针 */
};
struct line *start; /*指向表中第一个项目的指针 */
struct line *last; /*指向表中最后一个项目的指针 */
struct line *find(int),*dls_store(struct line *);
void patchup(int,int),delete_text(),list(),save(char *),load(char *); menu_select();
enter(int linenum);
void main(int argc,char *argv[])
{
char s[80],choice,fname[80];
int linenum=1;
start=NULL;
last=NULL;
if(argc==2) load(argv[1]);/*读取命令行上的文件 */
do{
choice=menu_select();
switch(choice)
{
case 1:printf("\tlinenum :");
gets(s);
linenum=atoi(s);
enter(linenum);
break;
case 2:delete_text();
break;
case 3:list();
break;
case 4:printf("\tfilename :");
gets(fname);
save(fname);
break;
case 5:printf("\tfilename :");
gets(fname);
load(fname);
break;
case 6:exit(0);
}
}while(1);
数据结构课程设计报告第 9 页,共 15 页}
/* 显示菜单,供用户选择 */
menu_select()
{
char s[80];
int c;
printf("\t\t1.Enter\n");
printf("\t\t2.Delete a line\n");
printf("\t\t3.Display a line\n");
printf("\t\t4.Save the file\n");
printf("\t\t5.Read the file\n");
printf("\t\t6.Quit\n");
do{
printf("\n\n\t\t Please choice a num :");
gets(s);
c=atoi(s);
}while(c<0||c>6);
return(c);
}
/*将文本插在指定行端部*/
enter(int linenum)
{
struct line *info;
for(;;)
{
info=(struct line *)malloc(sizeof(struct line));
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);
}
else break;
linenum++;
}
return(linenum);
数据结构课程设计报告第 10 页,共 15 页
}
/*当文本内容插在文件中间时其下面的内容的行号必须增加1,而 */ /*删除时,被删除的文本后面的行号必须减1 */
void patchup(int n,int incr)
{
struct line *i;
i=find(n);
while(i){
i->num=i->num+incr;
i=i->next;
}
}
/*按行号排序后插入 */
struct line *dls_store(struct line *i) {
struct line *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;
return start;
}
i->next=p;
i->prior=NULL;
p->prior=i;
return(i);
数据结构课程设计报告第 11 页,共 15 页}
}
old->next=i;
i->next=NULL;
i->prior=old;
last=i;
return start;
}
/*删除一行 */
void delete_text()
{
struct line *info;
char s[80];
int linenum;
printf("\tlinenum :");
gets(s);
linenum=atoi(s);
info=find(linenum);
if(info)
{
if(start==info)
{
start=info->next;
if(start) start->prior=NULL; else last=NULL;
}
else
{
info->prior->next=info->next; if(info!=last)
info->next->prior=info->prior; else last=info->prior;
}
free(info);
patchup(linenum+1,-1);
}
}
/*查找一行文本 */
struct line *find(int linenum)
{
struct line *info;
info=start;
while(info)
{
数据结构课程设计报告第 12 页,共 15 页if(linenum==info->num) return(info); info=info->next;
}
return(NULL);
}
/*显示文本 */
void list()
{
struct line *info;
info=start;
while(info)
{
printf("%d:%s\n",info->num,info->text); info=info->next;
}
printf("\n\n");
}
/*存文件 */
void save(char *fname)
{
struct line *info;
char *p;
FILE *fp;
if((fp=fopen(fname,"w"))==NULL)
{
printf("\t Can't open the file !\n"); exit(0);
}
printf("\t Saving :\n");
info=start;
while(info)
{
p=info->text;
while(*p) putc(*p++,fp);
putc('\n',fp);