文学研究助手系统_第1页
文学研究助手系统_第2页
文学研究助手系统_第3页
文学研究助手系统_第4页
文学研究助手系统_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验名称: “文学研究助手系统”的设计与实现实验人员: xxx xxx专业班级: 11计科专业 实验指导老师: xxx xxxx实验日期: 2013年3月21日 目 录1.设计要求31.1 问题描述31.2 需求分析32 概要设计32.建立和读入文本文件32.2 存储结构设计32.3字符串的模式匹配问题33 模块设计43.1 模块设计43.2 程序子程序及功能设计43.3 函数主要调用关系44 详细设计44.1 数据类型定义44.2 系统主要子程序详细设计45 测试分析66用户手册77实验分工78实验心得79实验创新710附录 源代码9“文学研究助手系统”的设计与实现1.设计要求 1.1 问题

2、描述文学研究人员需要统计某篇英文小说中某些特定单词的出现次数和位置(行号和列号)。试写出一个实现这一目标的文字统计系统,称为“文学研究助手系统”。1.2 需求分析要求建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;检索输出给定单词出现在文本中的行号,以及在该行中出现的位置(列号);统计给定单词在文本文件中出现的总次数。2 概要设计该设计可分为三个部分实现;第一,建立文本文件,文件名由用户通过键盘输入;第二,检索给定单词:输入一个单词,检索并输出该单词所在的行号和列号;第三,给定单词的计数:输入一个单词,统计输出该单词在文本中的出现次数。可从3个方面着手设计。2.1

3、 建立和读入文本文件建立和读入文件的实现步骤如下:(1)定义一个串变量;(2)定义文本文件;(3)输入文件名,打开该文件;(4)循环读入文本行,写入文本文件,其过程如下:While(不是文件输入结束符) 读入一文本行至串变量; 串变量写入文件; 输入是否结束输入标志;2.2 存储结构设计主串和模式串都采用定长顺序存储表示,其0号单元存放串的长度:#define MAXSTRLEN 255 /最大串长Typedef char SStringMAXSTRLEN+1;/定长顺序存储表示2.3字符串的模式匹配问题本系统使用改进的KMP匹配算法实现字符串的模式匹配问题。匹配可如下进行:假设以指针i和j分

4、别指示主串和模式中的比较字符,令i的初值为pos,j的初值为1.若在匹配过程中si=sj,则i和j分别增1,若sisj匹配失败后,则i不变,j退到nextj位置再比较,若相等,则指针各自增1 ,否则j再退到下一个next值的位置,依次类推。直至下列两种情况:一种是j退到某个next值时字符比较相等,则i和j分别增1继续进行匹配;另一种是j退到值为零(即模式的第一个字符失败),则此时i和j也要分别增1,表明从主串的下一个字符起和模式重新开始匹配。3 模块设计(1 ).模块设计本程序包含3个模块:主程序模块,查找模块,功能模块。其调用关系如图所示。主程序模块查找模块功能模块3.2 程序(2).子程

5、序及功能设计本系统共设置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() /主函数,负责系统的输入和输出

6、。调用(4)3.3 函数主要调用关系本系统5程序之间的主要调用关系如图所示。图中数字是各函数的编号5 main()4 fine(char name,SString keys)123系统函数调用关系图4 详细设计4.1 数据类型定义(1)定长顺序存储串类型的定义#define MAXSTRLEN 255 /最大串长typedef char SStringMAXSTRLEN+1;/串的定长顺序存储表示,0号单元存放串的长度(2)全局变量的定义int nextMAXSTRLEN /KMP算法中用到的next数组4.2 系统主要子程序详细设计(1)主函数模块设计,负责系统的输入输出工作,调用查找函数。

7、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"

8、;) /打开小说文件printf("Open file error!n");exit(0);keys0=lenth(keys); /调用lenth函数求关键字get_next(keys,next);调用get_next函数求模式串(关键字)每一个字符对应的nextprintf("n%s出现于:n",&keys1); /打印关键字while(!feof(fp) /如果还没有找到小说文件末尾k=0;fgets(&text1,MAXSTRLEN,fp); /从小说文件中读取一行字符串,存入text串中text0=lenth(text); /求读

9、入的串的长度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",keys1,n);(3)其他功能模块设计1.求next函数值void get_next(SString T

10、,int next)int j=1,k=0;next1=0;while(j<T0)if(k=0|Tk=Tj)+j;+k;if(Tj!=Tk)nextj=k;else nextj=nextk;2.KMP匹配函数int Index(SString S,SString T,int pos) /利用模式串T的next函数球T主串S中第POS个字符之后的位置的KMP算法int i=pos,j=1;while(i<=S0&&j<=T0)if(j=0|Si=Tj) /继续比较后继字符+i;+j;else j=nextj; /模式串向右移动if(j>T0)return

11、(i-T0); /匹配成功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 col

12、ored clothes and go outdoors more often.Smaller children like to bring their kites out to the spacious square.Also I enjor going back to the village on thisholiday after bejin in the city for the winter months.-回车后,系统提示用户输入待查找的单词个数,如图所示用户输入3并回车,系统提示用户输入单词内容,如图所示6 用户手册(1)本程序执行文件为“文学研究助手系统.exe”。(2)进入本

13、系统后,随即显示系统主菜单界面。用户可以在该界面下按提示输入命令并观察结果。7 实验分工段志芳:负责代码的添加与修改编写代码和测试纠错,严晓燕:编写代码和讨论、分析程序代码测试分析和实验报告的编写8 实验心得串是计算机上非数值处理的基本对象,现在已作为一种最常用的变量类型出现在各种程序设计语言中,同时也产生一系列字符串的操作。9 实验创新10 附录 源代码/ shiyan4.cpp : Defines the entry point for the console application./ 文件助手系统.cpp : Defines the entry point for the consol

14、e application.#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#define MAXSTRLEN 255 /最大串长typedef char SStringMAXSTRLEN+1; /串的定长顺序存储表示,0号单元存放串的长度int nextMAXSTRLEN; /KMP算法中用到的next数组/1. 求模式串T的next函数值并存入数组nextvoid get_next(SString T,int next ) / 求模式串T的next函数值,并存入数组nextint j

15、=1,k=0;next1=0; while (j<T0)if (k=0 | Tk=Tj) +j; +k; if (Tj!=Tk) nextj=k;else nextj=nextk;else k=nextk;/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<=S0&&j<=T0)if (j=0|Si=Tj) +i;+j; / 继续比较后

16、继字符else j=nextj; / 模式串向右移动 if (j>T0) return (i-T0); / 匹配成功 else return 0; / 匹配失败/3. 求串长int lenth(SString str) int i=1;while(stri) i+;return(i-1);/4. 查找函数void find(char name,SString keys) /该函数是整个程序的重要部分,对于输入的每一个 /要查找的关键字,从小说文件中逐行读取字符串查找SString text; /存放从小说文件读取的一行字符串 int i=1,j=0,k; /i用于存放行号,j用于存放列号

17、,k用于输出格式的控制int n=0; /n记录出现次数FILE *fp;if (!(fp=(fopen(name,"r") /打开小说文件printf("Open file error!n");exit(0);keys0=lenth(keys); /调用lenth函数求关键字的长度 get_next(keys,next); /调用get_next函数求模式串(关键字)每一个字符对应的next值 printf("n%s出现于:n",&keys1); /打印关键字while (!feof(fp) /如果还没到小说文件末尾k=0;

18、fgets(&text1,MAXSTRLEN,fp); /从小说文件中读取一行字符串,存入text串中text0=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(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论