分析一个文本文件各个词出现的频率,并把频率最高的十个词打印出来。
我的程序思想:
先把文件里的东西作为一个大的字符串存放到一个字符数组里,然后再把这个数组里边的一个个单词经过一个临时的数组,存放到一个结构体里,这个结构体的属性有单词记录,单词出现的次数记录,和flag。基本上没有用什么函数,大部分都是通过for循环实现的。
源程序代码如下:
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define num 1000
int i=0;
void qingling(char a[])//临时字符数组清零
{
for(i=0;i<20;i++)
a[i]=NULL;
}
void main()
{
struct Word
{
char word_str[20];
int mount;
int flag;
}
word[num];
int j=0,k=0,m=0,n=0,temp;
char temp1[20];
char a[10000],b[20];
int t[100];
FILE *fp;
char ch;
for(i=0;i<num;i++)
{
word[i].mount=0;
}
if((fp=fopen("C:\\a.txt","r"))==NULL)
{
printf("无法打开此文件\n");
exit(0);
}
i=0;
while(ch!=EOF)
{
ch=fgetc(fp);a[i++]=ch;j++;//把文件的内容存入到一个字符数组
}
for(n=0;n<j;n++)
{
if(isalpha(a[n])==0)
{
if(b!=NULL)
{
b[k]='\0';
strcpy(word[m].word_str,b);
m++;
qingling(b);
k=0;
}
}
else
{
b[k]=a[n];
k++;
}
}
for(n=0;n<m-1;n++)//计算每个单词出现的次数,flag=1,表示它在出现不记录次数
{
for(j=n+1;j<m;j++)
{
if(strcmp(word[n].word_str,word[j].word_str)==0 )
{
if( word[n].flag!=1)
{
word[n].mount++; word[j].flag=1;
}
else
word[n].mount=0;
}
}
}
for(n=0;n<m;n++)
{
if(word[n].flag!=1)
word[n].mount++;
}
for(j=0;j<m-1;j++)//每个单词按照出现次数的大小排序,冒泡法
{
for(n=0;n<m-j-1;n++)
{
if(word[n].mount>=word[n+1].mount)
{
temp=word[n].mount;
word[n].mount=word[n+1].mount;
word[n+1].mount=temp;
strcpy(temp1,word[n].word_str);
strcpy(word[n].word_str,word[n+1].word_str);
strcpy(word[n+1].word_str,temp1);
temp=word[n].flag;
word[n].flag=word[n+1].flag;
word[n+1].flag=temp;
}
}
}
printf("频率最高的十个单词依次为:\n");//最后的结果输出
for(n=m-2;n>m-12;n--)
{
printf("单词 %s 出现次数 %d\n",word[n].word_str,word[n].mount);
}
fclose(fp);
}
运行结果如下:
没能截图!
心得体会:在把文件内容存放到数组时,我用fgets函数无法实现,不知道为什么,后来改用的fgetc。在flag标记环节调了很多次才成功,虽然程序很短,但是还是用了两个下午才完成的,中途遇到的问题还请教了很多同学,感觉自得编程能力还是不够,需要进一步加强。