保捱科技网
您的当前位置:首页本文件单词的检索与计数 说明书

本文件单词的检索与计数 说明书

来源:保捱科技网


中北大学

数 据 结 构

课 程 设 计 说 明 书

学生姓名: 学 院: 专 业: 题 目: 指导教师

焦楠 学 号: 软件学院 软件开发与测试 1021011737 本文件单词的检索与计数 李瑞红

2011年12月20日

1. 设计任务概述(包括系统总体框图及功能描述)

1建立文本文件

定义一个串变量 定义文本文件 输入文件名,打开该文件 循环读入文本行,写入文本文件While是文本文件 YN读入一文本行至串变量串变量写入文件文件输入结束关闭文件

1

2给定单词的计数

给定一个单词定义N=1,S=0一共给了M个单词扫描第N个单词NIf第N个单词与所给单词相同YS=S+1N=N+1YIf N<=MN输出S及为单词的计数结束

2

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

输入文本文件名假设一共X行每行Y个单词输入要检索的单词定义L=1,I=0,N=1L为行数I为次数N为第几个单词扫描第L行第N个单词If第N个单词与Y所给单词相同N输出NI=I+1N=N+1YIf N<=XN输出L输出IN=1I=0L=L+1If L<=YNY结束 3

2. 本设计所采用的数据结构(如:链表、栈、树、图等)

本程序是采用邻接矩阵、邻接表、十字链表等多种结构存储来实现本文件单词的检索与计数.

3. 功能模块详细设计

要求编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个单词出现在文本中的行号、在该行中出现的次数以及位置。该设计要求可分为三个部分实现:其一,建立文本文件,文件名由用户用键盘输入;其二,给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数;其三,检索给定单词,输入一个单词,检索并输出该单词所在的行号、该行中出现的次数以及在该行中的相应位置。 3.1 详细设计思想

这次课程设计我们主要是应用以前学习的数据结构与面向对象程序设计知识, 结合起来才完成了这个程序。

首先创立一个文本文件, 然后输入文本文件,计数单词出现的次数,最后检索某单词的行号,出现次数,以及位置。这样本文件单词的检索与计数就完成了。

3.2 核心代码 #include #include #include

#define MaxStrSize 256 //根据用户需要自己定义大小 using namespace std; typedef struct {

char ch[MaxStrSize]; //ch是一个可容纳256个字符的字符数组 int length; } SString;//定义顺序串类型

int PartPosition (SString s1,SString s2,int k) { int i,j; i=k-1;

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

while(i4

{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; else

return -1;//表示s1中不存在s2,返回-1 //表示s1中存在s2,返回其起始位置 } //函数结束

void CreatTextFile() {

SString S; char fname[10],yn; FILE *fp;

printf(\"输入要建立的文件名:\"); scanf(\"%s\ fp=fopen(fname,\"w\"); yn='n';//输入结束标志初值 while(yn=='n'||yn=='N') {

printf(\"

5

\");gets(S.ch);gets(S.ch);

S.length=strlen(S.ch); fwrite(&S,sizeof(S),1,fp);

printf(\"结束输入吗?y or n :\");yn=getchar(); }

fclose(fp);//关闭文件 printf(\"建立文件结束!\"); }

void SubStrCount() {

FILE *fp;

SString S,T;//定义两个串变量 char fname[10]; int i=0,j,k;

printf(\"输入文本文件名:\"); scanf(\"%s\ fp=fopen(fname,\"r\");

printf(\"输入要统计计数的单词:\"); cin>>T.ch;

T.length=strlen(T.ch);

while(!feof(fp)){ //扫描整个文本文件

fread(&S,sizeof(S),1,fp);//读入一行文本 k=0; //初始化开始检索位置

while(kj=PartPosition(S,T,k);//调用串匹配函数 if(j<0 ) break; else {

i++;//单词计数器加1

6

k=j+T.length;//继续下一字串的检索 } } }

printf(\"\\n单词%s在文本文件%s出现%d次\\n\ }

void SubStrInd() { FILE *fp;

SString S,T; //定义两个串变量 char fname[10]; int i,j,k,l,m;

int wz[20]; //存放一行中字串匹配的多个位置 printf(\"输入文本文件名:\"); scanf(\"%s\ fp=fopen(fname,\"r\");

printf(\"输入要检索的单词:\"); scanf(\"%s\ T.length=strlen(T.ch); l=0; //行计数器置0

while(!feof(fp)) { //扫描整个文本文件 fread(&S,sizeof(S),1,fp); //读入一行文本 l++; //行计数器自增1 k=0;//初始化开始检索位置 i=0; //初始化单词计数器

while(kj=PartPosition(S,T,k); //调用串匹配函数 if(j<0) break;

7

else {

i++;//单词计数器加1 wz[i]=j;//记录匹配单词位置 k=j+T.length;//继续下一字串检索 } } if(i>0){

printf(\"行号:%d,次数:%d,位置分别为:\ for(m=1;m<=i;m++) printf(\"\\n\"); } } }

int main() {

void CreatTextFile(),SubStrCount(),SubStrInd(); int xz; do {

printf(\"* * * * * * * * * * * * * * * * * * * * * *\\n\");

printf(\"*文本文件的检索、字串的统计及定位 *\\n\");

printf(\"* * * * * * * * * * * * * * * * * * * * * *\\n\");

printf(\"%4d\

printf(\"* 1. 建立文本文件 *\\n\");

printf(\"* 2. 单词字串的计数 *\\n\");

printf(\"* 3. 单词字串的定位 *\\n\");

printf(\"* 4. 退出整个程序

8

*\\n\");

printf(\"* * * * * * * * * * * * * * * * * * * * * *\\n\"); printf(\" 请选择(1--4) \");

scanf(\"%d\ switch(xz) {

case 1 : CreatTextFile();break; case 2 : SubStrCount();break; case 3 : SubStrInd();break; case 4 : return 0;

default:printf(\"选择错误,重新选 \\n\"); } }while(1); }

3.3 程序运行结果(拷屏)

1未输入文件前的页面

2输入文本文件,计数单词出现的次数

9

3检索某单词的行号,出现次数,以及位置

10

4. 课程设计心得、存在问题及解决方法

经过一周的奋斗,这次数据结构的课程设计终于做完了。通过这次设计我也着实又感受了一次编程的乐趣,从中也学到了不少知识。

感受最深的一点是:以前用编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。现在编程感觉完全不同了。在编写一个程序之前,先对这个课程设计进行了一下分析,将每个要求都花了一下算法流程图,使得自己的思路更加的清晰了 。 然后进行编程,不断的在电脑上调试程序,终于完成了此次的课程设计。

另外,我还体会到深刻理解数据结构的重要性。只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。

通过这次课程设计逐渐提高了自己的程序设计和调试能力,我以前对算法一直很害怕,总是看不明白究竟这程序中间的过程是怎么进行的。在这次实验中我终于克服了这一障碍,一遍遍在心中自己默默的走,终于弄明白了,真的是功夫不负有心人啊!

这次试验也让我看到了自己的不足,还是不太用模板类。还有许多关于C++的一些比较具体的东西还不太懂,比方说指针。这次试验还让我意识到只有不断的在电脑上调试程序,自己的水平才能得到提高。

我会继续我们的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步和提高。

11

因篇幅问题不能全部显示,请点此查看更多更全内容