输出一篇英文文章前十个出现频率最高的单词

#include<iostream>

using namespace std;

#define M 100

#define N 50

int main()

{

    FILE *fp;

    char *p,ch,temp[N]={'\0'},str[M][N]={'\0'},g[N];

    int i=0,j=0,a[M]={0}, b[M]={0}, v;

    cout<<"请输入文件路径:";

    cin>>g;

    if((fp=fopen(g,"r"))==NULL)

    {

      printf("无法打开此文件\n");

      exit(0);

    }

  

//读取文件并把所有单词存储在str[M][N]

 

     while(!feof(fp))

    {  

      ch=fgetc(fp);

      if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))

      {temp[j++]=ch;}

      else

      {p=strlwr(temp);strncpy(str[i++],p,j); j=0;}

  

    } 

 

   

  // 计算各个单词数量 存储在a[M]中,str[k]单词个数为a[k]

    for(int k=0;k<i;k++)

   {     v=0;      //当一个单词只出现一次时,作为标识符v=0

       if(strcmp(str[k],"\0")!=0)

      {   

         for(int t=k+1;t<i;t++)

         {

             if(strcmp(str[k],str[t])==0)

              {  

                if(a[k]==0)

                {a[k]=1;}

                 a[k]++; 

                 strcpy(str[t],"\0");

                  v=1;

              }

           }

            if(v==0){a[k]=1;}

       }

      

   }

 

//复制数组a[]b[]

   for(int x=0;x<M;x++) 

  {

   b[x]=a[x]; 

  }

 

  int c;

//冒泡排序

   for(int y=0;y<M-1;y++)

  {

     for(int z=0;z<M-1-y;z++)

     {

         if(a[z]<a[z+1])

         {c=a[z]; a[z]=a[z+1]; a[z+1]=c;}

      }

   }

//输出前十个出现频率最高的单词

    for(int h=0;h<10;h++)

   {

     for(i=0;i<M;i++)

     {  if(a[h]==0)break;

         if(a[h]==b[i])

        {

          b[i]=0; printf("%s",str[i]); cout<<"="<<a[h]<<endl; break;

         }

     }

   }

//关闭文件

  fclose(fp);

  return 0;      

}

 

 

/*解题思路:先将文件里的所有内容都读出来,在读的过程中根据单词之间的分隔符,将一个个单词分离出来并存储,最后在计算各个单词出现的次数,并输出前十个出现频率最高的单词。

在编这个程序时遇到的问题:当定义一个字符数组时没有初始化,若之后在程序中赋值给该字符数组的长度小于该定义的字符数组长度时,输出时就会出现多余的乱码 ,避免此问题出现就要在定义字符数组时初始化例如 char a[10]={'\0'}; 另外在c语言和c++中不存在字符串变量,也不存在字符串数组。*/

posted @ 2014-03-02 20:35  超369  阅读(661)  评论(1编辑  收藏  举报