统计英文单词词频–C
思想:c和java有很大的区别,如果是c要进行字符串这类问题处理的话,是更多的算法,而java的话可以有很多类来帮助我们减少如何设计算法。所以硬是要用c的话应该这样,首先定义一个结构体,然后两个元素,一个是单词,一个是单词的频数,接下来就是读文件,读文件自然是按字符读,如果读的不是英文字符自动跳过,如果读的是英文字母的话可以记录一下起点,然后当读到空白或者标点之类的可以记录一下终点,然后中间就是读入的新单词,有了新单词之后我们可以和结构体里的内容比较了,如果结构体里有的话就是频数增加,如果结构体没有新单词的话把新单词加入结构体中并将频数设置为1。最后就是结构体的排序,依据词频排序。
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define Word_Max 100
struct word{
char w[Word_Max];
int count;
}a[1000];
int main(void){
FILE *fp;
char words[10];
char ch;
int i = 0,j = 0,k = 0,flag = 0;
/*
1. i是控制读文件的起点,每读到一个英文字符都进一位,若不是英文字母则将起点设为0,重新开始读,另外进入else部分。
2. j是为了检验结构体是否含有刚读的单词设置的起点,作用是循环结构体。
3. k是为了增加结构体的数量,每增加一个新的单词就加1.
4. flag是为了区别是否新读的单词在结构体里存在不存在,存在就count增1,不存在就纳入新的结构体并且count设置为1,
千万别忘了在循环结束后改为0;
*/
if((fp = fopen("D:\word.txt","rb")) == NULL){
printf("cannot open the file\n");
}
while(!feof(fp)){
ch = tolower(fgetc(fp));
//这里是将所有大写的字符转化为小写。
if(isalpha(ch)){
//if中的isalpha是判断是不是英文字母的库,头文件是ctype
words[i] = ch;
i ++;
}else{
words[i] = '\0';
for(j = 0;j <= k;j ++){
if(strcmp(a[j].w,words) == 0){
a[j].count ++;
flag = 1;
break;
}
}
if(flag == 0){
a[k].count = 1;
strcpy(a[k].w,words);
k ++;
}
flag = 0;
i = 0;
}
}
//按照词频从小到大排序
for(int i = 0;i < k;i ++){
for(int j = i + 1;j < k;j ++){
if(a[i].count > a[j].count){
word temp = a[i];
a[j] = a[i];
a[i] = temp;
}
}
}
for(int i = 0;i < k;i ++){
printf("%s %d\n",a[i].w,a[i].count);
}
return 0;
}