课设报告统计英文单词数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++)