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


     首先,

  1 #include <iostream>
  2 
  3 #include <stdio.h>
  4 #include "stdlib.h"
  5 using namespace std;
  6 
  7 double number=0;
  8 int d=0;
  9 struct word_cunchu
 10 {
 11         double pinlv;
 12     char *word;
 13     int num;
 14     
 15 };
 16 word_cunchu k[8666];
 17 char g[86666];
 18 void qianshi()
 19 
 20 {
 21     cout<<"单词"<<'\t'<<"次数"<<'\t'<<"频率"<<endl;
 22     if(d-1<=10)
 23     {
 24         for(int i=0;i<d-1;i++)
 25     {
 26         cout<<k[i].word<<'\t'<<k[i].num<<'\t'<<k[i].pinlv<<endl;
 27     }
 28     }
 29     else{
 30         
 31     
 32     for(int i=0;i<10&&i<d-1;i++)
 33     {
 34         cout<<k[i].word<<'\t'<<k[i].num<<'\t'<<k[i].pinlv<<endl;
 35     }
 36     }
 37     cout<<"总类:"<<d-1<<endl;
 38     cout<<"总个数:"<<number<<endl;
 39 }
 40 void chuli(char b[])
 41 {
 42     int i=0,j,y;
 43     char *p;
 44     char *t;
 45     int kk;
 46     while((b[i]==';'||b[i]=='.'||b[i]==':'||b[i]=='"'||b[i]==','||b[i]==' '||b[i]==10||b[i]==13||b[i]=='!'||b[i]=='('||b[i]==')')&&b[i]!='\0') i++;
 47     
 48     for(;b[i]!='\0';)
 49     {
 50         if((b[i]==';'||b[i]=='.'||b[i]==':'||b[i]=='"'||b[i]==','||b[i]==' '||b[i]==10||b[i]==13||b[i]=='!'||b[i]=='('||b[i]==')')&&b[i]!='\0') {i++;continue;}
 51         else
 52         {
 53             j=0;
 54             p=new char[20];
 55             while(b[i]!=';'&&b[i]!='.'&&b[i]!=':'&&b[i]!='"'&&b[i]!=','&&b[i]!=' '&&b[i]!='\0'&&b[i]!=10&&b[i]!=13&&b[i]!='!'&&b[i]!='('&&b[i]!=')')
 56             {
 57             p[j]=b[i];
 58             i++;
 59             j++;    
 60             }
 61             p[j]='\0';
 62             
 63             for(y=0;y<d;y++)
 64             {
 65                 if(strcmp(p,k[y].word)==0) {k[y].num++;break;}
 66             }
 67             if(y==d)
 68             {
 69             k[d].word=p;
 70             k[d].num=1;
 71             d++;
 72             }
 73         
 74         }
 75         
 76     }
 77     j=0;
 78     for(i=0;i<d-1;i++)
 79     {
 80         for(j=0;j<d-1;j++)
 81         {
 82             if(k[j].num<k[j+1].num) {t=k[j].word;k[j].word=k[j+1].word;k[j+1].word=t;kk=k[j].num;k[j].num=k[j+1].num;k[j+1].num=kk;}
 83             
 84         }
 85     }
 86         for( i=0;i<d-1;i++)
 87     {
 88         number=number+k[i].num;
 89     }
 90     
 91         for( i=0;i<d-1;i++)
 92     {
 93         k[i].pinlv=k[i].num/number;
 94     }
 95 }
 96 
 97 
 98 void wenjian_R()
 99 {
100     FILE *fp;
101     char ch;
102     int i=0;
103     char a[20];
104     cout<<"输入文件名:";
105     cin>>a;
106     if((fp=fopen(a,"r"))==NULL)
107     {
108         printf("无法打开文件\n");
109         exit(0);
110     }
111     while(!feof(fp))
112     {
113         g[i]=fgetc(fp);
114         i++;
115     }
116     g[i]='\0';
117     fclose(fp);
118 
119 }
120 
121 void main(int argc, char *argv[])
122 {
123     
124     
125     wenjian_R();
126     chuli(g);                
127     qianshi();
128     
129     
130 }

解题思路:先把整个文件读出来,然后再分隔出一个个单词。 每个单词存储在一个结构体中,最后将前十个出现频率最高的单词输出。 错误分析:要注意读文件时的路径写正确。

posted @ 2014-03-03 07:40  高晓林  阅读(315)  评论(2编辑  收藏  举报