词频统计实验报告.docx
《词频统计实验报告.docx》由会员分享,可在线阅读,更多相关《词频统计实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
词频统计实验报告
南京邮电大学
算法与数据结构设计
(2015/2016学年第二学期)
题目:
词频统计分析系统
专业
学生姓名
班级学号
指导教师
指导单位
日期
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
算法思想准备情况
程序设计能力
解决问题能力
课题功能实现情况
算法设计合理性
算法效能评价
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
年月日
评分等级
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
词频统计分析系统
一、课题内容和要求
我要完成的题目是算法与数据结构设计中的题目,实验的目的是通过实践来学习,使学生加深对课内所学的有关数据的逻辑结构和存储表示、数据结构的选择和应用、算法的设计和时空效率分析等课程基本内容的理解;另外,在程序设计过程中还会用到C语言编程环境以及程序的调试和测试方面的知识,因此我们会受到比较系统和严格的训练。
此次实验是要实现一个英文文档的词频统计分析系统。
要求能对任意一段英文文档统计出所给字母、数字、空格的个数,并给出分布图或表。
同时能对手动输入的字母和单词进行词频统计。
要求给出相应的算法时间复杂度分析。
通过实习可以提高我们自己的学习能力、通过查阅资料、同时也可以提高我们独立分析问题和解决问题的能力。
二、数据结构说明
在该部分中叙述你选用的每种逻辑数据结构
通常我们把数据的逻辑结构简称为数据结构,数据的逻辑结构分为两大类:
线性结构和非线性结构。
三、算法设计
在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义,如果用面向对象的方法,应该给出类中成员变量和成员函数原型声明)。
4、详细设计
实验程序设计如下:
#include
#include
#include
#include
usingnamespacestd;
#defineMAX1024//全局固定变量MAX1024
typedefstruct{//定义结构体
charword[32];
intnum;
}wordlist;
wordlistwl[MAX];
intwordnum=0;
voidtongji()
{
charst[32];//定义自变量
intfound;
charc;
inti;
intm=0,n=0,j=0,k=0;
FILE*fp;//定义文件指针
if((fp=fopen("14220105.txt","r"))==NULL)
exit
(1);
while(fscanf(fp,"%s",st)!
=EOF)
{
found=0;
for(i=0;i{
if(strcmp(wl[i].word,st)==0)//字符串的读取
{
wl[i].num++;
found=1;
break;
}
}
if(!
found)
{
strcpy(wl[i].word,st);
wl[i].num=1;
wordnum++;
}
}
fclose(fp);
if((fp=fopen("14220105.txt","r"))==NULL)
exit
(1);
while((c=fgetc(fp))!
=EOF)
{
if(c=='')//数字及空格的读取
++n;
elseif(c>='0'&&c<='9')
++j;
elseif((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
++k;
else++m;
}
fclose(fp);
printf("读取完毕,结果如下:
\n");
printf("数字%d\n字母%d\n空格%d\n其他%d\n",j,k,n,m);//输出结果
}
voidshuru()
{
charstr[100];
charletter[52];
intcount[52]={0};//初始化计数器
inti;
intlc=0;//记录字母总数
cout<<"输入字符串:
"<scanf("%s",str);
//初始化字母表
for(i=0;i<26;i++)
letter[i]='A'+i;
for(i=26;i<52;i++)
letter[i]='a'+i-26;
i=0;
while(str[i]!
='\0')//字符串未结束
{
if(str[i]>='A'&&str[i]<='Z')//写字母
{
count[str[i]-65]++;//假设str[i]=='A','A'-65等于0count[0]自增1
lc++;
}
if(str[i]>='a'&&str[i]<='z')//写字母
{
count[str[i]-97+26]++;//'a'==97,前面26写所加26
lc++;
}
i++;
}
for(i=0;i<52;i++)//显示统计情况
{
if(count[i]!
=0)
printf("%c-%d-%3.2f%\n",letter[i],count[i],(float)count[i]/lc*100);
}
}
voidxuanzhe()
{
printf("1.读档统计\n");
printf("2.输入统计\n");
printf("0.退出\n");//输出退出
printf("选择您所需要的操作:
");
}
intmain()//主函数
{
intchoice;
do
{xuanzhe();
scanf("%d",&choice);
switch(choice)//switch函数进行循环执行
{
case0:
return0;
case1:
tongji();
break;
case2:
shuru();
break;
}
}while
(1);
}
5、测试数据及其结果分析
程序运行结果
1.
2.
3.
时间复杂度为:
O(n)
六、调试过程中的问题
每个算法设计和调试时存在问题的思考(问题是哪些?
问题如何解决?
),以及算法进一步改进的设想。
1.调试过程中发现有丢掉“;”的错误提示,然后在正确的地方加上就可以了。
2.调试的过程中还遇到“{”和“}”对应上的错误,通过把程序中的“{”和“}”一一对应后加上丢掉的一个“}”这个错误就解决了。
因为编译时没有注意将l打成了1,调试后发现了然后将其改正。
4.
出现一个未知的字符,然后检查过后在主函数中定义了自变量i。
5.
调试时没有错误但是运行时结局不一样,然后经过断点调试,发现没有调用的文件,程序没有运行,然后就在文件夹中创建了一个文本文档。
七、课程设计总结
总结内容包括:
(1)课程设计过程中遇到的问题:
调试过程中发现有丢掉“;”的错误提示,然后在正确的地方加上就可以了。
调试的过程中还遇到“{”和“}”对应上的错误,通过把程序中的“{”和“}”一一对应后加上丢掉的一个“}”这个错误就解决了。
还有在选择函数的时候会有选择错误的时候,请教同学之后改成正确的函数。
还有写程序的时候会不小心拼写错误或者拼写少了一个字母,使得程序前后不能对应,出现不能识别的情况,在调试的时候把错误的地方改过来就可以了。
(2)课程设计过程的收获和感受。
在这次课程设计的过程中让我深刻认识到自己在程序设计这方面的不足,比如说
完成的过程中充满了各种复杂的情绪,从一点点到最后一个完整的程序,其中有冥思苦想的烦恼与痛苦,也有调试过程中随着错误减少直至程序可以演示的激动和喜悦。
同时也感受到同学间的友好和热情,虽然最后的程序有些瑕疵,功能没有全部实现,但每迈出一步都是小小的跨越。
在这次程序设计中不仅收获了知识,还锻炼了自己的实践能力,也明白了合作的重要性,同时还牢记了不论做任何事都不能粗心,这样的实验机会对于我们每个人来说都是难得的一次锻炼机会,我们受益匪浅。