前言

  我不知道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. webpack4——打包html报错解决

    ①先引入html-webpack-plugin插件,然后在终端下载 npm install --save-dev html-webpack-plugin ②我的文件结构 ③修改webpack.dev. ...

  2. lua浮点数取整

    向下取整 math.floor(num) 向上取整 math.ceil(num) 取整取余 math.modf(num) 测试 num = 12.4 print(math.floor(num)) 12 ...

  3. 企业Shell面试题及企业运维实战案例(三)

    1.企业Shell面试题1:批量生成随机字符文件名案例 使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下: ...

  4. 【mysql学习-2】

    part-1: USE mysql;CREATE TABLE tb_x(id INT,NAME CHAR(10));INSERT INTO tb_x VALUES(5,"a");S ...

  5. Elasticsearch 常用API

    1.   Elasticsearch 常用API 1.1.数据输入与输出 1.1.1.Elasticsearch 文档   #在 Elasticsearch 中,术语 文档 有着特定的含义.它是指最顶 ...

  6. node获取头信息数据

    req.fresh req.stale var version = 100; app.get('/test',function(req,res){ res.set('etag',version); i ...

  7. FPGA算法学习(1) -- Cordic(圆周系统之旋转模式)

    三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来计算任意角度的三角函数的值.这种表格在人们刚刚产生三角函数的概念的时候就已经有了,它们通常是通过从已知值(比如sin(π/2)= ...

  8. MVC中输入的保护验证用:HttpServerUtility.HtmlEncode

    安全说明: 上面的代码使用HttpServerUtility.HtmlEncode来保护应用程序的恶意输入 (即 JavaScript).详细信息请参阅如何: 在 Web 应用程序,通过应用 HTML ...

  9. Microsoft Security Essentials 和 Windows Defender 离线升级包下载地址

    自从微软提供了免费的杀毒软件之后我就卸载掉了其他的杀毒软件.但是最近遇到了个小问题,我这里有一批电脑不能联网,杀毒软件的升级成了问题.在网上搜索了一番,终于找到了官方的离线升级包下载地址.放在这里备用 ...

  10. 5 多线程 模拟qq聊天

    1.多线程思路 使用多线程完成一个全双工的QQ聊天程序 2.版本1:程序小框架 #1.收数据,然后打印 def recvData(): pass #2.检测键盘,发数据 def sendData(): ...