分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来。

来源:互联网 发布:ih5软件下载 编辑:程序博客网 时间:2024/04/28 18:38
题目要求:分析一个文本文件中各个词出现的频率,并把频率最高的十个单词打印出来。 
程序代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct WORD
{
int num;
char a[20];
};//结构体数组用于保存单词及出现的个数
int main()
{
struct WORD A[6000];//结构体数组
int i;


char *b="";
FILE *in;
char ch;
int word=0;
int j=0;
int m,n,k;
int temp;
char infile[50];
printf("输入文件路径\n");
scanf("%s",infile);//输入文件名字,例如E:/zxl.txt
if((in=fopen(infile,"r"))==NULL)
{
printf("此文件无法打开");
exit(0);
}
for(i=0;i<600;i++)//初始化其次数
{A[i].num=1;}
i=0;
while(!feof(in))//一个个的读取字符

A[i].a[j]='\0';//单词结束的标志是‘\0’。
ch=fgetc(in);
if((ch==' '||ch=='.'||ch==',')&&word==1)//判断单词结束的标志

word=0;
j=0;
n=i;
i++;//结构体数组加1
if(n>=1)//从第二个单词开始,每提取一个单词都与前边比较是否相等。
{
for(m=0;m<n;m++)
{
if(strcmp(A[n].a,A[m].a)==0)
{
A[m].num++;//次数加1
i-=1;//结构体数组恢复原位
}
}
}
}
else if((ch==' '||ch=='.'||ch==',')&&word!=1)//消除一些空格的影响
continue;
else if(ch>=33&&ch<=122) //包含了所能出现的英文字符,消除文件结束符的影响。
{
A[i].a[j]=ch;
j++;
word=1;
}


}
for(n=0;n<i-1;n++)//通过比较法来排序,并将其单词相互交换
{
k=n;
for(j=n+1;j<i;j++){
if(A[j].num>A[k].num)


k=j;
b=A[k].a;
}
}

strcpy(b,A[k].a); 
    strcpy(A[k].a,A[n].a); 
    strcpy(A[n].a,b);
temp=A[k].num;
A[k].num=A[n].num;
A[n].num=temp;
}
 
printf("频率排名\t单词\t个数\n");
for(i=0;i<10;i++) //显示出频率最高的前10个单词,及出现次数
{
printf("%d\t%s\t%d\n",i+1,A[i].a,A[i].num);
}
return 0;
}

程序运行无误,得到的运行结果:

性能分析:



            程序中遇到的问题及解决方法:

在写程序的时候遇到的问题:第一次排序遇到了问题,可以查找到排名前十的单词,但是在前十进行排名的时候出现了错误
,原来的代码为:k=n;
for(j=n+1;j<i;j++)
if(A[j].num>A[k].num)
{ k=j;
max=A[k].num;
A[k].num=A[n].num;
A[n].num=max;
strcpy(b,A[k].a); 
strcpy(A[k].a,A[n].a); 
strcpy(A[n].a,b);修改之后的代码:k=n;
for(j=n+1;j<i;j++){
if(A[j].num>A[k].num)


k=j;
b=A[k].a;
}
}

strcpy(b,A[k].a); 
    strcpy(A[k].a,A[n].a); 
    strcpy(A[n].a,b);
temp=A[k].num;
A[k].num=A[n].num;
A[n].num=temp;不用赋值给max,直接用选择排序进行排序。
在这个程序中,我认为不足就是定义了太多的变量,但是我能力也有限,不晓得怎么修改,以后在写程序的时候多加注意。 还有一个就是在输出格式上需要对齐。
           心得体会:女生在动手操作这一块十分薄弱,对于代码的编写感觉十分吃力,在今后的学习中,必须多动手,先从简单的程序开始,逐渐成长。在写这个程序过程中,遇到了很多的错误,改了很久。在用VS2012软件进行性能分析中,也不了解那些含义。初次接触觉得生疏,我相信在以后学习巩固之后,一切都会好的。
0 0