数据结构课程设计-文学研究助手系统
- 格式:doc
- 大小:111.50 KB
- 文档页数:10
目录1问题描述 (2)2基本要求 (2)2.1问题分析及解决法案框架确定 (2)2.2程序设计 (2)2.3详细设计和编码 (2)3算法思想 (2)4模块划分 (3)4.1对各个模块进行功能的描述 (3)4.2模块之间关系及其相互调用 (3)5数据结构 (5)5.1定义栈 (5)5.2定义队列 (5)5.3栈的基本操作 (5)5.4队列的基本操作 (6)6测试数据 (6)7测试情况 (6)8总结 (9)1 问题描述试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。
其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。
例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是。
栈和队列是一种常见的数据结构,是两种非常重要的线性结构,也都是线性表,它们是操作受限的的线性表,有顺序栈、链式栈、链式队列和循环队列等形式。
它们广泛应用在各种软件系统中。
本题就是要用这些线性结构先完成基本的应用,如回文,逆置。
2 基本要求2.1问题分析及解决法案框架确定充分地分析和理解问题本身,使程序结构清晰合理简单和易于调试,并确定每个函数的简单功能,以及函数之间的调用关系。
2.2程序设计1、选择顺序栈和链队列,完成回文判断、字符串的逆置;2、选择链栈和循环队列,完成回文判断、字符串的逆置;3、运用掌握C语言编写程序,实现所编程序的各个模块功能。
2.3详细设计和编码给出所有源程序清单,要求程序有充分的注释语句,至少要注释每个函数参数的含义和函数返回值的含义。
3 算法思想运用栈和队列算法,在序列依次输入时将序列分别入栈和入队列,利用栈FILO 和队列FIFO的特点,通过出栈和出队列实现序列顺序和逆序的比较,根据题目描述的回文序列判断并输出结果。
定义顺序栈和链队列及关于它们的基本操作,如定义栈和队列、求栈和队列的长度、入栈出栈、入队列出队列等。
数据结构课程设计 pdf一、课程目标知识目标:1. 让学生掌握数据结构的基本概念,包括线性表、栈、队列、树、图等;2. 使学生了解不同数据结构的特点,并能运用其解决实际问题;3. 引导学生掌握常见数据结构的相关算法,如排序、查找等。
技能目标:1. 培养学生运用数据结构描述问题的能力,提高编程实现复杂问题的技能;2. 培养学生具备分析算法复杂度,选择合适数据结构和算法解决问题的能力;3. 提高学生的团队协作能力,通过小组讨论和项目实践,培养学生的沟通表达能力和协作精神。
情感态度价值观目标:1. 激发学生对计算机科学的兴趣,培养学生主动探索、勇于创新的精神;2. 培养学生具备良好的学习习惯,严谨的学术态度,对待问题敢于质疑、善于思考;3. 引导学生认识到数据结构在实际应用中的重要性,提高学生的专业认同感。
本课程针对高中年级学生,结合数据结构课程性质,注重理论与实践相结合,培养学生解决实际问题的能力。
考虑到学生的年龄特点,课程设计力求生动有趣,以激发学生的学习兴趣。
在教学过程中,注重启发式教学,引导学生主动探索、积极思考,提高学生的综合素质。
通过本课程的学习,期望学生能够达到上述课程目标,为后续计算机科学课程打下坚实基础。
二、教学内容1. 线性表:介绍线性表的定义、特点和基本操作,包括顺序存储和链式存储的实现方法。
教材章节:第一章第一节进度安排:2课时2. 栈和队列:讲解栈和队列的基本概念、性质以及应用场景,实现顺序栈和链栈、循环队列等。
教材章节:第一章第二节进度安排:3课时3. 树和二叉树:阐述树和二叉树的基本概念、性质、存储结构及遍历方法,包括二叉排序树、平衡二叉树等。
教材章节:第二章进度安排:5课时4. 图:介绍图的定义、存储结构、遍历算法以及最短路径、最小生成树等算法。
教材章节:第三章进度安排:5课时5. 排序与查找:讲解常见排序算法(冒泡、选择、插入等)和查找算法(顺序、二分、哈希等),分析其算法复杂度。
C数据结构练习:文学研究助手用C语言实现,代码如下://文学研究助手---C语言实现#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 80void ReadLine(char *,int,FILE *);int search(char *,char *);int main(void){FILE *fp;char ch,temp_line[MAX],keyword[15],on_off;int i=0,j,times,read_line=1;int * record_lineinfo;int lines,k;if( (fp=fopen("source.txt","w")) == NULL ){fprintf(stderr,"Can not open the file\n");exit(0);}printf("Please start to input C/C++ source code,'@' to over!\n");printf("%d: ",++i); //记录了源程序输入的行数while( (ch=getchar()) != '@' ){if( ch == '\n')printf("%d: ",++i);fputc(ch,fp);}while( (ch=getchar()) != '\n' )continue;fclose(fp);record_lineinfo=(int *)malloc(sizeof(int)*(i+1)); //记录每个keyword出现的次数,行号信息if( (fp=fopen("source.txt","r")) == NULL ){fprintf(stderr,"Can not open the file.\n");exit(0);}printf("'Y' to search C keyword,'N' to exit programe:");on_off=getchar();while( on_off == 'Y' || on_off == 'y' ){printf("Please input the C keyword to be searched:");scanf("%s",keyword);for( k=0;k<i;++k)record_lineinfo[k]=0;lines=k=1;rewind(fp);while( lines <= i ) //依次读取文件的每一行{ReadLine(temp_line,MAX,fp);times=search(temp_line,keyword);if( times != 0){record_lineinfo[0]+=times;record_lineinfo[k++]=lines;}lines++;}printf("The keyword %s appears %d times and on ",keyword,record_lineinfo[0]);for( j=1;j<k;++j)printf("%d,",record_lineinfo[j]);puts("lines");printf("'Y' to continue ,'N' to exit:");while( (on_off=getchar()) != '\n' )continue;on_off=getchar();}fclose(fp);free(record_lineinfo);getchar();return 0;}void ReadLine(char * temp,int max,FILE * fp) {char ch;int i=0,count=0;while( (ch=fgetc(fp)) != '\n'){++count;if( count <= max-1 )temp[i++]=ch;elsebreak;}temp[i]='\0';}int search(char *temp,char *key){int times=0;char *position;int LEN=strlen(key);while( (position=strstr(temp,key)) != NULL ) {++times;temp=position+LEN;}return times;}。
题目:文学研究助手【问题描述】文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为“文学研究助手”。
【基本要求】英文小说存放于一个文本文件中。
待统计的词汇集合要依次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
【选作内容】(1)模式匹配要基于KMP算法(2)整个统计过程中只对小说文字扫描一遍以提高效率实验完成情况:②作内容与基本要求都已完成。
②附加了二个功能:算出了所查询的关键词在其出现行的具体位置和在此行出现的次数。
③序共达376行。
程序特色之处:A、用了KMP算法,大大提高了运算速率B、熟练且灵活地运用了链表知识C、熟练且灵活地运用了结构体知识概要设计:【抽象数据类型定义】ADT数据对象:英文字母、空格和标点符号的集合数据关系:其集合构成一篇可读性的文章基本操作:InitList(&L)操作结果:构造一个空链表;InitList_node(&L)操作结果:构造一个总链表里的分链表;copy( &T, chars) (&L)初始条件:已知chars 操作结果:chars数组中的字符付给T.ch;并计算出chars 的长度赋给T.lengthCreateNode(&sl, str)这个函数建立的是总链表里面的结点初始条件:已知str操作结果:建立sl结构体中某要素的节点,并将str相应值赋值给slCreateNode_node (&sl, str)这个函数建立的是总链表里面分链表的结点初始条件:已知str 操作结果:建立sl结构体中某要素的节点,并将str相应值赋值给sladdnode(&ls, link)这个函数建立的是总链表初始条件:已知ls和link 操作结果:将link附加到ls后面add_node(&ls, link)这个函数建立的是总链表里分链表初始条件:已知ls和link 操作结果:将link附加到ls后面Index_KMP (s, t, pos)初始条件:已知字符串s,t 操作结果:找出s中与t相同的开始位置IsNotCharactor(ch)初始条件:已知字符ch操作结果:判断ch是否为英文字母ShowList_node(L)初始条件:已知一个链表的头结点操作结果:将链表的中信息打印出来,并将链表的某些信息再传递下去ShowList(L)初始条件:已知L的相关信息操作结果:打印出L的相关信息find(&stringLinkList, hstrLine, row)初始条件:已知stringLinkList, hstrLine, row操作结果:在串数据链表stringLinkList,读出查找的串strkey,与传入的串hstrLine匹配如果成功将匹配的次数与行数row,写入相对应的行行数据链表Next(s, j)初始条件:已知s,j操作结果:KMP模式匹配的next函数,即找出自身匹配Count_KMP(s, t, pos)初始条件:已知字符串s和t,pos操作结果:求串t在s中出现的次数程序使用说明A.输入正确的打开文件方式,例如:h:\code.txtB.输入所要查询的单词,每输入一个单词就按回车,并最后以符号“#”结束、【程序模块调用关系】A 结构体调用情况整个结构体框架主要以建立两层链表为主体。
课程设计报告课设课题:课程设计——图书管理系统学院:电子信息学院专业:网络工程姓名:班级学号:BX1213指导教师:张艳报告日期:2013.12.12目录一、需求分析 (1)1.1 系统开发背景和意义 (1)1.2 设计题目与要求 (1)二、总体结构设计 (2)三、各子模块设计 (3)3.1 初始化图书信息 (3)3.2 系统主界面 (3)3.3 采编入库 (4)3.4 输入读者信息 (4)3.5 借阅图书 (4)3.6 归还图书 (6)3.7 查询图书信息 (7)3.8 查询读者信息 (8)四、程序设计调试情况分析 (9)五、测试结果 (11)5.1 欢迎界面 (11)5.2 初始化图书信息 (11)5.3 系统主界面 (11)5.4 采编入库 (12)5.5 输入读者信息 (13)5.6 借阅图书 (14)5.7 归还图书 (15)5.8 查询图书信息 (15)5.9 查询读者信息 (16)5.10 保存文件,退出 (18)六、总结 (19)七、参考文献 (20)八、附录(源代码) (21)一、需求分析1.1 系统开发背景和意义图书管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。
这些优点能够极大地提高图书管理的效率。
因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统,将是非常必要的,也是十分及时的。
图书管理系统需要满足来自图书馆工作人员、普通用户和借阅者三方面人员的需求。
图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时还可通过图书编号等查询相应的借阅情况;普通用户的需求是查询图书馆所存的图书的相关情况;图书借阅者的需求是查看自己的相关信息及查询自己的借阅情况。
1.2 设计题目与要求【问题描述】设计一个计算机管理系统完成图书管理基本业务。
【基本要求】1) 每种书的登记内容包括书号、书名、著作者、现存量和库存量;2) 对书号建立索引表(线性表)以提高查找效率;3) 系统主要功能如下:*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;*归还:注销对借阅者的登记,改变该书的现存量。
《数据结构》课程设计实践指导书一、实践的目的和任务《数据结构》课程设计是计算机科学技术专业集中实践性环节之一,是学习完《数据结构》课程后进行的一次全面的综合练习。
开设本课程设计实践的主要目的就是要达到理论与实际应用相结合,提高学生的动手能力,完成计算机应用能力的培养;主要任务是通过对给定问题的求解,使学生在运用《数据结构》、程序设计以及其它所学课程中的各种基本技术和理论,在建立问题模型、构造求解算法、设计数据结构、编程及上机调试等方面得到全面的锻炼,从而能更深刻地理解《数据结构》的精髓,为后续软件课程的学习及软件设计能力的提高奠定良好的基础。
二、实践的内容和要求(一)实践内容实践内容为数据结构课程完成后,运用《数据结构》、程序设计以及其它所学课程中的知识和技术来解决实际的问题。
在解决实际应用性问题时,按照计算机解决问题的步骤进行以下几个方面的工作:采用简明、严格的问题描述,建立模型,设计求解方法,用计算机实现求解方法,最后进行测试和文档制作。
1、建立模型许多问题的最初描述既不精确又不简练,还有一些问题不可能简单而精确地用计算机可求解的形式来描述,即使有些可用计算机求解的问题,也需要在很大范围内确定问题的参数,而那些合理的参数值只有通过实验才能确定。
因此,要用计算机解决问题,必须首先要以简明、严格的方式将问题描述清楚。
数学或其它科学中的几乎所有分支都可作为某一类具体问题的抽象模型。
例如,在涉及到若干对象及其相互间关系的问题时所用的数学模型为图论;数值计算问题中常用的数学模型为线性方程组(用于求解电路的电流强度或结构中的应力)或微分方程(用于预报人口增长情况或化学反应速度等);在符号与文本处理问题时常用字符串及形式语法作为模型(如编译系统)。
《数据结构》课程中所介绍的各种结构均可作为一种模型。
2、构造算法对问题建立了适当的数学模型后,就可以依据这一模型求解。
最初的目标是给出一个算法形式的解法,这是设计的核心部分。
重庆大学课程设计报告课程设计题目:数据结构与算法课程设计学院:软件学院专业:软件工程年级:2014级学生:李庆(组长)唐天吴东学号:20141766(李)20141779(唐)20141765(吴) 完成时间:2015年12月30日成绩:指导教师:蔡斌重庆大学教务处制课程设计指导教师评定成绩表指导教师评定成绩:指导教师签名:年月日说明:1、学院、专业、年级均填全称,如:光电工程学院、测控技术、2003。
2、本表除签名外均可采用计算机打印。
本表不够,可另附页,但应在页脚添加页码。
说明:1、学院、专业、年级均填全称,如:光电工程学院、测控技术、2003。
2、本表除签名外均可采用计算机打印。
本表不够,可另附页,但应在页脚添加页码。
重庆大学本科学生课程设计任务书说明:1、学院、专业、年级均填全称,如:光电工程学院、测控技术、2003。
2、本表除签名外均可采用计算机打印。
本表不够,可另附页,但应在页脚添加页码。
摘要本课程设计实验报告共解决3个问题,解决过程中涉及到大部分主流数据结构算法。
其中主要有栈,递归算法,串的应用,图,图实现的深度和广度遍历。
1)回文判断将字符串按照用户输入的顺序分别入栈和队列,然后二者进行比较。
根据比较结果判断序列是否为回文。
2)推销员问题该问题通过A*算法选择出最短路径,通过一个打开的列表,保存了打开节点的一个值记为F;每次从中取最小F值的节点打开下批子节点;一个关闭列表,将已展开的节点加入其中。
3)文学助手该问题主要是利用数据结构中串和栈知识,核心思想是串的模式匹配算法,采用易于理解且设计简单的串的朴素模式匹配算法,利用堆栈存储匹配字符串的位置。
关键字:程序设计,数据结构与算法,顺序栈,队列,最短路径,模式匹配,商旅问题,图论关于回文判断(1)问题描述试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。
其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。
《数据结构》课程设计报告一、课程目标《数据结构》课程旨在帮助学生掌握计算机科学中数据结构的基本概念、原理及实现方法,培养其运用数据结构解决实际问题的能力。
本课程目标如下:1. 知识目标:(1)理解数据结构的基本概念,包括线性表、栈、队列、串、数组、树、图等;(2)掌握各类数据结构的存储表示和实现方法;(3)了解常见算法的时间复杂度和空间复杂度分析;(4)掌握排序和查找算法的基本原理和实现。
2. 技能目标:(1)能够运用所学数据结构解决实际问题,如实现字符串匹配、图的遍历等;(2)具备分析算法性能的能力,能够根据实际问题选择合适的算法和数据结构;(3)具备一定的编程能力,能够用编程语言实现各类数据结构和算法。
3. 情感态度价值观目标:(1)培养学生对计算机科学的兴趣,激发其探索精神;(2)培养学生团队合作意识,提高沟通与协作能力;(3)培养学生面对问题勇于挑战、善于分析、解决问题的能力;(4)引导学生认识到数据结构在计算机科学中的重要地位,激发其学习后续课程的兴趣。
本课程针对高年级学生,课程性质为专业核心课。
结合学生特点,课程目标注重理论与实践相结合,强调培养学生的实际操作能力和解决问题的能力。
在教学过程中,教师需关注学生的个体差异,因材施教,确保课程目标的达成。
通过本课程的学习,学生将具备扎实的数据结构基础,为后续相关课程学习和职业发展奠定基础。
二、教学内容根据课程目标,教学内容主要包括以下几部分:1. 数据结构基本概念:线性表、栈、队列、串、数组、树、图等;教学大纲:第1章 数据结构概述,第2章 线性表,第3章 栈和队列,第4章 串。
2. 数据结构的存储表示和实现方法:教学大纲:第5章 数组和广义表,第6章 树和二叉树,第7章 图。
3. 常见算法的时间复杂度和空间复杂度分析:教学大纲:第8章 算法分析基础。
4. 排序和查找算法:教学大纲:第9章 排序,第10章 查找。
教学内容安排和进度如下:1. 第1-4章,共计12课时,了解基本概念,学会使用线性表、栈、队列等解决简单问题;2. 第5-7章,共计18课时,学习数据结构的存储表示和实现方法,掌握树、图等复杂结构;3. 第8章,共计6课时,学习算法分析基础,能对常见算法进行时间复杂度和空间复杂度分析;4. 第9-10章,共计12课时,学习排序和查找算法,掌握各类算法的实现和应用。
计算机科学与工程学院集中性实践教学计划书( 2011-2012 学年第二学期课程名称:数据结构与算法课程设计专业:计算机科学与技术软件工程、网络工程班级:计算机科学与技术101-6软件工程101-4网络工程101-4课程负责人:李锡祚、王玲芬、李威指导教师分配情况:专业指导教师计算机科学与技术李威、李笑牛、张恒博、云健、刘爽、包书哲软件工程王玲芬、王鹏杰、王存睿、孙世昶、网络工程李锡祚、姜楠、王晓强、王波教学起止周:第1 至3 教学周一、教学目的与要求:数据结构与算法课程设计的目的是使同学们能够根据数据对象的特性,合理的组织数据并能综合运用数据结构与算法基本知识和程序设计基本知识解决实际问题,培养基本的、良好的程序设计技能。
二、主要阶段、内容、时间及地点安排(以天为单位计:阶段与内容第1阶段:指导教师布置设计任务并解析有关题目的设计指标和任务的具体内容,学生选择题目,明确问题描述和要求,查阅资料。
(1天;各班长或学习委员将本班的选题表交给辅导教师,一人一题,每道题的选择人数原则上不能超过3人,第一天课程设计结束后,每名学生都要确定题目。
第2阶段:明确题目要求、确定数据结构、设计算法,编写程序、调试程序、测试程序(11天;第一周,学生应明确题目要求、确定数据的逻辑结构和存储结构、实现基本操作的编码与调试、实现主菜单。
第二周,完成核心算法的设计、编码与调试。
第三周,完成剩余任务的编码与调试,准备足够的测试数据,对软件进行测试与调试。
第3阶段:完成设计任务,准备验收、答辩(1天;第4阶段:答辩(上机演示,回答教师提问(1天;第5阶段:撰写课程设计报告(2天。
地点与时间地点:金石滩校区图书馆时间:计算机科学与技术:课程设计上机时间表周一周二周三周四周五第一周上午、下午上午第2大节、下午第二周上午、下午上午第2大节、下午第三周上午、下午上午第2大节、下午(验收软件工程:课程设计上机时间表周一周二周三周四周五第一周上午、下午上午、下午下午第二周上午、下午上午、下午下午第三周上午、下午上午、下午下午(验收网络工程:课程设计上机时间表周一周二周三周四周五第一周上午、下午上午下午上午第二周上午、下午上午下午上午第三周上午、下午上午下午上午(验收注:上午8:30~11:10下午1:40~4:20三、课程设计题目及具体要求:1.成绩管理问题描述:给出n个学生的考试成绩表,成绩表包括学生的学号、姓名、考试成绩(高等数学、英语、物理,设计一个简单的成绩管理程序。
数据结构课程设计pdf一、课程目标知识目标:1. 理解数据结构的基本概念,掌握线性表、树、图等常见数据结构的特点及应用场景。
2. 学会分析不同数据结构在解决实际问题中的优缺点,能够选择合适的数据结构进行问题求解。
3. 掌握各类数据结构的存储方式、操作方法及其时间复杂度分析。
技能目标:1. 能够运用所学数据结构知识解决实际问题,提高编程能力和逻辑思维能力。
2. 培养良好的数据结构设计能力,能够针对特定问题设计高效的数据存储和处理方法。
3. 学会使用可视化工具,将抽象的数据结构形象化,提高问题分析和解决能力。
情感态度价值观目标:1. 培养学生对数据结构的兴趣,激发学习热情,树立学科自信。
2. 培养学生的团队合作意识,提高沟通能力,学会倾听、尊重他人意见。
3. 培养学生勇于面对困难、敢于挑战的精神,形成积极向上的学习态度。
课程性质:本课程为计算机科学与技术专业核心课程,旨在帮助学生掌握数据结构的基本知识,提高编程能力和解决问题的能力。
学生特点:学生具备一定的编程基础和逻辑思维能力,但对数据结构的概念和应用尚不熟悉。
教学要求:结合实际案例,注重理论与实践相结合,培养学生的动手能力和创新能力。
通过本课程的学习,使学生能够熟练运用数据结构解决实际问题,为后续课程打下坚实基础。
教学过程中,关注学生的个体差异,充分调动学生的积极性,提高教学效果。
二、教学内容1. 线性表:介绍线性表的定义、特点,重点讲解顺序存储和链式存储方式,以及线性表的相关操作,如插入、删除、查找等。
教材章节:第二章 线性表内容安排:2课时2. 栈和队列:讲解栈和队列的基本概念、操作及应用场景,分析其时间复杂度。
教材章节:第三章 栈和队列内容安排:2课时3. 树:介绍树的基本概念、存储方式、遍历方法,以及二叉树、线索二叉树、二叉排序树等特殊树结构。
教材章节:第四章 树内容安排:4课时4. 图:讲解图的定义、存储方式(邻接矩阵和邻接表)、遍历方法(深度优先搜索和广度优先搜索),以及最小生成树、最短路径等算法。
嘉应学院计算机学院实验报告课程名称:数据结构课程设计开课学期:2017-2018学年第2学期班级:1503指导老师:钟治初实验题目:文学研究助手系统学号:151110127姓名:王泽敏上机时间:2017-10-23“文学研究助手系统”的设计与实现1.设计要求1.1 问题描述文学研究人员需要统计某篇英文小说中某些特定单词的出现次数和位置(行号和列号)。
试写出一个实现这一目标的文字统计系统,称为“文学研究助手系统”。
1.2 需求分析要求建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;检索输出给定单词出现在文本中的行号,以及在该行中出现的位置(列号);统计给定单词在文本文件中出现的总次数。
2 概要设计该设计可分为三个部分实现;第一,建立文本文件,文件名由用户通过键盘输入;第二,检索给定单词:输入一个单词,检索并输出该单词所在的行号和列号;第三,给定单词的计数:输入一个单词,统计输出该单词在文本中的出现次数。
可从3个方面着手设计。
2.1 建立和读入文本文件建立和读入文件的实现步骤如下:(1)定义一个串变量;(2)定义文本文件;(3)输入文件名,打开该文件;(4)循环读入文本行,写入文本文件,其过程如下:While(不是文件输入结束符){读入一文本行至串变量;串变量写入文件;输入是否结束输入标志;}2.2 存储结构设计主串和模式串都采用定长顺序存储表示,其0号单元存放串的长度:#define MAXSTRLEN 255 //最大串长Typedef char SString[MAXSTRLEN+1];//定长顺序存储表示2.3字符串的模式匹配问题本系统使用改进的KMP匹配算法实现字符串的模式匹配问题。
匹配可如下进行:假设以指针i和j分别指示主串和模式中的比较字符,令i的初值为pos,j的初值为1.若在匹配过程中si=sj,则i和j分别增1,若si≠sj匹配失败后,则i不变,j退到next[j]位置再比较,若相等,则指针各自增1 ,否则j再退到下一个next值的位置,依次类推。
直至下列两种情况:一种是j退到某个next值时字符比较相等,则i和j分别增1继续进行匹配;另一种是j退到值为零(即模式的第一个字符失败),则此时i和j也要分别增1,表明从主串的下一个字符起和模式重新开始匹配。
3 模块设计(1 ).模块设计本程序包含3个模块:主程序模块,查找模块,功能模块。
其调用关系如图所示。
3.2 程序(2).子程序及功能设计本系统共设置5个子程序,各子程序的函数名及功能说明如下。
(1) Void get_next(SString T,int next[])//求模式串T 的next 函数值并存入数组next(2) Int Index(SString S,SString T,int pos )//KMP 匹配函数(3) Int lenth(SString str) //取串str 的长度(4) Void find(char name[],SString keys)//查找函数,对于输入的每一个要查找的关键字,从文本文件中逐行读取字符串查找。
//调用(1),(2),(3)(5) Void main() //主函数,负责系统的输入和输出。
调用(4)3.3 函数主要调用关系本系统5程序之间的主要调用关系如图所示。
图中数字是各函数的编号系统函数调用关系图4 详细设计4.1 数据类型定义(1)定长顺序存储串类型的定义#define MAXSTRLEN 255 //最大串长typedef char SString[MAXSTRLEN+1];//串的定长顺序存储表示,0号单元存放串的长度(2)全局变量的定义int next[MAXSTRLEN] //KMP 算法中用到的next 数组4.2 系统主要子程序详细设计(1)主函数模块设计,负责系统的输入输出工作,调用查找函数。
void main(){输入包含路径的文本文件名;输入要查找的关键字个数;一次性输入要查找的关键字;对于每一个关键字,循环调用find函数进行查找统计;}(2)查找模块设计void find(char name[],SString keys){ //该函数是整个程序的重要部分,对于输入的每一个要查询的关键字,从小说文件中逐行//杜取字符串查找SString text; //存放从小说文件中读取的一行字符串int i=1,j=0,k; //i用于存放行号,j用于存放列号,k用于输出格式的控制int n=0; //n用于记录出现的次数FILE *fp;if(!(fp=(fopen(name,"r")))) //打开小说文件{printf("Open file error!\n");exit(0);}keys[0]=lenth(keys); //调用lenth函数求关键字get_next(keys,next);调用get_next函数求模式串(关键字)每一个字符对应的nextprintf("\n%s出现于:\n",&keys[1]); //打印关键字while(!feof(fp)) //如果还没有找到小说文件末尾{k=0;fgets(&text[1],MAXSTRLEN,fp); //从小说文件中读取一行字符串,存入text串中text[0]=lenth(text); //求读入的串的长度j=Index(text,keys,j+1); //调用KMP算法,统计关键字在该行出现的位置,若匹配不成功则返回0if(j!=0){printf("\trow=%d,\tcol=%d",i,j);k++;n++;}while(j!=0){j=Index(text,keys,j+1);if(j!=0){n++;printf(",%d",j);}}i++;if(k)printf("\n");}printf("%s公出现%d次\n",keys[1],n);}(3)其他功能模块设计1.求next函数值void get_next(SString T,int next[]){int j=1,k=0;next[1]=0;while(j<T[0]){if(k==0||T[k]==T[j]){++j;++k;if(T[j]!=T[k])next[j]=k;else next[j]=next[k];}}}2.KMP匹配函数int Index(SString S,SString T,int pos){ //利用模式串T的next函数球T主串S中第POS个字符之后的位置的KMP算法int i=pos,j=1;while(i<=S[0]&&j<=T[0]){if(j==0||S[i]==T[j]) //继续比较后继字符{++i;++j;}else j=next[j]; //模式串向右移动}if(j>T[0])return (i-T[0]); //匹配成功else return 0; //匹配失败}5 测试分析系统运行后,要求用户输入带路径的小说文件名,如图所示。
用户输入D:\shiyan4.txt并回车。
此文本文件已正确建立,内容为:----------------------------------------------------------------- Spring is a delightful season.The temperatures are moderate,and the blooming trees and flowers make the city bright with colors. It is the time when we can begin to wear lighter andmore brightly colored clothes and go outdoors more often.Smaller children like to bring their kites out to thespacious square.Also I enjor going back to the village on this holiday after bejin in the city for the winter months.------------------------------------------------------------------ 回车后,系统提示用户输入待查找的单词个数,如图所示用户输入3并回车,系统提示用户输入单词内容,如图所示6 用户手册(1)本程序执行文件为“文学研究助手系统.exe”。
(2)进入本系统后,随即显示系统主菜单界面。
用户可以在该界面下按提示输入命令并观察结果。
7 实验分工段志芳:负责代码的添加与修改编写代码和测试纠错,严晓燕:编写代码和讨论、分析程序代码测试分析和实验报告的编写8实验心得串是计算机上非数值处理的基本对象,现在已作为一种最常用的变量类型出现在各种程序设计语言中,同时也产生一系列字符串的操作。
9实验创新※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※10附录源代码// shiyan4.cpp : Defines the entry point for the console application.// 文件助手系统.cpp : Defines the entry point for the console application.#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#define MAXSTRLEN 255 //最大串长typedef char SString[MAXSTRLEN+1]; //串的定长顺序存储表示,0号单元存放串的长度int next[MAXSTRLEN]; //KMP算法中用到的next数组//1. 求模式串T的next函数值并存入数组nextvoid get_next(SString T,int next[ ]){ // 求模式串T的next函数值,并存入数组nextint j=1,k=0;next[1]=0;while (j<T[0]){if (k==0 || T[k]==T[j]){++j; ++k;if (T[j]!=T[k]) next[j]=k;else next[j]=next[k];}else k=next[k];}}//2. KMP匹配函数int Index(SString S,SString T,int pos){ // 利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法// 其中T非空,1 pos StrLength(s)int i=pos,j=1;while (i<=S[0]&&j<=T[0]){if (j==0||S[i]==T[j]) {++i;++j;} // 继续比较后继字符else j=next[j]; // 模式串向右移动}if (j>T[0]) return (i-T[0]); // 匹配成功else return 0; // 匹配失败}//3. 求串长int lenth(SString str){int i=1;while(str[i]) i++;return(i-1);}//4. 查找函数void find(char name[],SString keys) //该函数是整个程序的重要部分,对于输入的每一个{ //要查找的关键字,从小说文件中逐行读取字符串查找SString text; //存放从小说文件读取的一行字符串int i=1,j=0,k; //i用于存放行号,j用于存放列号,k用于输出格式的控制int n=0; //n记录出现次数FILE *fp;if (!(fp=(fopen(name,"r")))) //打开小说文件{printf("Open file error!\n");exit(0);}keys[0]=lenth(keys); //调用lenth函数求关键字的长度get_next(keys,next); //调用get_next函数求模式串(关键字)每一个字符对应的next值printf("\n%s出现于:\n",&keys[1]); //打印关键字while (!feof(fp)) //如果还没到小说文件末尾{k=0;fgets(&text[1],MAXSTRLEN,fp); //从小说文件中读取一行字符串,存入text串中text[0]=lenth(text); //求读入的串的长度j=Index(text,keys,j+1); //调用KMP算法,统计关键字在该行出现的位置,若匹配不成功则返回0if (j!=0){ printf("\trow=%d,\tcol=%d",i,j); k++; n++;} //若匹配成功则打印行号和列号while(j!=0) //若该行找到了关键字,则继续寻找看是否还能匹配成功{j=Index(text,keys,j+1); //调用KMP算法从刚找到的列号后一字符起匹配if (j!=0){ n++;printf(",%d",j); } //若匹配成功,则打印列号}i++; //行号加1,在下一行中寻找if (k) printf("\n"); //输出格式控}printf("%s共出现%d次\n",&keys[1],n);}//5. 主函数void main(){char name[50]; //存储输入的小说路径字符串SString words[10]; //定义字符串数组,用于存储输入的关键字int n,i;printf("请输入已创建的文本文件的路径(如D:\\novel.txt):\n");scanf("%s",name); //用户输入包含路径的文本文件名printf("请输入要查找的单词数n (n<10):\n");scanf("%d",&n); //用户输入要查找的关键字个数printf("请输入要查找的单词,词与词之间用空格隔开(区分大小写):\n");for (i=0;i<n;i++)scanf("%s",&words[i][1]); //用户一次性输入要查找的关键字,words[i][0]用于存放字符串的长度for (i=0;i<n;i++)find(name,words[i]); //对于每一个关键字,调用find函数进行查找统计}。