统计英文单词词频(c版)

统计英文单词词频–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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值