课设报告统计英文单词数

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

“程序设计基础”

课程设计报告

(一)需求和规格说明

该系统的功能是给定一个英文段落(单词个数<100),利用哈希表(表长最大为20)统计单词出现的频度,并能根据要求显示出给定单词在段落中出现的位置。执行程序时由用户在键盘上输入程序中规定的运算命令;相应的输入数据和运算结果显示在其后。

该系统的实现是通过哈希函数的建立和查找分析,用线性探测再散列来处理冲突,从而得到哈希表并实现哈希表的查找。该文章对哈希函数的应用方法是使用除留余数法构造,使用链地址法进行冲突处理。

2.1技术可行性

哈希查找是通过计算数据元素的存储地址进行查找的一种方法。

哈希查找的操作步骤:

用给定的哈希函数构造哈希表;

根据选择的冲突处理方法解决地址冲突;

在哈希表的基础上执行哈希查找。

2.2需求可行性

世界上的事物都是有发展的,企图跨越阶段或者停滞,一切生命就都没有存在的理由了。频率就是一个既动态又静态的东西,我们能肯定的是很多古词和今词是不一样的,今日被淘汰了,也就是说,今天的频率的统计是一定有确定的结论的。也有一些古词仍在今日用着,或者在淘汰之中,所以频率难以确定。我们知道黑天和白天是有区别的,但它们的交界点,却不是那么容易分辨了,恐怕需要经过科学家的精密研究。交界点不容易确定,并不意味着事物之间没有区别。世界上的事物都是有区别又有联系的。有些人读书读傻了,钻了牛角尖,他弄不清两个事物之间的区别应该划在哪里,后来就连两个事物之间有区别也不敢认定了。频率的统计是为了区别常用词和非常用词,方法可能不准确,但不至于否定常用词和非常用词之间的区别吧。我们应该使统计精密起来。火车今天不用火了,但如果当初也不用,就没有今天的“火车”了。事物的变化是不可能停止的,但总还有个静态的定位,否则人们就无法认识任何事物了。频率虽然是个复杂的问题,但科学的研究是必要的。

3 需求分析

给定一个英文段落(单词个数<100),利用哈希表(表长最大为20)统计单词出现的频度,并能根据要求显示出给定单词在段落中出现的位置。执行程序时由用户在键盘上输入程序中规定的运算命令;相应的输入数据和运算结果显示在其后。测试数据:给定一个英文段落

显示出不同英文单词的出现频度。

给定一个英文单词,判断段落中是否含有该单词,如有,依次显示出该单词在段落中出现的位置。

基本要求:哈希函数使用除留余数法构造,使用链地址法进行冲突处理。

(二)设计

构造哈希函数

void initial() //哈希表的初始化

{ for(int i(0); i<100; i++)

{ haxilist[i].head=NULL;

haxilist[i].tail= NULL; }

cout<<"哈希表初始化完成,准备读入文件,请将需要操作的文件命名为file.txt放到文件夹中"<

}

读取数据:

void input() //读入文件

{ cout<<"开始读入文件..."<

fstream infile;

infile.open("file.txt",ios::in);

if(!infile)

{cout<<"File can't be open"<

abort();

} //

cout<<"the input is called "<

char c[size];

while(!infile.eof())

{ char h;

infile.get(h);

cout<

while( !('A'<=h && h<='Z'||'a'<=h && h<='z')) //只读英语单词{ if(infile.eof())

return;

infile.get(h);

//cout<

int i;

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=new char[i];

strncpy(s,c,i);

cout<

cout<

insert(s,i); }

infile.close(); //结束读入

}

产生哈希表:

void insert( char* w,int length) //哈希表的操作:搜索和插入{ int k; k=0;

for(int i(0);i

{ k+=w[i]; }

cout<<"insert is called"<

k=k%100;

cout<

{cout<<"is blank insert"<

haxilist[k].head=new word;

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=new word;

haxilist[k].tail=haxilist[k].tail->next;

haxilist[k].tail->frequency++;

haxilist[k].tail->str=w;

haxilist[k].tail->next=NULL;}

else { delete w;

templ->frequency++; } } }

主函数

void main () //主函数

{ cout<<" ******************************************"<

cout<<" * *"<

cout<<" * 哈希表应用--英语单词频度统计*"<

cout<<" * *"<

cout<<"

**************************************************"<

initial();

input();

cout<

cout<<"文件读入完毕!";

cout<

int n=0;

for(int i(0);i<100;i++)

相关文档
最新文档