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

我的程序思想:

    先把文件里的东西作为一个大的字符串存放到一个字符数组里,然后再把这个数组里边的一个个单词经过一个临时的数组,存放到一个结构体里,这个结构体的属性有单词记录,单词出现的次数记录,和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标记环节调了很多次才成功,虽然程序很短,但是还是用了两个下午才完成的,中途遇到的问题还请教了很多同学,感觉自得编程能力还是不够,需要进一步加强。

 

 

 

 

 

 

 

 

 

 

posted @ 2014-03-02 15:28  ID_q寒  阅读(355)  评论(1编辑  收藏  举报