软件工程作业

用C++实现统计单词个数,并将最多的十个显示出来;

由于个人水平有限,参考了网络上来自其他网友提供的代码;

首先创建一个结构体储存单词(char word[19])以及单词的出现平率(int num);

之后要求输入文件路径,通过fopen( 文件路径,"r")读取文件,如为空,则报错;

之后见文件指针赋给fp,通过getc(fp)来读取单词,并将每个统计的单词记录并num++;

形成ten[10]来储存这个链表数组,初始化ten[10]为前十个单词,将其中num由大到小统计,则ten[9]为最小;

之后继续执行统计,一次将每个单词的num与ten[9]比较,如大于,则加入ten[10],重新排序,ten[9]改变。

最后依次输出前十个频率最高单词;

代码如下:

#include<iostream> #include<iomanip> using namespace std; #define M 20000  //文章单词个数

typedef struct {     char word[19];//储存单词     int num;//记录单词个数,后面出现几次 }sq;

void main() {        sq word[M];     sq t_word;     int K,n=0,i,j;     char infile[10];     cout<<"***********请输入文件路径:***********"<<endl;     cin>>infile;//文件路径输入        FILE *fp;     char ch;     //fp=fopen("d://pro.txt","r");     if((fp=fopen(infile,"r"))==NULL)     {         cout<<"无法打开文件!"<<endl;         exit(0);     }     while(!feof(fp))     {         ch=getc(fp);         if(ch==' '||ch==10)         {//虑空             continue;         }         if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))              //发现一个单词         {             K=0;             t_word.num=1;             while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch=='\''))             {                 if(ch>='A'&&ch<='Z')                     ch+=32;//转换成小写                 t_word.word[K++]=ch;                 ch=getc(fp);             }             t_word.word[K++]='\0';                               //一个单词结束             j=n;                         for(i=0;i<j;i++) //与前面的单词比较             {                 if(strcmp(t_word.word,word[i].word)==0)                 {                        word[i].num++;                     break;                    }                         }

            if(n==0||i==j)             {                 word[n]=t_word;                 n++;             }                     }     }     //输出频率最高的十个单词     sq ten[10];     sq temp;     for(i=0;i<10;i++)     {         ten[i]=word[i];//初始化频率最高的十个单词为前十个单词     } //前十个排序         for(j=0;j<10;j++)         for (i=0;i<10-j;i++)             if(ten[i].num<ten[i+1].num)             {                 temp=ten[i];                 ten[i]=ten[i+1];                 ten[i+1]=temp;             }     for(i=10;i<n;i++)     {         if(ten[9].num<word[i].num)         {             int a=8;             while(ten[a].num<word[i].num&&a>=0)             {                 a--;             }                         for(j=9;j>a+1;j--)             {                 ten[j]=ten[j-1];             }             if(a<0)                     ten[0]=word[i];             else                 ten[j]=word[i];         }     }     for(i=0;i<10;i++)     {         cout<<setiosflags(ios::left)<<setw(10)<<ten[i].word<<endl;     } }

 

posted @ 2014-03-03 09:17  也好,也罢  阅读(135)  评论(0)    收藏  举报