简单行编辑系统数据结构课程设计
- 格式:doc
- 大小:105.00 KB
- 文档页数:21
摘要当下C++语言是一门重要的课程学习,学会运用并结合其他的知识一起解题是一件值得我们重视的,数据结构是一门结合C++知识的重要课程,因此我们要学会将平时课本的知识运用到我们现实生活当中,这样才能让我们所学的知识更加深刻。
简易文本编辑器的问题就是一个例子,传统的纸质文档已经不能满足大家的需求,有容易丢失、查找不方便等缺点。
计算机信息管理为人们的生活、工作提供了方便,提高了效率。
“简易文本编辑器”就是为了帮助老师、同学或其他一些需要使用文本编辑的人员进行管理和分析的一种计算机应用程序。
关键词:简易文本编辑器,数据结构,顺序表。
目录一、需求分析 (1)1.1问题描述 (1)1.2基本任务 (1)二、概要设计 (1)2.1主界面设计 (1)2.2数据结构设计 (1)三、详细设计 (2)3.1清空内容模块 (2)3.2打开文件模块 (2)3.3输入模块 (2)3.4插入模块 (2)3.5删除模块 (2)3.6替换模块 (2)3.7显示模块 (2)3.8保存模块 (3)3.9系统层次图 (3)四、测试结果 (3)4.1文本编辑器主界面 (3)4.2系统功能 (4)五、调试分析 (7)六、心得体会 (8)七、参考文献 (9)八、程序源代码 (10)一、需求分析1.1问题描述传统的纸质文档已经不能满足大家的需求,有容易丢失、查找不方便等缺点。
计算机信息管理为人们的生活、工作提供了方便,提高了效率。
“简易文本编辑器”就是为了帮助老师、同学或其他一些需要使用文本编辑的人员进行管理和分析的一种计算机应用程序。
1.2基本任务通过用户调查分析及实际需求,系统需要实现如下基本任务:(1)输入数据信息建立文本;(2)打开文本读取已保存的信息;(3)插入新的信息到文本中;(4)删除不再需要的文本信息;(5)替换不需要的文本信息;(6)显示所有的文本信息;(7)保存所输入、插入、替换过的文本信息;(8)清空文本信息。
二、概要设计2.1主界面设计为了实现简易文本编辑器的各项功能,设计一个含有多个菜单项的主控菜单模块以操作系统的各项功能,进而方便用户使用系统。
程序设计课程设计报告二00八年七月一号目录1……………………………………………设计目的2…………………………………………设计题目和要求3…………………………………………总体设计4…………………………………………详细设计5…………………………………………源程序清单和执行结果6…………………………………………总结1 设计目的设计一个简单的行编辑器,了解行编辑器的应用2 设计题目和要求题目:简单的行编辑器要求:1)设计一个简单的行编辑器,每行以回车结束2)数据以文件形式储存3)编辑器具有查找修改删除数据的功能3总体设计简单的行编辑器删除一行删除一行显示一行显示一行文件存盘文件存盘装入文件装入文件退出4 详细设计1)结构体的应用struct line{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 *);注:在结构体中分别声明项目指针及项目中的指针变量2)函数声明void patchup(int,int),delete_text(),list(),save(char *),load(char *);menu_select();enter(int linenum);注:在结构体外分别对输入、删除、显示等函数进行声明3)主函数和switch语句void main(int argc,char *argv[]){char s[80],choice,fname[80];// struct line *info;int linenum=1;start=NULL;last=NULL;if(argc==2) load(argv[1]);/*装入命令行上的文件*/do{choice=menu_select( );switch(choice){case 1:printf("\t行号:");gets(s);linenum=atoi(s);enter(linenum);break;case 2:delete_text();break;case 3:list();break;case 4:printf("\t文件名:");gets(fname);save(fname);break;case 5:printf("\t文件名:");gets(fname);load(fname);break;case 6:exit(0);}}while(1);}注:通过主函数分别对相应函数进行调用,利用switch选择语句来执行语句4)菜单函数menu_select(){char s[80];int c;printf("\t\t1.输入\n");printf("\t\t2.删除一行\n");printf("\t\t3.显示一行\n");printf("\t\t4.文件存盘\n");printf("\t\t5.装入文件\n");printf("\t\t6.退出\n");do{printf("\n\n\t\t请按数字选择:");gets(s);c=atoi(s);}while(c<0||c>6);return(c);}注:定义菜单显示内容,根据菜单要求运用程序5源程序和执行结果源程序:#include<iostream>#include "stdio.h"#include "stdlib.h"struct line{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];// struct line *info;int linenum=1;start=NULL;last=NULL;if(argc==2) load(argv[1]);/*装入命令行上的文件*/do{choice=menu_select( );switch(choice){case 1:printf("\t行号:");gets(s);linenum=atoi(s);enter(linenum);break;case 2:delete_text();break;case 3:list();break;case 4:printf("\t文件名:");gets(fname);save(fname);break;case 5:printf("\t文件名:");gets(fname);load(fname);break;case 6:exit(0);}}while(1);}/* 显示菜单,供用户选择*/menu_select(){char s[80];int c;printf("\t\t1.输入\n");printf("\t\t2.删除一行\n");printf("\t\t3.显示一行\n");printf("\t\t4.文件存盘\n");printf("\t\t5.装入文件\n");printf("\t\t6.退出\n");do{printf("\n\n\t\t请按数字选择:");gets(s);c=atoi(s);}while(c<0||c>6);return(c);}/*将文本插在指定行端部*/enter(int linenum){struct line *info;//char t[81];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 s[80];int linenum;printf("\t行号:");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:%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("text.txt","w"))==NULL){printf("\t文件打不开!\n");exit(0);}printf("\t正在存入文件:\n");info=start;while(info){p=info->text;while(*p) putc(*p++,fp);//putc('\r',fp);putc('\n',fp);info=info->next;}fclose(fp);}/*装入文件*/void load(char *fname){struct line *info,*temp;char *p;FILE *fp;//int t,size,inct;int size,inct;if((fp=fopen("text.txt","r"))==NULL){printf("\t文件打不开!\n");exit(0);}while(start){temp=start;start=start->next;free(temp);}printf("\n\t正装入文件!\n");size=sizeof(struct line);start=(struct line*)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++;//getc(fp); /*丢掉'\n' */*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);}执行结果:6 总结我们所做的每一道程序设计题基本涵盖了我们一学年的课程知识,而我侧有些力不从心,很多地方生疏不知,大部分程序借鉴他人,这一点我还需改进,不过通过此次课程设计,我对程序设计这门课程又有了新的理解。
数据结构课程设计(5篇)第一篇:数据结构课程设计课程设计说明书设计名称:数据结构课程设计题目:设计五:二叉树的相关操作学生姓名:专业:计算机科学与技术班级:学号:指导教师:日期: 2012 年 3 月 5 日课程设计任务书计算机科学与技术专业年级班一、设计题目设计五二叉树的相关操作二、主要内容建立二叉树,并对树进行相关操作。
三、具体要求1)利用完全二叉树的性质建立一棵二叉树。
(层数不小于4层)2)统计树叶子结点的个数。
3)求二叉树的深度。
4)能够输出用前序,中序,后序对二叉树进行遍历的遍历序列。
四、进度安排依照教学计划,课程设计时间为:2周。
本设计要求按照软件工程的基本过程完成设计。
建议将时间分为三个阶段:第一阶段,根据题目要求,确定系统的总体设计方案:即系统包括哪些功能模块,每个模块的实现算法,并画出相应的流程图.同时编写相应的设计文档;第二阶段,根据流程图编写程序代码并调试,再将调试通过的各个子模块进行集成调试;第三阶段,归纳文档资料,按要求填写在《课程设计说明书》上,并参加答辩。
三个阶段时间分配的大概比例是:35: 45: 20。
五、完成后应上交的材料本课程设计要求按照学校有关规范的要求完成,在课程设计完成后需要提交的成果和有关文档资料包括课程设计的说明书,课程设计有关源程序及可运行程序(含运行环境)。
其中课程设计说明书的格式按学校规范(见附件),其内容不能过于简单,必须包括的内容有:1、课程设计的基本思想,系统的总功能和各子模块的功能说明;2、课程设计有关算法的描述,并画出有关算法流程图;3、源程序中核心代码的说明。
4、本课程设计的个人总结,主要包括以下内容:(1)课程设计中遇到的主要问题和解决方法;(2)你的创新和得意之处;(3)设计中存在的不足及改进的设想;(4)本次课程设计的感想和心得体会。
5、源代码要求在关键的位置有注释,增加程序的可读性。
程序结构和变量等命名必须符合有关软件开发的技术规范(参见有关文献)。
计算机工程学院课程设计报告设计名称:数据结构课程设计选题名称:简单的行编辑器姓名:学号:专业班级:软件工程软件102 系(院):计算机工程学院设计时间:设计地点:软件工程实验室、教室<2>用户可从键盘上输入字符,以*结尾表示输入字符结束,界面上会输出用户输入的字符,以及行编辑的功能选择项。
(如输入如下字符beijing huan ying ni *)<3>输入选择1,则依次输出:字母个数:17数字个数:0空格个数:4字符总数:21是否继续使用(Y/N):<4.1>选择Y,则出现行编辑器的功能选择,<4.2>如果第三步结束选择N,则输出**********谢谢使用**********<,再次需要进行行编辑器功能选择:输入选择2;则输出“请输入要统计的某一字符”提示用户输入要查找的字符假如输入i;则输出:i在文章中出现次数为:4;是否继续使用(Y/N)<**********谢谢使用**********<则输出行编辑器的功能选择项目;选择3;输出“请输入要删除子串的起始位置和长度:”提示用户输入,如果输入0 7输出“删除某一子串后:”huan ying ni**********谢谢使用**********<5>其他字符测试;例如用户输入:beijing BEIJING 520*输出字母个数:14数字个数:3空格个数:2字符总数:19统计字符i出现次数为2;删除从8号位器长度为7的字串后输出字符为beijing 520五用户手册1.运行程序,首先出现主界面。
主界面首行显示“欢迎使用文本编辑器”,输出提示信息“请输入要编辑的字符”,然后界面显示用户输入的字符。
然后主界面文本编辑器的功能菜单,功能菜单包括三个选项:选项一:统计字数,选择该项可进字数统计,当用户输入字符结束后,选择功能选项一,主界面回自动统计各字符数,然后输出。
2;选项二:统计出现次数,选择该项可进行对文章中某一字符出现字数的统计,当用户选择功能二时,主界面回输出提示信息,提示用户输入要统计的字符,用户可从键盘任意输入字符,以回车键结束。
简单行编辑课程设计一、教学目标本课程的目标是让学生掌握简单文本编辑的基本知识和技能,培养他们独立进行文本编辑的能力,并提高他们对计算机操作的兴趣和信心。
具体目标如下:知识目标:使学生了解文本编辑的基本概念、原理和方法,包括文本的插入、删除、复制、粘贴等功能;掌握常用的文本编辑软件的使用方法,如Notepad、Word等。
技能目标:培养学生能够熟练运用文本编辑软件进行文本的编辑和排版,能够运用基本的查找和替换功能,掌握简单的代码编写和运行。
情感态度价值观目标:通过文本编辑的学习,使学生感受到计算机技术的实用性和趣味性,增强他们对计算机技术的热爱和探索精神,培养他们独立思考和解决问题的能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.文本编辑的基本概念和原理:介绍文本编辑的概念、原理和方法,使学生了解文本编辑在计算机应用中的重要性。
2.文本编辑软件的使用:详细讲解常用的文本编辑软件如Notepad、Word的使用方法,包括文本的插入、删除、复制、粘贴等功能。
3.文本的排版和格式设置:介绍如何进行文本的排版和格式设置,使学生能够熟练掌握文本编辑软件的排版功能。
4.代码编写和运行:讲解简单的代码编写和运行,使学生了解计算机编程的基本过程,培养他们的编程思维。
三、教学方法为了提高教学效果,我们将采用多种教学方法相结合的方式进行教学:1.讲授法:通过讲解文本编辑的基本概念、原理和方法,使学生了解文本编辑的基础知识。
2.案例分析法:通过分析实际案例,使学生掌握文本编辑软件的使用方法和技巧。
3.实验法:让学生亲自动手进行文本编辑的实践,培养他们独立进行文本编辑的能力。
4.讨论法:学生进行小组讨论,分享学习心得和经验,提高他们的合作能力和沟通能力。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:选用适合学生程度的文本编辑教材,为学生提供系统的学习材料。
2.参考书:提供相关的参考书籍,丰富学生的学习资源。
简单行编辑器数据结构课程设计概述:本文旨在设计一种简单的行编辑器,以满足基本的文本编辑需求。
行编辑器是一种常见的文本编辑工具,它允许用户在文本中进行插入、删除、挪移光标等操作。
为了实现这一目标,我们将采用数据结构来管理文本的存储和操作。
1. 数据结构设计:1.1 文本存储:我们可以使用链表作为文本的基本数据结构,每一个节点存储一个字符。
链表的每一个节点包含一个字符和指向下一个节点的指针。
这样的设计可以方便地进行插入和删除操作,同时保持文本的顺序。
1.2 光标位置:光标的位置可以用一个指针指向链表中的某个节点。
这个指针可以指向一个字符之前、之后或者字符本身的位置。
通过挪移光标指针,用户可以在文本中进行插入、删除和挪移操作。
2. 功能实现:2.1 插入操作:用户可以在光标当前位置插入一个字符。
插入操作包括以下步骤:- 创建一个新节点,存储要插入的字符。
- 将新节点插入到光标所在节点的前面或者后面,更新链表的指针。
2.2 删除操作:用户可以删除光标当前位置的字符。
删除操作包括以下步骤:- 找到光标所在节点。
- 更新链表的指针,将光标所在节点从链表中移除。
2.3 光标挪移操作:用户可以通过挪移光标来改变插入和删除操作的位置。
光标挪移操作包括以下步骤:- 根据用户输入的指令,将光标指针向前或者向后挪移一个节点。
2.4 文本显示:用户可以查看当前编辑的文本内容。
通过遍历链表,将字符挨次输出即可。
3. 用户界面设计:为了方便用户操作,我们可以设计一个简单的用户界面,包括以下组件:- 文本显示区域:显示当前编辑的文本内容。
- 光标位置指示器:显示光标当前位置。
- 命令输入框:接收用户输入的命令。
4. 实例演示:假设用户输入以下命令序列:- 插入字符 'A':光标指向开头,文本变为 "A"。
- 插入字符 'B':光标指向 'A' 后面,文本变为 "AB"。
行编辑程序课程设计一、课程目标知识目标:1. 学生能理解行编辑程序的基本概念,掌握其功能和用途。
2. 学生能掌握行编辑程序的基本操作,如插入、删除、替换和查找。
3. 学生了解行编辑程序与文本处理软件(如记事本、Word等)的区别和联系。
技能目标:1. 学生能够独立使用行编辑程序进行文本编辑和操作。
2. 学生能够运用行编辑程序解决实际问题,如修改代码、配置文件等。
3. 学生通过行编辑程序的学习,培养逻辑思维和问题解决能力。
情感态度价值观目标:1. 学生对计算机编程产生兴趣,树立编程学习的自信心。
2. 学生培养良好的编程习惯,注重代码规范和团队协作。
3. 学生认识到行编辑程序在实际应用中的价值,激发学习计算机科学的热情。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程为信息技术学科,以实践操作为主,理论讲解为辅。
2. 学生特点:六年级学生具备一定的计算机操作基础,思维活跃,好奇心强。
3. 教学要求:结合学生实际,注重实践操作,提高学生的动手能力和解决问题的能力。
二、教学内容1. 行编辑程序基本概念:介绍行编辑程序的定义、功能和用途,结合课本第二章第一节内容,让学生了解行编辑程序在计算机编程中的重要性。
2. 行编辑程序基本操作:详细讲解插入、删除、替换和查找等操作,对应课本第二章第二节,通过实例演示和练习,使学生熟练掌握操作方法。
3. 行编辑程序与文本处理软件的对比:分析行编辑程序与文本处理软件的异同,以课本第二章第三节为例,让学生明白两者在实际应用中的适用场景。
4. 实践操作:安排学生进行行编辑程序的操作练习,结合课本第二章练习题,巩固所学知识,提高实际操作能力。
5. 行编辑程序在实际应用中的案例:介绍行编辑程序在编程、配置文件等领域的应用,参照课本第二章案例分析,激发学生学习兴趣,培养实际应用能力。
6. 编程习惯与规范:讲解编程过程中应注意的规范和习惯,结合课本相关内容,培养学生良好的编程素养。
《数据结构》课程设计一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中基础的数据组织、管理和处理方法,培养其运用数据结构解决实际问题的能力。
课程目标如下:1. 知识目标:(1)理解基本数据结构的概念、原理和应用,如线性表、栈、队列、树、图等;(2)掌握常见算法的设计和分析方法,如排序、查找、递归、贪心、分治等;(3)了解数据结构在实际应用中的使用,如操作系统、数据库、编译器等。
2. 技能目标:(1)能够运用所学数据结构解决实际问题,具备良好的编程实践能力;(2)掌握算法分析方法,能够评价算法优劣,进行算法优化;(3)能够运用数据结构进行问题建模,提高问题解决效率。
3. 情感态度价值观目标:(1)激发学生对计算机科学的兴趣,培养其探索精神和创新意识;(2)培养学生团队合作意识,学会与他人共同解决问题;(3)增强学生的责任感和使命感,使其认识到数据结构在信息技术发展中的重要性。
本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,为后续教学设计和评估提供依据。
课程注重理论与实践相结合,旨在提高学生的知识水平、技能素养和情感态度价值观。
二、教学内容《数据结构》教学内容依据课程目标进行选择和组织,确保科学性和系统性。
主要包括以下部分:1. 线性表:- 线性表的定义、特点和基本操作;- 顺序存储结构、链式存储结构及其应用;- 线性表的相关算法,如插入、删除、查找等。
2. 栈和队列:- 栈和队列的定义、特点及基本操作;- 栈和队列的存储结构及其应用;- 栈和队列相关算法,如进制转换、括号匹配等。
3. 树和二叉树:- 树的定义、基本术语和性质;- 二叉树的定义、性质、存储结构及遍历算法;- 线索二叉树、哈夫曼树及其应用。
4. 图:- 图的定义、基本术语和存储结构;- 图的遍历算法,如深度优先搜索、广度优先搜索;- 最短路径、最小生成树等算法。
5. 排序和查找:- 常见排序算法,如冒泡、选择、插入、快速等;- 常见查找算法,如顺序、二分、哈希等。
数据结构简单课程设计一、课程目标知识目标:1. 理解数据结构的基本概念,掌握常见的数据结构类型,如线性表、栈、队列、树、图等。
2. 学会分析不同数据结构的特点,能够根据实际问题选择合适的数据结构进行存储和处理。
3. 掌握数据结构中基本算法的实现,如排序、查找等,并了解其性能分析。
技能目标:1. 培养学生运用数据结构解决实际问题的能力,能够独立设计简单的数据结构应用方案。
2. 提高学生的编程实践能力,学会使用编程语言(如C/C++)实现数据结构和算法。
3. 培养学生通过分析数据结构算法性能,进行优化和改进的能力。
情感态度价值观目标:1. 培养学生对数据结构的兴趣,激发学习热情,形成主动探索和积极进取的学习态度。
2. 增强学生的团队合作意识,培养在团队项目中分工合作、共同解决问题的能力。
3. 培养学生严谨、细致、负责的学术态度,提高对算法和程序的正确性、可靠性的认识。
本课程针对高年级学生,结合学科特点,注重理论与实践相结合,通过课程学习,使学生在掌握基本数据结构知识的基础上,提高解决实际问题的能力,为后续相关课程和未来从事计算机相关工作奠定基础。
二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,重点讲解线性结构与非线性结构的特点。
教材章节:第一章 数据结构绪论2. 线性表:讲解线性表的定义、特点,以及顺序存储和链式存储的实现方式。
教材章节:第二章 线性表3. 栈与队列:介绍栈和队列的基本概念、操作原理,分析其应用场景。
教材章节:第三章 栈和队列4. 树与二叉树:讲解树的基本概念、二叉树的性质,以及二叉树的前序、中序、后序遍历算法。
教材章节:第四章 树和二叉树5. 图:介绍图的定义、存储方式,以及图的遍历算法(深度优先搜索和广度优先搜索)。
教材章节:第五章 图6. 排序算法:讲解常见排序算法(冒泡排序、选择排序、插入排序、快速排序等)的原理及实现。
教材章节:第六章 排序7. 查找算法:介绍静态查找表和动态查找表,讲解常见查找算法(顺序查找、二分查找、哈希查找等)。
数据结构课程设计说明书2012 年 8月 30 日1. 概述 (1)1.1 设计目的 (1)1.2 设计目标及要求设计要求 (1)1.3 设计进度 (1)1.4 分工 (2)2. 需求分析及总体设计 (2)2.1 数据结构 (2)2.2 功能框架 (2)3.功能模块详细设计 (2)3.1设计流程 (3)3.2主要源代码 (3)4.功能模块详细设计 (5)4.1设计流程......................................................................... 错误!未定义书签。
4.2主要源代码 (5)1. 概述1.1 设计目的被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的作法既不经济,也不总能实现。
所以设计这一种以行为单位进行的编辑程序。
主要是逐段地编辑。
任何时刻只把待编辑文件的一段放在内存,称为活区。
需要用到的数据结构是链表。
1.2 设计目标及要求设计要求(1)行插入:格式: i<回车><行号><回车><文本><回车>功能:在指定行之后插入一行或几行。
(2)行删除:格式: d<回车><行号1>[<空格><行号2>]<回车>功能:在指定行之后插入一行或几行。
(3)行替换:格式: i<回车><行号><回车><文本><回车>功能:在指定行之后插入一行或几行。
(4)活区切换:格式: n<回车>功能:将活区写入文件,并从文件中读入下一段,作为新的活区。
(5)活区显示:格式: p<回车>功能:逐页地(每页20行)显示活区内容,每显示一页之后请用户决定是否继续显示以后备页(如果存在)。
印出的每一行要前置行号和一个空格符,行号固定占4位,增量为1。
(6)模式匹配:格式: k<回车><匹配文本><回车>1.3 设计进度1》2012.8.20——2012.8.21需求分析2》2012.8.21下午交需求分析,主要分析课题的内容,需要用的数据结构,小组分工情况3》2012.8.22——2012.8.29编写源代码4》2012.8.30完成设计并书写课程设计说明书5》2012.8.31 等待老师验收1.4 分工薛建明:进行插入功能的编写。
丛前:进行删除功能的编写。
甘炀:进行活区的切换功能的编写。
杨志文:进行活区显示,KMP算法,界面的编写。
2. 需求分析及总体设计2.1 数据结构用到数据结构的双向链表:typedef struct text{char string[80];struct text *next;struct text *pre;int flat;} text;2.2 功能框架(1)行插入:在指定行之后插入一行或几行。
(2)行删除:在指定行之后插入一行或几行。
(3)行替换:在指定行之后插入一行或几行。
(4)活区切换:将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。
(5)活区显示:逐页地(每页20行)显示活区内容,每显示一页之后请用户决定是否继续显示以后备页(如果存在)。
印出的每一行要前置行号和一个空格符,行号固定占4位,增量为1。
(6)模式匹配:在当前活区中查找所要匹配的文本。
3.功能模块详细设计3.1设计流程行插入功能:找到要插入的结点对应的指针,然后开辟新的空间,把开辟出的新的空间,与刚才的结点连接,同时再把新节点的指针域只向出入的下一个节点。
主要思想:p=(text *)malloc(sizeof(text)); // p为新插入节点p->next=p1->next; // p1为要出入结点的p->pre=p1;p1->next->pre=p;p1->next=p;3.2主要源代码void insert(){int i,j,hang,increhang=1,incre;char s;text *p,*p1,*p2;printf("(Note: the i-th row insert text in the i-th row!! Inserted text in # Please enter the line number for the end of the flag):\n");scanf("%d",&hang);p=p1=NULL;if(hang==0){p=(text *)malloc(sizeof(text));p->flat=1;p->next=head;head->pre=p;head=p;}if(hang!=0){for(i=0,p1=head; i<hang-1; i++,p1=p1->next); //找到要插入行的前一行p=(text *)malloc(sizeof(text)); //为插入行分配空间p->flat=1;p->next=p1->next;p->pre=p1;p1->next->pre=p;p1->next=p;} //从此行将插入行插入到链表中p->string[0]=getchar();p->string[0]=getchar();i=0;incre=1;while(p->string[i]!='#'){if(incre==80){s=getchar();if(s=='#'){i++;p->string[i]=s;break;}p1=p;p=(text *)malloc(sizeof(text));p->flat=1;p->next=p1->next;p->pre=p1;p1->next->pre=p;p1->next=p; //从此行将插入行插入到链表中i=0;incre=1;p->string[i]=s;}i++;incre++;p->string[i]=getchar();}p->string[i]='\n';p->string[i+1]='\0';puts("Modified text:\n");head->flat=1;for(p2=head,j=1; (j<=20)&&(p2!=NULL); j++,p2=p2->next) //显示出修改后的链表if(p2->flat==1)printf("line %2d: %s",j,p2->string);if(feof(fp))printf("File has ended!");}4.功能模块详细设计4.1设计流程行删除:找到要删除的第一行和要删除的最后一行,分别把他们的指针域记录下来,把要删除的最后一行之后的文本往前移使的一页达到20行。
4.2主要源代码void del(){text *p1,*p2,*p3,*p4;int i,j;xiugai=1;printf("the first line and the last lineyou want to delete \n");scanf("%d %d",&min,&max);if(head==NULL)printf("\n list null! \n");p1=p2=head;if(min==1)p1=head;else{for(i=0; i<min-1; i++) /*找到要删除的第一行*/p1=p1->next;}p3=p1;for(i=0; i<max; i++) /*找到要删除的最后一行*/p2=p2->next;p4=p2;for(; p4!=NULL; p3=p3->next) /*删除中间节点,将flat 赋值0*/ {strcpy(p3->string,p4->string);p3->flat=p4->flat;p4=p4->next;}for(; p3!=NULL; p3=p3->next)fgets(p3->string,sizeof(p3->string),fp);printf("Modified text:\n");for(i=0,j=0,p3=head; i<20; i++,p3=p3->next){if(p3->flat==1)printf("line %2d : %s",j+1,p3->string);j++;}}5.功能模块详细设计5.1设计流程活区切换:5.2主要源代码void saveshow(){int i=0,j=0;char conti='y';text *p=NULL,*p1,*p2,*p3;for(i=0,p=head; (p!=NULL)&&(i<20); i++,p=p->next)if(p->flat==1)fputs(p->string,out);p3=p1=head;if(p==NULL)for(i=0; i<20; i++){p3->flat=1;p3=p3->next;}if(p!=NULL){ for(i=0; (p!=NULL)&&(i<20); i++,p=p->next)if(p->flat==1){strcpy(p1->string,p->string);j=j+1;p->flat=0;p1=p1->next;p1->flat=1;}}if(j<20){p2=p1;for(; (j<20)&&(!feof(fp)); j++,p2=p2->next) //从文件读入活区fgets(p2->string,sizeof(p2->string),fp);if(j<20 && (feof(fp))){ p2=p2->pre;for(; p2!=NULL;p2=p2->next)p2->flat=0;}}}6.功能模块详细设计6.1设计流程模式匹配KMP 算法, 编辑函数,用来接受处理编辑命令,活区显示,行替换,活区显示,保存6.2主要源代码//活区显示void appear(){void EXIT() ;int i,j;char conti='Y';text *p2;if( !feof(fp) ){page++;printf("*******************************page %d *****************************************\n",page);for(i=0,p2=head; i<20; i++,p2=p2->next){if(p2->flat==1)printf("line %2d : %s",i+1,p2->string);}puts("Should continue to read into it?( Y / N ) :");conti=getchar();conti=getchar();if((conti=='y'||conti=='Y')){saveshow();appear();}}else{page++;printf("*******************************page %d *****************************************\n",page);for(i=0,p2=head; i<20; i++,p2=p2->next){if(p2->flat==1)printf("line %2d : %s",i+1,p2->string);}puts("\nFile has ended!\n");}}//****************退出编辑函数后执行的函数,将所有的内容存盘******************void saveall(){int i;text *p;for(i=0,p=head; i<20; i++,p=p->next) //将活区写入文件if(p->flat==1){fputs(p->string,out);p->flat=0;}while(!feof(fp))//将其余的内容写入文件fputc(fgetc(fp),out);}void change(){int i,j,hang,incre,inc;char s;text *p,*p1,*p2;xiugai=1;printf("Please input the line number you want to replace (replace text in # is the ending):\n");scanf("%d",&hang);p=p1=NULL;if(hang==1)p=head;elsefor(i=0,p=head; i<hang-1; i++,p=p->next);p->string[0]=getchar();p->string[0]=getchar();p->flat=1;i=0;incre=1;while(p->string[i]!='#'){i++;incre++;p->string[i]=getchar();if(incre==80){inc++;p->string[i+1]='\n';p->string[i+2]='\0';s=getchar();if(s=='#'){i++;p->string[i]=s;break;}p1=p;p=(text *)malloc(sizeof(text));p->flat=1;p->next=p1->next;p->pre=p1;p1->next->pre=p;p1->next=p;i=0;incre=1;p->string[i]=s;}}p->string[i]='\n';p->string[i+1]='\0';puts("Modified text:\n");for(p2=head,j=1; (j<=20)&&(p2!=NULL); j++,p2=p2->next) {if(p2->flat==1)printf("line %2d : %s",j,p2->string);}if(feof(fp))printf("File has ended!");}//*************模式匹配KMP 算法***************void KMP(){int m=1,next[80];int i=0,j=-1;text *p;int a=0,b=0,F=0;char s[80],t[80];int lens,lent,k;p=head;printf("Please enter the string you want to pattern matching:\n");scanf("%s",t);lent=strlen(t);do{lens=strlen(p->string);strcpy(s,p->string);next[0]=-1;while(i<lent-1){if(j==-1||t[i]==t[j]){++i;++j;next[i]=j;}else j=next[j];}while(a<lens && b<lent){if(b==-1||s[a]==t[b]){++a;++b;}elseb=next[b];}if(b>(lent-1)){k=a-lent+1;printf("You want to match in the string: line%2d words%d \n",m,k);F=1;}i=0;j=-1;a=0;b=0;p=p->next;m++;}while(m<=20);if(F==0)printf("Sorry!Failed to find the string you want to match in the current text\n");else printf("Match is ready! !\n");}void drawmain() /*画主窗口函数*/{int i,j;gotoxy(1,1); /*在文本窗口中设置光标至(1,1)处*/insline(); /*在文本窗口的(1,1)位置处中插入一个空行*/gotoxy(20,1);cprintf("%c %c File %c %c",179,17,16,179); /* | < > |*/gotoxy(45,1);cprintf("%c %c Edit %c %c",179,17,16,179); /* | < > |*/gotoxy(5,25); /*跳至窗口底端*/}void drawmenu(int m,int n) /*画菜单,m:第几项菜单,n:第m项的第n个子菜单*/ {int i;if(m%2==0) /*画File菜单项*/{window(21,2,32,6);textcolor(0);textbackground(7);for(i=0; i<4; i++) /*在上面定义的文本窗口中先输出5个空行*/{gotoxy(1,1+i);insline();}window(1,1,80,25);gotoxy(20,1);for(i=1; i<=5; i++){gotoxy(21,1+i);cprintf("%c",179); /*窗口内文本的输出函数,在窗口左边输出| */gotoxy(32,1+i);cprintf("%c",179); /*窗口内文本的输出函数,在窗口右边输出| */ }for(i=1; i<=11; i++){gotoxy(21+i,2);cprintf("%c",196); /*窗口内文本的输出函数,在窗口上边输出- */gotoxy(21+i,6);cprintf("%c",196); /*窗口内文本的输出函数,在窗口下边输出- */ }/*以上为显示菜单项的外观*/textbackground(7);gotoxy(21,2);cprintf("%c",218); /*输出四个边角表格符*/gotoxy(21,6);cprintf("%c",192);gotoxy(32,2);cprintf("%c",191);gotoxy(32,6);cprintf("%c",217);gotoxy(22,3);cprintf(" Open ");gotoxy(22,4);cprintf(" Save ");gotoxy(22,5);cprintf(" Exit ");textcolor(15);textbackground(0);gotoxy(20,1);cprintf("%c %c File %c %c",179,17,16,179);switch(n%3){case 0:gotoxy(22,3);cprintf(" Open ");break;case 1:gotoxy(22,4);cprintf(" Save ");break;case 2:gotoxy(22,5);cprintf(" Exit ");break;}}/********************************************************/if(m%2==1) /*画Edit菜单项*/{window(46,2,57,8);textcolor(0);textbackground(7);for(i=0; i<7; i++){gotoxy(1,1+i);insline();}window(1,1,80,25);gotoxy(45,1);for(i=1; i<=8; i++){gotoxy(46,1+i);cprintf("%c",179);gotoxy(57,1+i);cprintf("%c",179);}for(i=1; i<=11; i++){gotoxy(46+i,2);cprintf("%c",196);gotoxy(46+i,9);cprintf("%c",196);}textbackground(7);gotoxy(46,2);cprintf("%c",218);gotoxy(46,9);cprintf("%c",192);gotoxy(57,2);cprintf("%c",191);gotoxy(57,9);cprintf("%c",217);gotoxy(47,3);cprintf(" del ");gotoxy(47,4);cprintf(" insert ");gotoxy(47,5);cprintf(" change ");gotoxy(47,6);cprintf(" KMP ");gotoxy(47,7);cprintf(" saveshow");gotoxy(47,8);cprintf(" appear ");textcolor(15);textbackground(0);gotoxy(45,1);cprintf("%c %c Edit %c %c",179,17,16,179);switch(n%6){case 0:gotoxy(47,3);cprintf(" del ");break;case 1:gotoxy(47,4);cprintf(" insert ");break;case 2:gotoxy(47,5);cprintf(" change ");break;case 3:gotoxy(47,6);cprintf(" KMP ");break;case 4:gotoxy(47,7);cprintf(" saveshow");break;case 5:gotoxy(47,8);cprintf(" appear ");break;}}}int menuctrl(int A) /*菜单控制*/{int x,y,i,B,value,flag=6,a,b;x=wherex();y=wherey();if(A==F1){drawmenu(0,flag); /*显示File及其子菜单,并将光带显示在第一个子菜单上*/value=300;}if(A==F2){drawmenu(1,flag); /*显示Edit及其子菜单,并将光带显示在第一个子菜单上*/value=301;}if(A==F1||A==F2){while((B=bioskey(0))!=ESC) /*选择用户按键*/{if(flag==0) flag=100;if(value==0) value=300; /*此value为局部变量*/if(B==UP) drawmenu(value,--flag); /*循环上下移*/if(B==DOWN) drawmenu(value,++flag); /*循环上下移*/if(B==LEFT) /*菜单项之间循环选择(左移)*/{flag=100;drawmain();window(1,2,80,25);for(i=0; i<24; i++)insline();window(2,3,80,25);textcolor(10);drawmenu(--value,flag);}if(B==RIGHT)/*菜单项之间循环选择(右移)*/{flag=100;drawmain();window(1,2,80,25);for(i=0; i<24; i++)insline();window(1,3,80,25);textcolor(10);drawmenu(++value,flag);}if(B==ENTER) /*选中某主菜单项的子菜单项(选中某项)*/{if(value%2==0) b=3; /*File下有5个子菜单项*/if(value%3==1) b=6; /*Edit下有4个子菜单项*/a=(value%3)*10+flag%b;/*a表示选择子菜单的编号*/drawmain();window(1,2,80,25);for(i=0; i<25; i++)insline();window(1,3,80,25);textcolor(10);gotoxy(x,y);if(a==0) return 100; /*Open*/if(a==1) return 101; /*Save*/if(a==2) return 102; /*Exit*/if(a==10) return 110; /*del*/if(a==11) return 111; /*insert*/if(a==12) return 112; /*change*/if(a==13) return 113; /*KMP*/if(a==14) return 114; /*saveshow*/if(a==15) return 115; /*appear*/}}}return A;}void main(){int a,b,A,B,i=1;drawmain();window(1,2,80,25);while((A=bioskey(0))!=ESC){window(2,2,80,25);if(A==F1){B=menuctrl(A);if(B==100)Openfiles();Createlist();if(B==101)saveall();if(B==102)EXIT();}if(A==F2){B=menuctrl(A);if(B==110)del();if(B==111)insert();if(B==112)change();if(B==113)KMP();if(B==114){if( i==1)page=1;saveshow();}if(B==115){i=2;appear();}}}}13。