课设报告统计英文单词数.docx
《课设报告统计英文单词数.docx》由会员分享,可在线阅读,更多相关《课设报告统计英文单词数.docx(20页珍藏版)》请在冰豆网上搜索。
![课设报告统计英文单词数.docx](https://file1.bdocx.com/fileroot1/2023-7/27/632d91b4-f7e2-4edd-a769-08ed943e6f9f/632d91b4-f7e2-4edd-a769-08ed943e6f9f1.gif)
课设报告统计英文单词数
“程序设计基础”
课程设计报告
(一)需求和规格说明
该系统的功能是给定一个英文段落(单词个数<100),利用哈希表(表长最大为20)统计单词出现的频度,并能根据要求显示出给定单词在段落中出现的位置。
执行程序时由用户在键盘上输入程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
该系统的实现是通过哈希函数的建立和查找分析,用线性探测再散列来处理冲突,从而得到哈希表并实现哈希表的查找。
该文章对哈希函数的应用方法是使用除留余数法构造,使用链地址法进行冲突处理。
2.1技术可行性
哈希查找是通过计算数据元素的存储地址进行查找的一种方法。
哈希查找的操作步骤:
用给定的哈希函数构造哈希表;
根据选择的冲突处理方法解决地址冲突;
在哈希表的基础上执行哈希查找。
2.2需求可行性
世界上的事物都是有发展的,企图跨越阶段或者停滞,一切生命就都没有存在的理由了。
频率就是一个既动态又静态的东西,我们能肯定的是很多古词和今词是不一样的,今日被淘汰了,也就是说,今天的频率的统计是一定有确定的结论的。
也有一些古词仍在今日用着,或者在淘汰之中,所以频率难以确定。
我们知道黑天和白天是有区别的,但它们的交界点,却不是那么容易分辨了,恐怕需要经过科学家的精密研究。
交界点不容易确定,并不意味着事物之间没有区别。
世界上的事物都是有区别又有联系的。
有些人读书读傻了,钻了牛角尖,他弄不清两个事物之间的区别应该划在哪里,后来就连两个事物之间有区别也不敢认定了。
频率的统计是为了区别常用词和非常用词,方法可能不准确,但不至于否定常用词和非常用词之间的区别吧。
我们应该使统计精密起来。
火车今天不用火了,但如果当初也不用,就没有今天的“火车”了。
事物的变化是不可能停止的,但总还有个静态的定位,否则人们就无法认识任何事物了。
频率虽然是个复杂的问题,但科学的研究是必要的。
3需求分析
给定一个英文段落(单词个数<100),利用哈希表(表长最大为20)统计单词出现的频度,并能根据要求显示出给定单词在段落中出现的位置。
执行程序时由用户在键盘上输入程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
测试数据:
给定一个英文段落
显示出不同英文单词的出现频度。
给定一个英文单词,判断段落中是否含有该单词,如有,依次显示出该单词在段落中出现的位置。
基本要求:
哈希函数使用除留余数法构造,使用链地址法进行冲突处理。
(二)设计
构造哈希函数
voidinitial()//哈希表的初始化
{for(inti(0);i<100;i++)
{haxilist[i].head=NULL;
haxilist[i].tail=NULL;}
cout<<"哈希表初始化完成,准备读入文件,请将需要操作的文件命名为file.txt放到文件夹中"<}
读取数据:
voidinput()//读入文件
{cout<<"开始读入文件..."<fstreaminfile;
infile.open("file.txt",ios:
:
in);
if(!
infile)
{cout<<"Filecan'tbeopen"<abort();
}//
cout<<"theinputiscalled"<charc[size];
while(!
infile.eof())
{charh;
infile.get(h);
cout<while(!
('A'<=h&&h<='Z'||'a'<=h&&h<='z'))//只读英语单词
{if(infile.eof())
return;
infile.get(h);
//cout<inti;
i=0;
while('A'<=h&&h<='Z'||'a'<=h&&h<='z')
{if(h<'a')
{h=h-'A'+'a';//将大写字母转化为小写}
c[i++]=h;
infile.get(h);}
c[i]='\0';
cout<char*s;
s=newchar[i];
strncpy(s,c,i);
cout<
cout<insert(s,i);}
infile.close();//结束读入
}
产生哈希表:
voidinsert(char*w,intlength)//哈希表的操作:
搜索和插入
{intk;k=0;
for(inti(0);i='\0';i++)
{k+=w[i];}
cout<<"insertiscalled"<k=k%100;
cout<{cout<<"isblankinsert"<haxilist[k].head=newword;
haxilist[k].head->next=NULL;
haxilist[k].head->frequency=0;
haxilist[k].head->frequency++;
haxilist[k].head->str=w;
haxilist[k].tail=haxilist[k].head;}
else
{//此时哈希表不为空,搜索关键字word*templ;
for(templ=haxilist[k].head;
!
(strcmp(w,templ->str))&&templ->next!
=NULL;
templ=templ->next);//搜索完毕
if(!
strcmp(templ->str,w)){//没有找到关键字
haxilist[k].tail->next=newword;
haxilist[k].tail=haxilist[k].tail->next;
haxilist[k].tail->frequency++;
haxilist[k].tail->str=w;
haxilist[k].tail->next=NULL;}
else{deletew;
templ->frequency++;}}}
主函数
voidmain()//主函数
{cout<<"******************************************"<cout<<"*哈希表应用--英语单词频度统计*"<cout<<"**"<cout<<"**************************************************"<input();
cout<cout<<"文件读入完毕!
";
cout<intn=0;
for(inti(0);i<100;i++)
{if(haxilist[i].head!
=NULL)
{n++;
cout<<"单词"<str<<"频度为";cout<frequency<}
}
cout<<"在读入的文件中共搜索到"<(三)用户手册
本程序包含四个模块:
主程序模块:
voidmain()
构造哈希表函数:
voidinitial()
读取英文段落函数voidinput(ElemType**ST,intn)
查找函数:
voidinsert(char*w,intlength)
单词文本串文件类型:
ADTTextString
{数据对象:
D={ai|ai属于字母字符集,i为正整数}
数据关系:
D中字符被“换行符”分割成若干行,每一行的字符间满足下类关系:
R1={|ai-1,ai属于D,i为正整数}
基本操作:
Initiation(&f)
初始条件:
文件f已存在。
操作结果:
打开文件f,设定文件指针指向第一行第一个字符。
GetAWord(f,&w)
初始条件:
文件f打开。
操作结果:
从文件指针所指字符起提取一个“单词w”。
ExtractWord(f,&H)
初始条件:
文件f已打开,文件指针指向文件f中某一行的第一个字符。
操作结果:
提取该行中所有单词,并构成单词的哈希表H;本操作结束时,文件指针指向文件f中下一行的第一个字符。
Match(f,pat,&Result)
初始条件:
文件已打开,文件指针指向文件f中某一行的第一个字符;
pat为包含所有待查询单词的哈希表。
操作结果:
Result为查询结果。
}ADTTextString
ADTHashTable
{数据对象:
D={ai|ai属于AWord,i为正整数}
数据关系:
R1={|ai-1,ai属于D,i为正整数}
基本操作:
InitialHash(HashTable&)
操作结果:
初始化哈希表。
PrintHash(HashTable)
初始条件:
哈希表H已存在。
操作结果:
显示哈希表H中的所有元素。
SearchHash(HashTable,int,int&)
初始条件:
哈希表H已存在。
操作结果:
在哈希表H中查找元素,成功返回1,否则返回0。
InsertHash(HashTable&,Record)
初始条件:
哈希表H已存在。
操作结果:
在哈希表H中插入元素,成功返回1,否则返回0。
DeleteHash(HashTable&,Record)
初始条件:
哈希表H已存在。
操作结果:
在哈希表H中删除元素,成功返回1,否则返回0。
}ADTHashTable
算法实现及哈希表类型:
ADTHashTable
{数据对象:
D={ai|ai属于AWord,i为正整数}
数据关系:
R1={|ai-1,ai属于D,i为正整数}
基本操作:
InitialHash(HashTable&)
操作结果:
初始化哈希表。
PrintHash(HashTable)
初始条件:
哈希表H已存在。
操作结果:
显示哈希表H中的所有元素。
SearchHash(HashTable,int,int&)
初始条件:
哈希表H已存在。
操作结果:
在哈希表H中查找元素,成功返回1,否则返回0。
InsertHash(HashTable&,Record)
初始条件:
哈希表H已存在。
操作结果:
在哈希表H中插入元素,成功返回1,否则返回0。
DeleteHash(HashTable&,Record)
初始条件:
哈希表H已存在。
操作结果:
在哈希表H中删除元素,成功返回1,否则返回0。
}ADTHashTable
(四)调试及测试
在程序运行时,根据界面提示,会得到以下结果:
(五)运行实例:
(六)心得体会
通过对本课题的研究和系统的详细设计,再到系统开发运行,使我对应用系统的开发流程有了深刻的认识,成功完成系统的开发首先必须要对系统进行规划,对系统流程进行分析,对各个模块的功能进行设计。
在编写该程序时,主要是哈希函数的建立和查找分析,用线性探测再散列来处理冲突,从而得到哈希表并实现哈希表的查找。
发现运行结果中出现了乱码,而且是个别单词的统计结果返回时才出现乱码,怀疑是标点符号的原因,去掉标点后还是如此;又怀疑是回车符的原因,去掉回车符仍然如此。
依然没有解决;希望老师给我找到原因。
经过三个星期的努力,在克服了许许多多的困难之后,终于完成了课程设计,其主要的目标和任务基本上都实现了。
这几个星期是对我们大学所学知识,技能的一次真正、全面的考验,是锻炼我们动手能力、分析能力、创新能力的一次难得机会。
这个学期是我大学最为繁忙的一个学期,但也是最有意义、过得最充实的一个学期。
由于时间短暂,设计之中还有许多不足之处,有待于今后进一步的完善。
在这期间中,我得到了老师的帮助和指导,在此向老师表示衷心的感谢。
因为水平有限,我的工作还有许多不足之处,希望老师指正。
(七)附录源程序
(1)
#include
#include
#include
#include
#include
usingnamespacestd;
#defineCLOCKS_PER_SEC((time_t)1000)
typedefstruct_link//定义该链表是为了存储不重复出现的单词
{
char*ch;
intnum;
_link*next;
}link;
intmain()
{
clock_tt_start,t_end;
t_start=clock();
cout<<"**********************************************************************"<cout<<"**"<cout<<"*链表英语单词频度统计*"<cout<<"**"<cout<<"**********************************************************************"<cout<cout<<"文件读入完毕!
";
cout<//读入一个txt.文件操作
FILE*fp;
fp=fopen("test1.txt","r");
charword[1025];
intpos=0;//亦可用size_t类型
charc;
link*head,*pnow,*ptmp;
head=pnow=ptmp=NULL;
while(!
feof(fp))
{
c=fgetc(fp);//逐个获取的字符
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c=='\''))
word[pos++]=c;
elseif(pos>0)
{
word[pos]='\0';
//链表遍历,比较链表中的节点值与当前单词
ptmp=head;
while(ptmp)
{
if(strcmp(word,ptmp->ch)==0)
{
ptmp->num++;
break;
}
ptmp=ptmp->next;
}
//如果链表中没有当前单词,在链表末尾插入节点
if(ptmp==NULL)
{
ptmp=(link*)malloc(sizeof(link));//注意一下两行的用法
ptmp->ch=(char*)malloc(pos);
strcpy(ptmp->ch,word);
ptmp->num=1;
ptmp->next=NULL;
if(pnow)//插入当前节点为末节点
{
pnow->next=ptmp;
pnow=ptmp;
}
else//此处为第一次出现单词的时候
head=pnow=ptmp;
}
pos=0;
}
}
fclose(fp);//对文件进行操作,关闭文件
//读取链表,输出单词及其出现的个数
ptmp=head;
FILE*fp1=fopen("result.txt","w");
while(ptmp)
{
fprintf(fp1,"%d\t%s\n",ptmp->num,ptmp->ch);
ptmp=ptmp->next;
}
fclose(fp1);
ptmp=head;
inti=0;
while(ptmp)
{
i++;
ptmp=ptmp->next;
}
printf("单词总数为%d\n",i);
t_end=clock();
printf("time:
%fs\n",double(t_end-t_start)/CLOCKS_PER_SEC);
return0;
}
(2)
#include
#include"string.h"
#include
#include
#include
#include
#include
#defineCLOCKS_PER_SEC((time_t)1000)
#definesize20
structword
{intfrequency;//单词出现的频度
char*str;//关键字
word*next;};
structaword//不设首结点
{word*head;
word*tail;};
#definemax100000//定义短文的最大长度
structawordhaxilist[100000];//哈希表
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
voidinitial()//哈希表的初始化
{for(inti(0);i<100000;i++)
{haxilist[i].head=NULL;
haxilist[i].tail=NULL;}
cout<<"哈希表初始化完成,准备读入文件,请将需要操作的文件命名为file.txt放到文件夹中"</*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
voidinsert(char*w,intlength)//哈希表的操作:
搜索和插入
{intk;
k=0;
for(inti(0);i='\0';i++)
{k+=w[i];}
//cout<<"insertiscalled"<k=k%100000;
//cout<if(haxilist[k].head==NULL)//此时哈希表为空,
{
//cout<<"isblankinsert"<haxilist[k].head=newword;
haxilist[k].head->next=NULL;
haxilist[k].head->frequency=0;
haxilist[k].head->frequency++;
haxilist[k].head->str=w;
haxilist[k].tail=haxilist[k].head;}
else{//此时哈希表不为空,搜索关键字
word*templ;
for(templ=haxilist[k].head;!
(strcmp(w,templ->str))&&templ->next!
=NULL;templ=templ->next);//搜索完毕
if(!
strcmp(templ->str,w)){//没有找到关键字
haxilist[k].tail->next=newword;
haxilist[k].tail=haxilist[k].tail->next;
haxilist[k].tail->frequency++;
haxilist[k].tail->str=w;
haxilist[k].tail->next=NULL;}
else
{deletew;
templ->frequency++;}
}
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
voidinput()//读入文件
{cout<<"开始读入文件..."<fstreaminfile;
infile.open("file.txt",ios:
:
in);
if(!
infile)
{cout<<"Filecan'tbeopen"<abort();}
charc[size];
while(!
infile.eof())
{charh;
infile.get(h);//
//while(!
('A'<=h&&h<='Z'||'a'<=h&&h<='z'))//只读英语单词
//{if(infile.eof())return;
//infile.get(h);
//}
inti;
i=0;
while((h>='a'&&h<='z')||(h>='A'&&h<='Z')||(h=='\''))
{
c[i++]=h;
infile.get(h);
}
c[i]='\0';
char*s;
s=newchar[i];
strncpy(s,c,i);
insert(s,i);
}
infile.close();//结束读入
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
voidmain()//主函数
{
clock_tt_start,t_end;
t_start=clock();
cout<<"********************************************************************