软件工程实验——统计单词个数
设计思路:
读文件里的文章一次只能读一个字符,所以就用一个字符数组(以下用WZ来表示这个数组)来把整篇文章以字符的形式存起来。存单词的同时还得存单词的个数,便想到用结构体数组(用DC来表示)来存储单词和单词个数。结构体包含一个字符数组(用A表示)和一个int型变量(用N表示)分别存放单词和单词个数。要把单词从字符中提出来,想到用非字母的字符来区分。初始化DC,让DC中每一个结构体中的N都等于0。先建立一个字符数组(用B来表示),然后从WZ[0]开始依次判断是否是英文字母,若是英文字母则便依次保存在B数组中,若不是字母字符那么之前的保存在B中的字母组合起来便是一个单词。然后让B依次从DC[0].A开始来比较,若相同则DC[0].N+1,若不相同则继续往后比,若把整个DC全部比完都没有相同的(之前假设DC存到第M个)然后让DC[M+1].A等于B同时DC[M+1].N+1。然后把B清空开始读WZ下一个字符。直到把WZ最后的字符读出来,循环结束。然后用冒泡法以DC[i].N的大小,从大到小给DC排序。然后输出前十个就行了。
程序代码:
#include <iostream.h> #include <stdio.h> #include <string.h> typedef struct{ int n; char da[100]; }danci; //建文件(题目没要求) /*void jwj() { FILE * in; char ch,a[10]; cout<<"输入文件名:"; cin>>a; if((in=fopen(a,"w"))==NULL) { cout<<"error!!"; } cout<<"输入单词,以“#”结束: "<<endl; ch=getchar(); while(ch!='#') { fputc(ch,in); ch=getchar(); } fclose(in); }*/ //读文件 void dwj(char wz[]) { FILE * out; int i=0; char ch,a[10]; cout<<"输入文件名:"; cin>>a; out=fopen(a,"r"); while(!feof(out)) { ch=fgetc(out); wz[i]=ch; i++; } wz[i]='#'; wz[i+1]='\0'; fclose(out); } //单词排序 void dcpx(char wz[]) { int i,j,t,m,k,l,z; char c,b[100]; double f,p; danci dc[9000]; for(i=0;i<9000;i++) { dc[i].n=0; for(j=0;j<100;j++) { dc[i].da[j]='\0'; } } i=0;j=0;m=0;l=0;t=0;z=0;p=0; while(wz[i]!='#') { c=wz[i]; i++; if(c>64) { if(c<91) { m=1; b[j]=c; j++; continue; } else if(c>96) { if(c<123) { m=1; b[j]=c; j++; continue; } } } else if(c==39) { m=1; b[j]=c; j++; continue; } if(m==0) continue; else { b[j]='\0'; p++; m=0; j=0; for(k=0;k<9000;k++) { if(strcmp(b,dc[k].da)==0) { dc[k].n++; l=1; break; } } if(l==0) { z=0; while(b[z]!='\0') { dc[t].da[z]=b[z]; z++; } dc[t].n++; t++; } l=0; } } danci dd; for(i=0;i<8999;i++) { for(j=0;j<8999-i;j++) { if(dc[j].n<dc[j+1].n) { dd=dc[j]; dc[j]=dc[j+1]; dc[j+1]=dd; } } } i=0; cout<<"排名"<<'\t'<<"单词"<<'\t'<<"个数"<<'\t'<<"频率"<<endl; for(i=0;i<10;i++) { if(dc[i].n==0) break; f=dc[i].n/p; cout<<i+1<<'\t'<<dc[i].da<<'\t'<<dc[i].n<<'\t'<<f<<endl; } cout<<"单次总数为"<<p<<"个"<<endl; cout<<"一共有"<<t<<"个不同单词"<<endl; } char wz[100000000]; int main() { dwj(wz); dcpx(wz); return 0; }