软件工程作业
用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; } }
浙公网安备 33010602011771号