前言

  我不知道C#什么情况,不过C++里面,什么参数都不传时,argc=1,argv里面是当前程序名。当你传入dir时,argc=2,当你传入-e dir时,argc=3。

  这个文章十分适合有一点C语言基础,然后想自己独立完成这个作业的童鞋。预计只有一点点C语言基础的童鞋只需要5个小时左右就能搞定~

  如果有帮助请点赞。。还有哦。。blog里肯定不能给出代码的是吧,blog里面不能!!!~

  分析词频统计这个题目,主要需要实现3个部分:

  1. 递归的查找一个文件夹下面符合规则的文件。
  2. 对于每一个合法文件,进行读入,按照“单词规则”进行词的划分。
  3. 对于所有的词进行统计,排序,输出。

  这肯定不会给出源码。但是肯定对C语言基础的童鞋独立完成作业有很大的帮助!

  文件读入

  这里给出一个简单的方法:

  如果我们知道每个合法文件的绝对路径,就可以依次打开文件进行读取(用C的fopen或者C++的ifstream)。关键是如何知道一个文件夹下面所有的文件。如果你会使用CMD,就会知道在windows环境下dir这个指令和列出文件目录有关。通过查看dir的帮助文档,发现用如下命令可以递归的列出一个文件夹下面所有文件:

dir [dictionary] /S /B > FileDir.tmp

  并且cmd支持正则表达式,所以可以用*.txt等直接获得合法的文件。后面的大于号表示将输出保存到当前目录下面的FilrDir.txt文件中:

  于是我们就获得了所有需要统计的文件的绝对路径。这些信息保存在当前目录下的一个tmp文件中(其实就是一个文本文件)。关键是怎么在C++里面执行这个指令。stdlib.h里面有一个函数叫system(char* userCmd),表示在cmd里面执行userCmd命令。其中userCmd是一个字符串。所以我们可以在程序里面用system()函数执行那句命令,然后得到tmp文件。统计的时候,只需要把地址依次读出,然后打开那个地址指向的文件。统计词频就可以。好吧。。看来这里有很多问题。。。

  显然在你直接使用这个命令的时候不会出现任何问题。

system(argv[argc-]);

  但在程序里面测试实际地址的时候,竟然有人写了如下语句,然后还一直埋怨说调试过不了:

char str[]="D:\n.txt";
system(str);

  我不想用咆哮体,但。。。但忍不住啊!!!你输出回车的时候用的是什么啊?不是printf("\n");吗?难道就木有发现\是个转意字符吗?正确的写法是D:\\Dir好不好啊!!!

  

  单词划分 这个用不用C++特性无所谓,唯一需要的是细心,不要漏掉规则。

  词频统计

  如果说,让你统计有n个100以内的数字,每个数字出现的次数。这个很简单,你肯定会开一个长度101的数组arr,然后每当k出现一次,arr[k]++。但现在是统计单词出现次数。C++里面你可以是用一个东西叫做map(在map头文件中)。用map可以实现一个“数组” arr,这个数组的下表就是单词,保存的内容就是单词出现的次数。比如有一个单词叫buaa,那么通过map定义的“数组”,你可以实现arr["buaa"]++;这个操作。这个“数组”叫做map容器,可以当数组一样使用。定义一个map容器很简单:map的用法建议参考C++ primer。

map<string,int> wordMap;

  还有一个问题是怎么样保存应该输出哪个单词,在这里我是用了另一个map<string, string>保存的。就是所有的单词全换成小写,作为下标。对于某个单词输出的时候,输出的值是该单词在第二个map对应的单词,以及第一个map里对应的次数。

  排序输出

  在这里你可能需要先了解vector头文件中的vector,utility头文件中的pair,以及刚才提到的map。这两个数据结构都在C++primer中有详细介绍,分别在P78,P306,P309。如果你不了解这3个东西,下面一段话很可能看不懂。不过没有关系,你都有整个map容器了,大不了自己写一堆代码,把map的值全遍历到一个自己的数据结构里面,然后排个序输出。下面的方法只是讲用C++的库函数省了写过多代码。

  C++里面自带sort函数,在algorithm头文件中。sort函数可以排序数组,vector,等等(我不知道能不能排序map,没有试过,因为不用考虑效率问题,当时直接把所有map的内容移到vector里面了)。因为最后的答案是<key,value>键值对,而pair就是这种形式。所以直接用pair保存每一个<单词,次数>键值对。然后放在vector中。

pair<string,int> tmp;
tmp.first=wordTrans[mapIt->first];
tmp.second=mapIt->second;

  接下来对于vector(这里vector变量名是sortArray)直接sort就好了。

sort(sortArray.begin(),sortArray.end(),Compare);

  sort函数包含3个参数,分别是排序起始的位置,排序结束的位置,以及比较函数函数名。这个比较函数是自己写的。

bool Compare(pair<string, int> a,pair<string, int>b){...}

  函数需要返回bool型,以便告诉sort,在什么情况下,我认为a<b。

  通过这种方式,只需要几行代码就能完成最后一步。工作量要小不少。

  以上就是整个作业的大体。写下来大约100行左右。如果有什么问题或者需要接一下C++ primer,可以留言或者找我们小组的成员。

Z.XML

编辑:肖俊鹏

【tips】【词频统计】中可能用到的资源,以C++为例的更多相关文章

  1. Programming | 中/ 英文词频统计(MATLAB实现)

    一.英文词频统计 英文词频统计很简单,只需借助split断句,再统计即可. 完整MATLAB代码: function wordcount %思路:中文词频统计涉及到对"词语"的判断 ...

  2. sqoop进行将Hive 词频统计的结果数据传输到Mysql中

    使用sqoop进行将Hive 词频统计的结果数据传输到Mysql中. mysql准备接受数据的数据库与表 hive准备待传输的数据 sqoop进行数据传输  mysql查看传输结果     二:电子书 ...

  3. 作业3-个人项目<词频统计>

    上了一天的课,现在终于可以静下来更新我的博客了.       越来越发现,写博客是一种享受.来看看这次小林老师的“作战任务”.                词频统计 单词: 包含有4个或4个以上的字 ...

  4. C语言实现词频统计——第二版

    原需求 1.读取文件,文件内包可含英文字符,及常见标点,空格级换行符. 2.统计英文单词在本文件的出现次数 3.将统计结果排序 4.显示排序结果 新需求: 1.小文件输入. 为表明程序能跑 2.支持命 ...

  5. c语言实现词频统计

    需求: 1.设计一个词频统计软件,统计给定英文文章的单词频率. 2.文章中包含的标点不计入统计. 3.将统计结果以从大到小的排序方式输出. 设计: 1.因为是跨专业0.0···并不会c++和java, ...

  6. 软件工程第一次个人项目——词频统计by11061153柴泽华

    一.预计工程设计时间 明确要求: 15min: 查阅资料: 1h: 学习C++基础知识与特性: 4-5h: 主函数编写及输入输出部分: 0.5h: 文件的遍历: 1h: 编写两种模式的词频统计函数: ...

  7. Hadoop上的中文分词与词频统计实践 (有待学习 http://www.cnblogs.com/jiejue/archive/2012/12/16/2820788.html)

    解决问题的方案 Hadoop上的中文分词与词频统计实践 首先来推荐相关材料:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-c ...

  8. 使用storm分别进行计数和词频统计

    计数 直接上代码 public class LocalStormSumTopology { public static void main(String[] agrs) { //Topology是通过 ...

  9. jieba库分词词频统计

    代码已发至github上的python文件 词频统计结果如下(词频为1的词组数量已省略): {'是': 5, '风格': 4, '擅长': 4, '的': 4, '兴趣': 4, '宣言': 4, ' ...

随机推荐

  1. antd不想写那么多option怎么办

    做项目的时候发现如果下拉列表选项多的时候会写很多的 Option ,但是用到下拉列表的地方又超级多.所以自己写了一个方法,哪需要就放到哪. 记录一下方法.留待以后用 selectStreetIdCha ...

  2. 关于利用HashSet,split,deleteCharAt等方法详解

    1.首先了解一下HashSet的原理: Set接口  Set是对数学上集的抽象,Set中不包含重复的元素.如何界定是否是重复元素?Set最多可含一个null元素;对于任意的非null元素e1和e2,都 ...

  3. flex布局入门总结——语法篇

    前几天看了阮一峰的Flex布局教程,讲的很不错,总结一下,有兴趣的可以去看原文http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 一  F ...

  4. HyperLedger Fabric 1.4 超级账本简介(5.2)

    超级账本(Hyperledger)是推动区块链跨行业应用的开源项目的总称,组织成员可以发起新的区块链项目,加入到超级账本项目(Hyperledger)中,但需要遵循Hyperledger的生命周期.  ...

  5. Python入门及容易!网摘分享给大家!

    Python:Python学习总结 背景 PHP的$和->让人输入的手疼(PHP确实非常简洁和强大,适合WEB编程),Ruby的#.@.@@也好不到哪里(OO人员最该学习的一门语言). Pyth ...

  6. python eval()函数的妙用和滥用

    eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果: >>> s='8*8' >>> eval(s) 64 >& ...

  7. struts2官方 中文教程 系列七:消息资源文件

    介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字 ...

  8. 1826: [JSOI2010]缓存交换

    1826: [JSOI2010]缓存交换 https://www.lydsy.com/JudgeOnline/problem.php?id=1826 分析: 简单的贪心,然后调啊调...最近怎么了,码 ...

  9. C语言RL78 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 前段时间完成的hype ...

  10. java 日期格式 毫秒 表示方法

    参考URL:http://www.busfly.net/csdn/post/java_string_fomat_date_time_simpledateformat.html 关键代码: java.t ...