软件工程实验——统计单词个数

设计思路

    读文件里的文章一次只能读一个字符,所以就用一个字符数组(以下用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;

}

 

 

 

 

posted on 2014-03-02 22:19  黄冠2011  阅读(281)  评论(1编辑  收藏  举报

导航