南京邮电大学
算法与数据结构设计
(2015 / 2016 学年第二学期)题目:词频统计分析系统
专业
学生姓名
班级学号
指导教师
指导单位
日期
词频统计分析系统
一、课题内容和要求
我要完成的题目是算法与数据结构设计中的题目,实验的目的是通过实践来学习,使学生加深对课内所学的有关数据的逻辑结构和存储表示、数据结构的选择和应用、算法的设计和时空效率分析等课程基本内容的理解;另外,在程序设计过程中还会用到C语言编程环境以及程序的调试和测试方面的知识,因此我们会受到比较系统和严格的训练。
此次实验是要实现一个英文文档的词频统计分析系统。
要求能对任意一段英文文档统计出所给字母、数字、空格的个数,并给出分布图或表。
同时能对手动输入的字母和单词进行词频统计。
要求给出相应的算法时间复杂度分析。
通过实习可以提高我们自己的学习能力、通过查阅资料、同时也可以提高我们独立分析问题和解决问题的能力。
二、数据结构说明
在该部分中叙述你选用的每种逻辑数据结构
通常我们把数据的逻辑结构简称为数据结构,数据的逻辑结构分为两大类:线性结构和非线性结构。
三、算法设计
在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义,如果用面向对象的方法,应该给出类中成员变量和成员函数原型声明)。
四、详细设计
实验程序设计如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<iostream>
using namespace std;
#define MAX 1024 //全局固定变量MAX 1024 typedef struct{ //定义结构体
char word[32];
int num;
} wordlist;
wordlist wl[MAX];
int wordnum=0;
void tongji()
{
char st[32]; //定义自变量
int found;
char c;
int i;
int m=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<wordnum;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;
else if(c>='0'&&c<='9')
++j;
else if((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 );// 输出结果}
void shuru()
{
char str[100];
char letter[52];
int count[52]={0};//初始化计数器
int i;
int lc=0;//记录字母总数
cout<<"输入字符串:"<<endl;
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等于0 count[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); }
}
void xuanzhe()
{
printf("1.读档统计\n");
printf("2.输入统计\n");
printf("0.退出\n");//输出退出
printf("选择您所需要的操作:");
}
int main() //主函数
{
int choice;
do
{ xuanzhe();
scanf("%d",&choice);
switch(choice) // switch函数进行循环执行
{
case 0:
return 0;
case 1:
tongji();
break;
case 2:
shuru();
break;
}
}while(1);
}
五、测试数据及其结果分析
程序运行结果1.
2.
3.
时间复杂度为:O(n)
六、调试过程中的问题
每个算法设计和调试时存在问题的思考(问题是哪些?问题如何解决?),以及算法进一步改进的设想。
1.调试过程中发现有丢掉“;”的错误提示,然后在正确的地方加上就可以了。
2.调试的过程中还遇到“{”和“}”对应上的错误,通过把程序中的“{”和“}”
一一对应后加上丢掉的一个“}”这个错误就解决了。
3.
因为编译时没有注意将l打成了1,调试后发现了然后将其改正。
4.
出现一个未知的字符,然后检查过后在主函数中定义了自变量i。
5.
调试时没有错误但是运行时结局不一样,然后经过断点调试,发现没有调用的文件,程序没有运行,然后就在文件夹中创建了一个文本文档。
七、课程设计总结
总结内容包括:
(1)课程设计过程中遇到的问题:
调试过程中发现有丢掉“;”的错误提示,然后在正确的地方加上就可以了。
调试的过程中还遇到“{”和“}”对应上的错误,通过把程序中的“{”和“}”
一一对应后加上丢掉的一个“}”这个错误就解决了。
还有在选择函数的时候会有选择错误的时候,请教同学之后改成正确的函数。
还有写程序的时候会不小心拼写错误或者拼写少了一个字母,使得程序前后不能
对应,出现不能识别的情况,在调试的时候把错误的地方改过来就可以了。
(2)课程设计过程的收获和感受。
在这次课程设计的过程中让我深刻认识到自己在程序设计这方面的不足,比如说
完成的过程中充满了各种复杂的情绪,从一点点到最后一个完整的程序,其中有冥思苦想的烦恼与痛苦,也有调试过程中随着错误减少直至程序可以演示的激动和喜悦。
同时也感受到同学间的友好和热情,虽然最后的程序有些瑕疵,功能没有全部实现,但每迈出一步都是小小的跨越。
在这次程序设计中不仅收获了知识,还锻炼了自己的实践能力,也明白了合作的重要性,同时还牢记了不论做任何事都不能粗心,这样的实验机会对于我们每个人来说都是难得的一次锻炼机会,我们受益匪浅。