• 作业3 词频统计


    2. 要求

    (1). 实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率。 附加要求:读入一段文本文件,统计该文本文件中单词的频率。

    (2). 性能分析:

    4. 作业提示

    (1). 定义

    • 字母: A-Z, a-z.
    • 字母数字: A-Z, a-z, 0-9.
    • 分隔符: 字母数字
    • 单词:
    • 包含有4个4个以上的字母
    • 单词分隔符分开
    • 如果一个字符串包含_非_字母数字,则不是单词
    • 单词大小写不敏感,例如 “file”、“FILE”和“File”可以看作同一个单词
    • 单词必须是字母开头,“file123”是单词,“123file”不是单词

    (2). 示例

    输入

    Word is case insensitive, i.e. “file”, “FILE” and “File” are considered the same word.

    输出

    word: 2
    case: 1
    insensitive: 1
    file: 3
    considered: 1
    same: 1



    预计至少一个下午做完,做起来才发现真的是无从下手……实际上做了八个小时左右。分析要在程序中逐步加入大写改小写、删除非字幕字符、确定字符长度大于等于4、单词频率统计四个程序块。
    #include <iostream>
    #include <vector>
    #include <algorithm> 
    #include <string>
    #include <fstream>
    using namespace std;
    
    struct WORD
    {
        string word;
        int num;
    };
    
    vector<WORD> a;  //创建vector对象,a[]
    
    int&value(const string&s)
    {
        for(int i=0;i<a.size();i++)
            if(s==a[i].word)
                return a[i].num;
            WORD p;
            p.word=s;
            p.num=0;
            a.push_back(p);  //在数组a最后添加数据
            return a[a.size()-1].num;
    }
    
    int main()
    {
        string str;
        cout << "输入字符串:
    ";
        char c;
        while(c=cin.get())
        {
            if(c>='a' && c<='z' || c>='A' && c<='Z' || c==' ' || c=='
    ')  
                str+=c;   //去除符号
            if(c=='
    ')
                break;
        }
    //输出去掉非英文字符的字符串
        
        
        for(int j=0;str[j]!='';j++)
        {
            if(str[j]>='A'&&str[j]<='Z')
            {
                str[j]+= 32;  //大写字母Ascll码+32转换为小写
            }
        }
     //输出转换为小写的字符串
    
        string buf;
        ofstream fout("D:123.txt");  //把转换好的字符串写入文件
        fout<<str;
        fout.close ();
        ifstream fin("D:123.txt");  //读出写入的字符串并排序
        while(fin>>buf)
        value(buf)++;
        vector<WORD>::const_iterator p;  //迭代器访问元素
        for(p=a.begin();p!=a.end();++p)
            cout<<p->word<<":"<<p->num<<'
    ';    
        return 0;
    }

    本来想直接读入字符串文件在进行大小写改写和删除字符的程序,但是一直不能运行成功,就改成了手动输入字符串。

    然后把改好大小写和删除好字符的字符串用Ofstream写入了原来的文件后再进行频率统计。虽然麻烦了点,但是也算是运行出来了……

    做完这个之后发现成绩出来了……最后剩下的框定单词长度的一步就没做急急忙忙准备交作业……

    运行结果:

    这两次作业让我知道了如何用输入输出的方式打开文件。巩固了之前C++学到的大小写转换,学习了如何去掉字符以及简单的词频统计程序。作业中没有做出来的单词长度回头还需要进一步研究。

    新学到了vector的用法:

    C++ vector用法 - 金河 - 博客园

    http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html



  • 相关阅读:
    时间
    matplotlib中文乱码
    文件路径
    mysql按照秒、分钟、小时、天、月、年统计数量
    python运行jmx文件
    查看Kafka group中的历史消息
    Django 工作流程
    python PyQt5 制作简单计算器
    python 根据链家爬取的信息生成云词
    python 爬取链家二手房信息
  • 原文地址:https://www.cnblogs.com/cchenhui/p/5284763.html
Copyright © 2020-2023  润新知