文学研究助手课程设计报告

上传人:飞*** 文档编号:33961109 上传时间:2018-02-19 格式:DOC 页数:12 大小:120.50KB
返回 下载 相关 举报
文学研究助手课程设计报告_第1页
第1页 / 共12页
文学研究助手课程设计报告_第2页
第2页 / 共12页
文学研究助手课程设计报告_第3页
第3页 / 共12页
文学研究助手课程设计报告_第4页
第4页 / 共12页
文学研究助手课程设计报告_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《文学研究助手课程设计报告》由会员分享,可在线阅读,更多相关《文学研究助手课程设计报告(12页珍藏版)》请在金锄头文库上搜索。

1、文学研究助手的课程设计报告书题目:文学研究助手的程序设计班级:计算机 0506 班姓名:覃韩锋学号:0120510340622完成日期:2007-7-6一、问题描述:文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一个实现这一目标的文字统计系统,称为“文学研究助手” 。英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。二、需求分析:1、 文本串非空且以文件形式存放,统计匹配的词集非空。文件名和词集均由用户从键盘输入;2、 “单词”定义:由字母构成的字符

2、序列,中间不含空格字符且区分大小写;3、 待统计的“单词”在文本串中不跨行出现,它或者从行首开始,或者前置若干空格字符;4、 在计算机终端输出的结果是:单词,出现的次数,出现的位置所在行的行号,同一行出现两次的只输出一个行号;5、 测试数据:将实验的源程序作为测试文件,从中任意选取“单词”作为测试的词集。三、概要设计:采用截取字符串、比较字符串的模式来完成“单词匹配比较” ,从而统计出其出现的位置和次数。1、数据结构定义:程序将涉及到如下两个线性表结构的数据类型,用类 C 语言描述如下:(1) 定义从文本读取的“单词串”类型:ADT FileString数据对象:D=Si | Si 标准 c+

3、 字符串集合,i = 1,2,3,.,n,n 0;数据关系:R1= | Si-1,Si D,i = 1,2,3,.,n基本操作:createFileString (FSList 初始条件:已知一个空的“文本单词串表头” ;操作结果:生成一个空的“文本单词串序列” ;insertFileString (FSList 初始条件:FSL 为文本字符串序列的表头 str 为一个标准的 c+字符串,row 代表了字符串出现的行数;操作结果:将 str 插入到文本字符串序列中,不需要排序;若 FSL 为空表头,则创建一个字符串序列;否则插在字符串序列尾部;getFSLength (FSList FSL);

4、初始条件:FSL 为文本字符串序列的表头;操作结果:获取以 FSL 为表头的文本字符串的长度printFileString (FSList FSL);初始条件:FSL 为文本字符串序列的表头;操作结果:打印以 FSL 为表头的文本字符串中的所有字符串;readFile (FSList 初始条件:FSL 为文本字符串序列的表头;操作结果:从文件中读取字符串序列,并将其保留在以 FSL 为表头的字符串序列中;clearFileString (FSList 初始条件:FSL 为文本字符串序列的表头;操作结果:以 FSL 为表头的文本字符串序列被清空;ADT FileString(2) 定义从键盘读取

5、的“单词串”类型:ADT KeyString数据对象:D=Si | Si 标准 c+ 字符串集合,i = 1,2,3,.,n,n 0;数据关系:R1= | Si-1,Si D,i = 1,2,3,.,n基本操作:createKeyString (KSList 初始条件:已知一个空的“键盘单词串表头” ;操作结果:生成一个空的“键盘单词串序列” ;insertKeyString (KSList 初始条件:KSL 为键盘字符串序列的表头 str 为一个标准的 c+字符串,row 代表了字符串出现的行数;操作结果:将 str 插入到键盘字符串序列中,不需要排序;若 KSL 为空表头,则创建一个字符串

6、序列;否则插在字符串序列尾部;getKSLength (KSList KSL);初始条件:KSL 为键盘字符串序列的表头;操作结果:获取以 KSL 为表头的键盘字符串的长度printKeyString (KSList KSL);初始条件:KSL 为键盘字符串序列的表头;操作结果:打印以 KSL 为表头的键盘字符串中的所有字符串;readKey (KSList 初始条件:KSL 为文本字符串序列的表头;操作结果:从键盘中读取字符串序列,并将其保留在以 KSL 为表头的字符串序列中;clearKeyString (KSList 初始条件:KSL 为文本字符串序列的表头;操作结果:以 KSL 为表头

7、的文本字符串序列被清空;ADT KeyString2、模块设计:1) 主程序模块:主函数设计如下int main ( ) 登陆界面和使用提示;构建文本字符串序列;构建键盘字符串序列;构建模式匹配排除符集合;字符串模式匹配,统计单词;结束一轮工作,提示是否继续操作;2) 文本字符串模块-构建文本字符串序列;3) 键盘字符串模块-实现键盘字符串数据类型;4) 模式匹配模块- 实现文本字符串和键盘字符串的匹配统计;5) 登陆界面模块-提示用户程序使用方法3、各模块间的调用关系: 主程序模块登录模块模式匹配模块文本字符串模块 键盘字符串模块四、详细设计1、主程序用到的宏定义:#define MAX_W

8、ORD_LENGTH 1000 /最大字符串长度#define MAX_MODELEXCEPTION_LENGTH 50#define FILE_NAME_LENGTH 100 /文件名长度2、存储结构设/* 从文件读取的字符串集合*/typedef struct FileStringstring name; /字符串名称int row; /字符串所在的行FileString * next; /邻接字符串FileString,*FSList;/* 从键盘读取的字符串集合*/typedef struct KeyStringstring name; /字符串名称int * rows; /字符串所在

9、行向量int count; /字符串出现的次数KeyString * next; /邻接字符串KeyString,*KSList;/* 匹配文本字符串和键盘字符串的模式匹配排除符集合*/typedef char * Model;3、主要算法设计:/* 在文件字符串集合中插入新的字符串*/int insertFileString(FSList & FSL,string str,int row)if(!FSL) /如果是空表,则创建集合createFileString(FSL);FSList sp ,tp;sp = tp = FSL;while(sp = sp -next)tp = sp;FSLi

10、st s = new FileString; /插在既有的集合中if(!s)coutname = str;s-row = row;s-next = NULL;tp-next = s; /顺序插入return 1;/* 从文件中读取串*/int readFile(FSList & FSL)char urlFILE_NAME_LENGTH; /指向文件路径的 const 指针coutmatch;cin.ignore(); /避免其他方法的流操作带来负面影响int i = 0;while(match = y)if(!i)cout; modeli+28 = ?; modeli+29 = /;model

11、i+30 = ; modeli+31 = t; modeli+32 = 0; /串尾标志return 1;/* 模式匹配方法*/bool modelMatch(string s,Model model,int pos)for(int i = strlen(model) -1 ;i=0;i-)if(spos = modeli)return true;return false;/* 查找模式串 T 在主串 S 中出现的次数*/int count(string S,const string T,Model model)int count = 0;const char * tc = T.c_str()

12、;int i = 0;while(i next)FSList fp = FSL;/sp 是 SL 的副本操作int * row = new intgetFSLength(FSL)+1;/对于键盘字符串集合中的每个字符串,/row 都会重新申请空间int * r = row;kp-rows = row;while(fp = fp-next)int c = count(fp-name,kp-name,model);if(c) /kp-name 在 fp-name 出现了,则统计其位置kp-count += c;*r = fp-row;r+;*r = 0;/堆栈指针指向空间最后单元的下个单元赋 NU

13、LL 值五、调试报告:1、 程序在设计过程中主要遇到了如下几个主要的问题:1) 从文本中读取文件时的错误。最典型的错误就是当键入的文件名为空时,程序会抛掷异常,且给出严重的警告。该问题的发现,是在我对主程序模块作了添加一个 dowhile()循环后发现的。经过调试分析,我发现问题在于 readFile(FSList & FSL)模块中的语句:gets(url) ;当第一轮循环结束后,欲再继续二轮循环时,会执行指令:cinon ;该语句只接受了 on 的赋值,却将 enter 键传给了下一轮的gets(url) ;从而导致错误。我初步的修改是取一个折中的方法,在 readFile(FSList

14、& FSL)模块中添加语句:cin.ignore() ;这样自然会忽略 enter 键的键入,但使得初次循环在输入文件名时,要先回车,后输入文件回车。给用户很不好理解的困惑。于是,我又再次修改:将 cin.ignotrz()添加到主程序模块中 cinon;语句之后;这样就可以忽略 enter,同时又保证程序模块可以复用,不会产生读取错误,如当前版本所示。2) 在统计单词匹配时发生的错误。这里的主要问题是关于模式匹配排除符的把握问题,具体体现在算法 count(string S,const string T,Model model)中。模式匹配排除是我自己在设计程序的过程中提出的一个术语。我起初

15、并没有想过提出这么一个概念,而是想以一个 condition 的 bool 变量来表示。后来,我看到若手工指定排除符,则 condition 的内容就是变化的,而且随着定义的排除符的数目的不同,每次对 condition 的修改都会引起程序大规模的改动。特别是在我想到将 condition 区分为用户特别指定和程序初始化时的默认分配情况时,这种由 condition 控制的表示就越来越有问题,这迫使我想到用一种数据结构来封装和模式匹配的相关操作。于是,我提出了模式匹配排除符的概念,并且对其作了相应的处理。其中,仿照windows 程序的消息机制,我也对排除符做了相应的规划,区分为特别的排除符和默认的排除符,具体的实现机制在 getModelException (Model & model) 算法中。3) 程序设计中对动态内存分配的妥善处理。由于文本字符串序列和键盘字符串序列长度的不确定性,而且又用到了链式存储结构,故对内存分配的处理是很关键的。本程序中 new 操作多达 7 次(在不考虑是否处于循环体中的情况下) 。其中算法locate(FSList & FSL,KSList & KSL,Model model)在动态分配了内存给 rows 变量后,并没有回收内存,这就考虑到跨模块去回收内存的问题。我定义了一个 clear*()函数,用来清理由 FS

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号