• 分析一个文档(英语文章)中各个词出现的频率,并打印频率最高的前10个。


    程序思路1.首先完成读文件的操作,并存储单词,

        2,利用map的value排序,并记录单词的个数。

                3。打印频率最高的10个。

      日记:刚开始拿到这个题目是有点棘手,以前也做过类似的输入一段英文字母,并计算单词个数以及文件读取输入的操作,但要把他们合起来一块就没有做过了。

    回去后我做了一下程序的分析思路。

    先是确定程序具体需要实现怎样的功能,打印频率前10的单词。

    所以我们需要有处理分析一个文本的东西,我用map的value排序,借助vector 。

    之后我通过调用函数库里的函数进行了插入,排序,读取在,最后输出。里面最新颖的还是利用了map这个关联式容器,增加和删除节点对迭代的结果很小。还有其中的插入,排序,查找,删除的功能,效率高。

    时间安排:

    2.26   我开始想起要做软件工程的作业了,想了一下,感觉时间还很充裕,就想了下该做些什么。把题目先明确了。

    2.28    晚上有些时间,写了一些代码,零零总总的一个文件读写功能实现模块。想了想怎么实现排序,插入等集成功能,实用类还是用容器。

    3.1       上网查了下,发现map这个容器很不错,效率也挺高,搞过来了。然后调试代码,很费劲。但也能实现基本功能,有一些是网上的东西。

    #include <iostream> 
    #include <algorithm> 
    #include <fstream> 
    #include <map> 
    #include <vector> 
    #include <iterator> 
    #include <functional> 
    #include <string> 
    #include <cstring> 
    #include <cstdio>  
    #include <cstdlib> 
    using namespace std; 
    #define COUNT 10  //打印前多少个单词 
    //单词类 
    class WordTop10 

    private : 
        map<string,int> mapWord;   //存储单词 
       vector<pair<string ,int > > pair_vec;  //因为要按map的value排序,借助vector 
    public : 
     
        void insertWord(const string& word);  //插入单词到map 
        void sortWord();                                  //按map的value排序 
        void readFile(const string& strFileName); //从文件读数据 
        void outPut();                                          //输出 
    }; 
     
    //在map中插入一个单词 
    void WordTop10::insertWord(const string& word) 

        map<string,int>::iterator mit; 
        mit = mapWord.find(word); 
        if( mit != mapWord.end()) 
        { 
            mit->second ++; 
        } 
        else 
        { 
            mapWord[word] = 1; 
        } 

    //递减排序 
    int cmp(const pair<string ,int >& a,const pair<string ,int >& b) 

        return a.second > b.second; 

    //按map中的value排序 
    void WordTop10::sortWord() 

        
        for(map<string,int>::iterator map_iter = mapWord.begin(); map_iter != mapWord.end(); ++map_iter) 
        { 
            pair_vec.push_back(make_pair(map_iter->first,map_iter->second)); 
        } 
        sort(pair_vec.begin(),pair_vec.end(),cmp);   //排序 
        

     
    void WordTop10:: outPut() 

        int i = 0; 
        for(vector<pair<string ,int > >::iterator cur = pair_vec.begin(); cur != pair_vec.end(); ++cur) 
        { 
            i++; 
            if(i >COUNT)   //输出前COUNT个 
            { 
                return ; 
            } 
            cout << cur->first <<" "<<cur->second<<endl; 
        } 

     
     
    //从文件中读取数据 
    void WordTop10::readFile(const string& strFileName) 

        string text; 
    // c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化,下面就是这一转化过程。 
        ifstream in(strFileName.c_str()); 
     
        if (!in) 
        { 
            cout << "~文件打开失败~" << endl; 
     
        } 
     
        while (in >> text) 
        { 
            //text.erase(remove_if(text.begin(),text.end(),bind2nd(equal_to<char>(),'-')), text.end());  
            //因为读入是以空格分割的,需要处理两边的表标点符号 
            //取出最后的标点,假设最多有三个尾标点 
            string::iterator it = text.end(); 
            if(text.length() != 0 &&  ispunct(text[text.length()-1]))   
                text.erase(it-1);                  //去掉最后那个标点 
     
            it = text.end();   
             if(text.length() != 0 && ispunct(text[text.length()-1])) 
                text.erase(it-1); 
     
              it = text.end();   
             if(text.length() != 0 &&  ispunct(text[text.length()-1])) 
                text.erase(it-1); 
            //有时前面也有符号 ,假设3个 
            it = text.begin(); 
           if(text.length() != 0 &&ispunct(text[0])) 
                text.erase(it); 
     
            it = text.begin();  
           if(text.length() != 0 && ispunct(text[0])) 
                text.erase(it); 
     
                 it = text.begin(); 
           if(text.length() != 0 &&ispunct(text[0])) 
                text.erase(it); 
     
            //很多字符串带 “--”,特殊处理,--也是标点符号,两头的已在前面处理过,这里处理中间的 
            size_t npos = text.find("--"); 
            if( npos != -1) 
            { 
                string text1 = text.substr(0,npos);  //--把text分割成两个单词 
                string text2 = text.substr(npos+2); 
                insertWord(text1); 
                insertWord(text2); 
     
            } 
            else 
            { 
                insertWord(text); 
            } 
             
        } 
     
        in.close(); 
        in.clear(); 
        return ; 
    }  
       
    int main() 

     
        WordTop10 wordTop; 
     
        wordTop.readFile("H:\haha.txt");  
        wordTop.sortWord(); 
         wordTop.outPut(); 
        return 0; 

  • 相关阅读:
    /pentest/enumeration/0trace/0trace.sh
    2.2synchronized同步语句块
    2.1synchronized同步方法
    第二章:对象及变量的并发序言
    第一章总结
    1.11守护线程
    1.10线程的优先级
    1.9yield方法
    1.8暂停线程
    微信自动回复
  • 原文地址:https://www.cnblogs.com/dxl12306/p/3576735.html
Copyright © 2020-2023  润新知