数据结构课程设计——简单行编辑程序(共17页).doc
精选优质文档-倾情为你奉上 电子信息工程学院课程设计报告设计名称: 数据结构课程设计 简单行编辑程序 姓 名: 学 号: 专业班级: 电子信息工程学院 系 (院): 设计时间: 设计地点: EDA实验室 成绩:指导教师评语: 签名: 年 月 日专心-专注-专业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。 各条命令中的行号均须在活区中各行号范围之内,只有插入命令的行号可以等于活区第一行行号减一,表示插入当前的屏幕中第一行之前,否则命令参数非法。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"); 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 s80; 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); 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("nt Reading.n"); size=sizeof(struct line); start=(struct line*)malloc(size); if(!start) printf("nt内存已经用完 !"); 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("nt内存已经用完 !"); 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”将输入,删除或者想要打开的文件内容显示出来。3在执行“5.Open the file”时,输入想要打开文件的正确路径,回车。如果想要打开的文件不存在,则跳出运行。 4在进行保存文件的操作时,在提示后输入想要保存的正确路径名,再按回车,文件即被保存。六 测试成果图(1):图(2):图(3):图(4):七 附录(源程序清单) #include "stdio.h" #include "stdlib.h" #include "string.h" struct line char text81; 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 s80,choice,fname80; int linenum=1; start=NULL; last=NULL; if(argc=2) load(argv1);/*读取命令行上的文件 */ 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); /* 显示菜单,供用户选择 */ menu_select() char s80; int c; printf("tt1.Entern"); printf("tt2.Delete a linen"); printf("tt3.Display a linen"); printf("tt4.Save the filen"); printf("tt5.Read the filen"); printf("tt6.Quitn"); do printf("nntt 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); /*当文本内容插在文件中间时其下面的内容的行号必须增加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); old->next=i; i->next=NULL; i->prior=old; last=i; return start; /*删除一行 */ void delete_text() struct line *info; char s80; 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) if(linenum=info->num) return(info); info=info->next; return(NULL); /*显示文本 */ void list() struct line *info; info=start; while(info) printf("%d:%sn",info->num,info->text); info=info->next; printf("nn"); /*存文件 */ 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); /*读取文件 */ 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("nt Reading.n"); size=sizeof(struct line); start=(struct line*)malloc(size); if(!start) printf("nt内存已经用完 !"); 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("nt内存已经用完 !"); return; info->prior=temp; temp=info; info=info->next; p=info->text; temp->next=NULL; last=temp; free(info); start->prior=NULL; fclose(fp); 参考文献: 1严蔚敏,吴伟民 数据结构(语言版)北京大学出版社,2006 2谭浩强语言程序设计教程高等教育出版社,1998 3美Robert LKruse数据结构与程序设计(语言第二版)清华大学出版社,20054.课程设计心得通过对数据结构的课程设计,我了解并发现了很多调试程序的方法,而且懂得了如何处理错误的方法。对C语言以及C+的使用得到了进一步的提高。针对数据结构的书本知识得到了进一步的巩固。对程序的深层理解,清楚程序中每一步的功能,在程序的运行中是十分重要的,一个好的结构在运行中能够充分的发挥程序的功能。结构设计的合理性决定了这个程序的价值。在今后的学习中我要注意这方面,使得我的编程能力能有进一步的提高。但是我在写程序的时候也有很多困难,上网和在图书馆找相关的C函数,由于代码分别保存在不同的头文件中,如何协调各个头文件之间代码的通讯是个很难解决的问题,曾经一度想放弃使用头文件,但如此一来会造成代码全部堆在一起,很难阅读和编写。最后通过声明的方法终于解决了问题。通过这次课程设计,对C语言的掌握提高到了一个新的水平,能够利用C语言编写出一个实用的程序,很大程度提高了程序综合设计能力、分析能力和编程能力。掌握了很多新的编程技巧,积累了一些编程经验。我更学到了编程的思想,这对于以后的学习以至到以后的工作中都是很有用的。 同时我认为我们以后的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致导致整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。团结协作是我们实习成功的一项非常重要的保证。而这次实习也正好锻炼我们这一点,这也是非常宝贵的。