按照常规思路我是这样做的,首先把英文文章中的每个字母包括空格,标点符号存入一个数组中,然后根据标点符号或者空格来判断单词,两个空格之间就会有一个单词,然后将这个单词存入数组,然后使用strcmp函数进行比较,在这里数组与数组之间的比较,若为真返回1,否则返回-1,这里显然我要用结构体,统计的时候我首先将每个带错的属性初始化为1,strcmp为真则变为0,亿这样的方式来统计单词,最后结果放入另外一个文本。
/*
软件工程1501班
陈辉
1508010131
*/
#include<stdio.h>
#include<stdlib.h>
#include<String>
struct Eng
{
char eng[20]; //一个单词最多20个字母
int Flag; //统计每一个单词的字母个数
int fre; //若fre的值为0,则表示该单词已经被统计过
int count; //统计单词的频率
};
int main(void)
{
Eng ec[10000]; //存放1000个英文单词
FILE* fp,*ep;
fp=fopen("eng.txt","r"); //英语文本
ep=fopen("frequency.txt","a"); //统计结果
int i=0;
int e1,e2,e3;
e1=0;
e3=0;
int p=0;//e1初始位置
char a[200000];
while(!feof(fp))
{
fscanf(fp,"%c",&a[i]); // 将字母和空格放在数组
i++;
}
for(int j=1;j<i-1;j++)
{
if(' '==a[j])
{
e2=j;
for(int k=e1+1;k<e2;k++) //a[]={' ','1',' ','d','e',' ','c'}
{
ec[p].eng[e3++]=a[k];
ec[p].Flag=e2-e1-1;
} //第p个单词
p++;
e3=0;
e1=e2;
}
}
//此时文本中的单词已经全部保存在ec[p]数组
for(int c=0;c<p;c++)
{
ec[c].fre=1;
ec[c].count=0;
}
for(int x=0;x<p;x++)
for(int d=x+1;d<p;d++)
{
if(ec[d].fre) //如果fre为0 说明已经该单词原先已经统计过了
if(!strcmp(ec[x].eng,ec[d].eng))
{
ec[d].fre=0;
ec[x].count++;
}
}
fprintf(ep,"总共有%d个单词\n",p);
for(int d=0;d<p;d++)
{
if(ec[d].fre) //当fre为1时,输出的单词不会重复
{
for(int x=0;x<ec[d].Flag;x++)
fprintf(ep,"%c",ec[d].eng[x]);
fprintf(ep," %d\n",ec[d].count+1); //存储在文本中
}
}
printf("你好\n“eng.txt”中保存的英文文章单词频率的统计结果\n保存在“frequency.txt”中请注意查看\n");
return 0;
}