单词的检索与计数教材

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

内江师范学院计算机科学学院

数据结构课程设计报告

课题名称:文本文件单词的检索与计数

姓名:

学号:

专业班级:软件工程

系(院):计算机科学学院

设计时间:20XX 年X 月X日

设计地点:

成绩:

1.课程设计目的

(1).训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。

(2).初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

(3).提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

(4).训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。

2.课程设计任务与要求:

文本文件单词的检索与计数软件

任务:编写一个文本文件单词的检索与计数软件, 程序设计要求:

1)建立文本文件,文件名由用户键盘输入

2)给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数

要求:

(1)、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。

(2)、设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。

(3)、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;

(4)、每位同学需提交可独立运行的程序;

(5)、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于8页(代码不算);

(6)、课程设计实践作为培养学生动手能力的一种手段,单独考核。

3.课程设计说明书

一需求分析

3.1 串模式匹配算法的设计要求

在串的基本操作中,在主串中查找模式串的模式匹配算法——即求子串位置的函数Index(S,T),是文本

处理中最常用、最重要的操作之一。

所谓子串的定位就是求子串在主串中首次出现的位置,又称为模式匹配或串匹配。模式匹配的算法很多,在这里只要求用最简单的朴素模式匹配算法。该算法的基本思路是将给定子串与主串从第一个字符开始比较,找到首次与子串完全匹配的子串为止,并记住该位置。但为了实现统计子串出现的个数,不仅需要从主串的第一个字符位置开始比较,而且需要从主串的任一给定位置检索匹配字符串,所以,首先要给出两个算法:

1.标准的朴素模式匹配算法

2.给定位置的匹配算法

3.2 文本文件单词的检索与计数的设计要求

要求编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个单词出现在文本中的行号、在该行中出现的次数以及位置。

该设计要求可分为三个部分实现:其一,建立文本文件,文件名由用户用键盘输入;其二,给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数;其三,检索给定单词,输入一个单词,检索并输出该单词所在的行号、该行中出现的次数以及在该行中的相应位置。

1.建立文本文件

2.给定单词的计数

3.检索单词出现在文本文件中的行号、次数及其位置

4.主控菜单程序的结构

二概要设计

2.1建立文本文件

定义一个串变量,定义文本文件,输入文件名,打开该文件,循环读入文本行,写入文本文件,关闭文件。

2.2给定单词的计数

逐行扫描文本文件。匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次数

2.3检索单词出现在文本文件中的行号、次数及其位置

逐行扫描文本文件。扫描一个单词,单词数加1,匹配一个,计数器加1,输出该单词数,行数到底,以此,行数加1,单词数清零,直到整个文件扫描结束;然后输出单词的次数,行号,第几个单词。

三详细设计

朴素模式匹配算法

该算法的基本思想是:设有三个指针——i,j,k,用i指示主串S每次开始比较的位置;指针j,k分别指示主串S和模式串T中当前正在等待比较的字符位置;一开始从主串S的第一个字符(i=0;j=1)和模式T的第一个字符(k=0)比较,若相等,则继续逐个比较后续字符(j++,k++)。否则从主串的下一个字符(i++)起再重新和模式串(j=0)的字符开始比较。依此类推,直到模式T中的所有字符都比较完,而且一直相等,

则称匹配成功,并返回位置i;否则返回-1,表示匹配失败。

顺序串的模式匹配算法如下:

int index(SString S, SString T)

{ //求子串T在主串S中首次出现的位置

int i,j,k,m,n;

m=T.length; //模式串长度赋m

n=S.length; //目标串长度赋n

for (i=0; i<=n-m; i++)

{

j=0; k=i; // 目标串起始位置i送入k

while (j<=m && s.ch[k]==t.ch[j])

{k++; j++;} //继续下一个字符的比较

if (j==m) //若相等,则说明找到匹配的子串,返回匹配位置i,

//否则从下一个位置重新开始比较

return i;

} //endfor

return -1;

} //endIndex

给定位置的串匹配算法

该算法要求从串S1(为顺序存储结构)中第k个字符起,求出首次与字符串S2相同的子串的起始位置。

该算法与上面介绍的模式匹配算法类似,只不过上述算法的要求是从主串的第一个字符开始,该算法是上述算法的另一种思路:从第k个元素开始扫描S1,当其元素值与S2的第一个元素的值相同时,判定它们之后的元素值是否依次相同,直到S2结束为止。若都相同,则返回当前位置值;否则继续上述过程,直至S1扫描完为止,其实现算法如下:

Int PartPosition(SString S1, SString S2, int k)

{

int i, j;

i=k-1; //扫描s1的下标,因为c中数组下标是从0开始,串中序号相差1

j=0; //扫描s2的开始下标

while (i

if (s1.ch[i]==s2.ch[j])

{ i++; j++; //继续使下标移向下一个字符位置}

else

{ i=i-j+1; j=0;

//使i下标回溯到原位置的下一个位置,使j指向s2的第一个字符,再重新比较} if (j>=s2.length)

return i- s2.length; //表示s1中存在s2,返回其起始位置

else

return -1; //表示s1中不存在s2,返回-1

} //函数结束

说明:以上两个算法可统一为一个算法,即在子串定位算法Index(S,T)的参数中增加一个起始位置参数即可。

相关文档
最新文档