文档视界 最新最全的文档下载
当前位置:文档视界 › 数据结构课程设计——简单行编辑程序

数据结构课程设计——简单行编辑程序

数据结构课程设计——简单行编辑程序
数据结构课程设计——简单行编辑程序

数据结构课程设计——简单行编辑程序电子信息工程学院

课程设计报告

设计名称: 数据结构课程设计

简单行编辑程序姓名: 学号:

专业班级: 电子信息工程学院系 (院):

设计时间:

设计地点: 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);

相关文档