| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2485 人关注过本帖, 1 人收藏
标题:找频率最高的单词
只看楼主 加入收藏
爱睡觉的猫
Rank: 1
等 级:新手上路
帖 子:84
专家分:0
注 册:2017-4-19
结帖率:83.33%
收藏(1)
已结贴  问题点数:20 回复次数:9 
找频率最高的单词
能在给定的一篇英文文章中找出使用频率最高的单词。
具体要求:
1.    将英文文章存储在.txt文件中
2.    程序能在给定的文件中进行查找给定单词是否存在,并统计该文件中英文单词的数量及给出出现频率最高的单词。
3.    要进行功能的划分,将实现一定功能的代码写成函数。
急,求代码
搜索更多相关主题的帖子: 英文单词 英文文章 统计 
2017-05-31 15:37
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:7 
很简单,我写过一个实现了你的大部分要求的程序,只需要加两个计数器就完整了。你翻翻我的帖子,名字叫《链表的值是另一个链表》。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-31 15:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:7 
这个普通实现应该不太难~难点在如果要高效的话就要把txt里面的内容搬到字典树结构里面~当然还有一点就是需要一个关于单词分隔符的正则表达式~没理由全程单词都没有一个标点吧~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-31 15:57
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 3楼 九转星河
单词会用到的符号也就单引号和横杠,好简单的。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-31 16:35
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 4楼 renkejun1942
还有逗号句号感叹号问号分号省略号破折号括号等等之类的~这个看过一些程序是专门用一个数组保留~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-31 17:59
爱睡觉的猫
Rank: 1
等 级:新手上路
帖 子:84
专家分:0
注 册:2017-4-19
收藏
得分:0 
回复 3楼 九转星河
还没学啊,老师就讲了大概,听不懂
2017-06-03 09:31
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 爱睡觉的猫
那就做个最简单的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-03 11:12
zmf876870302
Rank: 3Rank: 3
来 自:福建
等 级:论坛游侠
威 望:3
帖 子:50
专家分:199
注 册:2017-3-26
收藏
得分:7 
回复 楼主 爱睡觉的猫
以下代码在Dev C++上编译运行通过。学习过程中,欢迎指教!
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#define  BUFLEN         81
#define  MORELEN        20

char delimiters[] = " \".,;;!?)(\n";

bool Seek_word(char *more, char *filename);
unsigned int Word_count(char *filename);
char *Most_words(char *filename, unsigned int count, char *data);
char *Word(char more[][MORELEN], unsigned int count, char *data);

int main(void)
{
    char buf[BUFLEN] = "\0";
    char more[MORELEN] = "\0";
    char data[MORELEN] = "\0";
    char filename[FILENAME_MAX] = "myfile.txt";
    FILE *pfile = NULL;
    unsigned int count = 0;
   
    printf("该程序能将英文文章存储在myfile.txt文件中!\n");
    printf("能在存储的文件中查找给定的单词是否存在!\n");
    printf("也能够统计存储的文件中英文单词的数量和出现频率最高的单词!\n");
    printf("注意:该程序统计单词时,是区分大小的。如:“And”与“and”是两个单词!\n");
   
    if((pfile = fopen(filename, "w")) == NULL)
    {
        printf("打开 %s 文件失败!\n\a\a\a", filename);
        exit(1);
    }
    setvbuf(pfile, NULL, _IOFBF, BUFSIZ);
   
    printf("\n现在请从键盘输入要存储在myfile.txt文件中的英文文章:\n");
   
    while(true)
    {
        fgets(buf, BUFLEN, stdin);
        
        if(buf[0] == '\n')
          break;
         
        if(EOF == fputs(buf, pfile))
        {
            printf("写入 %s 文件错误!\n\a\a\a", filename);
            exit(1);
        }
    }
   
    fclose(pfile);
    pfile = NULL;
   
    printf("\n请输入要查找的单词: ");
    scanf(" %s", more);
   
    if(Seek_word(more, filename))
      printf("\n%s有在文章中!", more);
      
    else
      printf("\n%s没有在文章中!", more);
      
    printf("\n该文件中英文单词的数量为:%u!\n", Word_count(filename));
   
    count = Word_count(filename);
    printf("\n该文件中出现频率最高的单词为:%s!\n", Most_words(filename, count, data));
   
    return 0;
}

bool Seek_word(char *more, char *filename)
{
    FILE *pfile = NULL;
    char buf[BUFLEN] = "\0";
   
    if(!(pfile = fopen(filename, "r")))
    {
        printf("打开 %s 文件失败!\n\a\a\a", filename);
        exit(1);
    }
    setvbuf(pfile, NULL, _IOFBF, BUFSIZ);
   
    while(true)
    {
        if(!fgets(buf, BUFLEN, pfile))
          break;
         
        char *pWord = strtok(buf, delimiters);
        
        if(pWord)
        {
            do
            {
                if(strcmp(pWord, more) == 0)
                {
                    fclose(pfile);
                    pfile = NULL;
                    
                    return true;
                }
                  
                pWord = strtok(NULL, delimiters);
            }
            while(pWord);
        }
    }
   
    fclose(pfile);
    pfile = NULL;
   
    return false;
}

unsigned int Word_count(char *filename)
{
    FILE *pfile = NULL;
    char buf[BUFLEN] = "\0";
    unsigned int count = 0;
   
    if(!(pfile = fopen(filename, "r")))
    {
        printf("打开 %s 文件失败!\n\a\a\a", filename);
        exit(1);
    }
    setvbuf(pfile, NULL, _IOFBF, BUFSIZ);
   
    while(true)
    {
        if(!fgets(buf, BUFLEN, pfile))
          break;
         
        char *pWord = strtok(buf, delimiters);
        
        if(pWord)
        {
            do
            {
                ++count;
                  
                pWord = strtok(NULL, delimiters);
            }
            while(pWord);
        }
    }
   
    fclose(pfile);
    pfile = NULL;
   
    return count;
}

char *Most_words(char *filename, unsigned int count, char *data)
{
    FILE *pfile = NULL;
    char buf[BUFLEN] = "\0";
    char more[count][MORELEN];
    unsigned int count1 = 0;
   
    if(!(pfile = fopen(filename, "r")))
    {
        printf("打开 %s 文件失败!\n\a\a\a", filename);
        exit(1);
    }
    setvbuf(pfile, NULL, _IOFBF, BUFSIZ);
   
    while(true)
    {
        if(!fgets(buf, BUFLEN, pfile))
          break;
         
        char *pWord = strtok(buf, delimiters);
        
        if(pWord)
        {
            do
            {
                strcpy(more[count1++], pWord);
                  
                pWord = strtok(NULL, delimiters);
            }
            while(pWord);
        }
    }
   
    fclose(pfile);
    pfile = NULL;
   
    strcpy(data, Word(more, count, data));
   
    return data;
}

char *Word(char more[][MORELEN], unsigned int count, char *data)
{
    int i = 0, j = 0;
    int max = 0;
   
    for(i = 0; i < count; ++i)
    {
        int n = 0;
        
        for(j = 0; j < count; ++j)
        {
            if((strcmp(more[i], more[j])) == 0)
               ++n;
        }
        
        if(n > max)
        {
            strcpy(data, more[i]);
            
            max = n;
        }
    }
   
    return data;
}

还在学习过程中,欢迎指教!
2017-06-03 17:25
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
setvbuf(pfile, NULL, _IOFBF, BUFSIZ);我看到了用setvbuf函数来设置缓冲区学习了~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-03 17:40
zmf876870302
Rank: 3Rank: 3
来 自:福建
等 级:论坛游侠
威 望:3
帖 子:50
专家分:199
注 册:2017-3-26
收藏
得分:0 
回复 9楼 九转星河
还有:setbuf(pfile, NULL);使用setbuf函数也可以设置缓冲区。

还在学习过程中,欢迎指教!
2017-06-03 18:58
快速回复:找频率最高的单词
数据加载中...
 
   



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

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