| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6382 人关注过本帖, 1 人收藏
标题:英文单词统计
只看楼主 加入收藏
ft4029928
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2008-12-14
结帖率:81.82%
收藏(1)
 问题点数:0 回复次数:11 
英文单词统计
我们老师给我们出了一个题目:用C语言编写一个程序,可以打开一个英文文本如txt文本,统计其中各个字母的个数,我实在想不出来,请各位高手指教,非常感谢!
搜索更多相关主题的帖子: 单词 英文 统计 
2008-12-14 14:24
ft4029928
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2008-12-14
收藏
得分:0 
例如文章里有I am a boy.I love china.I love book and basketball.
统计出:
I:3
love:2
a:1
.
.
.
.
请帮下忙


2008-12-14 14:27
liumang_D
Rank: 2
来 自:计算机
等 级:论坛游民
威 望:1
帖 子:89
专家分:50
注 册:2008-10-20
收藏
得分:0 
是统计字母的个数还是单词的个数阿。看你的题目说的是字母的个数阿,但是看你下面补充说明的是单词的个数阿,要是字母的个数就简单了,要是单词的个数,就不那么好写了。
把难写了给你参考参考,不一定好哦,呵呵
程序代码:
/*********************************************************************************************************
思路:先把文件里面的所有内容读到buf中,因为在字符串中处理字符比较方便。
           再分析buf,得到单词个数。分配对应个数的单词空间,即二维数组存放这些单词,这相当
               于把buf划分为以单词为基本单位了。
           最后通过二维数组来判断各个单词个数了。
*********************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    FILE *fp;
    char **word, ch, *buf;
    int length, i, j, k, sign_w, same, number_w = 0, num = 0;
    if((fp = fopen("text.txt", "rb")) == NULL)
    {
        printf("cannot open text.txt!\n");
        return 0;
    }
    
    /*把文件指针移到文件尾*/
    if(!fseek(fp, 0, SEEK_END))

    {

        length = ftell(fp); // 获取文件长度

    }
    else
    {
        fclose(fp);
        printf("1: fseek error!\n");
        return 0;
    }
    
    /*把文件指针移到文件头*/
    if(fseek(fp, 0, SEEK_SET)) 

    {

        fclose(fp);

        printf("2: fseek error!\n");

        return 0;

    }
    

    if(buf = (char *)malloc(sizeof(char) * (length + 1))) // +1是为了把buf分配的足够大

    {

        memset(buf, 0, (length + 1)); // 把buf清0             

        fread(buf, 1, length, fp); // 把文件内容全部读到buf中

        fclose(fp);                               

    } 

    else                                          

    {

        fclose(fp);

        fprintf(stderr, "malloc error!\n");

        return 0;

    }
    
    /*统计总的单词个数*/
    sign_w = 1;
    for(i = 0; i < length; i++)
    {
        ch = *(buf + i);
        if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
        {
            sign_w = 0;
        }
        else if(!sign_w)
        {
            number_w++;
            sign_w = 1;
        }
    }
    
    /*分配number_w(总单词个数)个长度为20(一般单词长度小于20)的字符数组*/
    word = (char **)malloc(number_w * sizeof(char *));

    for(i = 0; i < number_w; i++)
    {
        word[i] = (char *)malloc(20 * sizeof(char));
        memset(word[i], 0, 20);
    }
    
    /*获取所有单词*/
    sign_w = 1;
    k = 0;
    j = 0;
    for(i = 0; i < length; i++)
    {
        ch = *(buf + i);
        if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
        {
            word[k][j++] = ch;
            sign_w = 0;
        }
        else if(!sign_w)
        {
            k++;
            j = 0;
            sign_w = 1;
        }
    }
    free(buf);
    
    /*计算每个单词的个数*/
    for(i = 0; i < number_w; i++)
    {
        /*判断此单词是否和前面统计过的单词相同*/
        same = 0;
        for(j = 0; j < i; j++)
        {
            if(!strcmp(word[i], word[j]))
            {
                same = 1;
                break;
            }
        }
        
        /*统计从没有统计过的单词个数*/
        if(!same)
        {
            num = 0;
            for(j = i; j < number_w; j++)
            {
                if(!strcmp(word[i], word[j]))
                {
                    num++;
                }
            }
            printf("%s : %d\n", word[i], num);
        }
    }
    free(word);
    return 1;
}

    


[[it] 本帖最后由 liumang_D 于 2008-12-14 16:45 编辑 [/it]]
2008-12-14 14:43
ft4029928
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2008-12-14
收藏
得分:0 
就是统计单词的个数,所以我想不出来。


2008-12-14 15:04
guoming1232006
Rank: 2
等 级:新手上路
威 望:4
帖 子:438
专家分:0
注 册:2008-11-20
收藏
得分:0 
回复 第4楼 ft4029928 的帖子
恩,难啊,不会了,帮你顶上去!等高手了。。。。

寡人有疾,寡人好色......
2008-12-14 15:20
PcrazyC
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:5652
专家分:0
注 册:2006-10-20
收藏
得分:0 
定义一个结构体

typedef struct{
    char name[50];
    int size;
}word;

以这个结构体为基本单元建立一个链表遇到一个单词先判断是否在链表中如果不在就添加到链表如果存在相应的SIZE加1

雁无留踪之意,水无取影之心
2008-12-14 15:29
ft4029928
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2008-12-14
收藏
得分:0 
能不能写个全点的来分析一下
还有遇到标点符号怎么处理


2008-12-14 16:42
liumang_D
Rank: 2
来 自:计算机
等 级:论坛游民
威 望:1
帖 子:89
专家分:50
注 册:2008-10-20
收藏
得分:0 
我补充了我的回复,在三楼,看看吧,有什么问题直接回复,在线给你解答,反正这下无聊
2008-12-14 16:55
ft4029928
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2008-12-14
收藏
得分:0 
搞掂了,感谢三楼的大哥,你太棒了


2008-12-14 16:57
ying8501
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:1092
专家分:1446
注 册:2008-11-24
收藏
得分:0 
//用C语言编写一个程序,可以打开一个英文文本如txt文本,统计其中单词的个数-----不讨论重复性----  呵呵,不好意思。后来才看到你的解释:是统计单词的个数
//分析:英文单词用“,. 空格 * # ?  数字 "等非字符隔开。
#include <stdio.h>
#include <stdlib.h>
void main()
{
    FILE *fp;
    char ch0,ch;
    int  i, j,count=0;

    if((fp = fopen("text.txt", "r")) == NULL)
    {
        printf("cannot open text.txt!\n");
        exit(0);
    }
   
    ch0=fgetc(fp);
    if(ch0>='a'&&ch0<='z'||ch0>='A'&&ch0<='Z')count++;   //判断第一个字符是否为单词的开始。

    while(!feof(fp))
    {
        ch0=ch;
        ch=fgetc(fp);
        if((ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')&&!(ch0>='a'&&ch0<='z'||ch0>='A'&&ch0<='Z'))count++;
    }
    
    if(!(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'))count--;   //判断最后是否统计错误。


    printf("总单词个数为: %d\n\n",count);

    fclose(fp);
}

[[it] 本帖最后由 ying8501 于 2008-12-14 17:33 编辑 [/it]]
2008-12-14 17:26
快速回复:英文单词统计
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016797 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved