【C/C++ 07】词频统计

一、题目

读入一篇英文短文,去除介词、连词、冠词、副词、代词等非关键性单词后,统计每个单词出现的次数,并将单词按出现次数的降序和单词字符的升序进行显示5个单词。

二、算法

1. 通过<fstream>库创建fstream流对象,并从文件中读取全部字符存入内存。

2. 将内存的字符串进行空格、标点符号、换行符的分割,若分割后的单词属于需要记入统计的单词,则将其存入map容器中,通过map进行词频统计。

3. 对map中的词频统计结果写入vector中进行排序,并按照规定的排序顺序进行打印。

三、代码

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
#include <fstream>
#include <cstring>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;// 不计入统计的单词表:介词、连词、冠词、副词、代词
vector<string> g_delWord = {"to", "in", "on", "for", "of", "from", "between", "behind", "by", "about", "at", "with", "than","a", "an", "the", "this", "that", "there","and", "but", "or", "so", "yet","often", "very", "then", "therefore","i", "you", "we", "he", "she", "my", "your", "hes", "her", "our", "us", "it", "they", "them","am", "is", "are", "was", "were", "be","when", "where", "who", "what", "how","will", "would", "can", "could"
};// 仿函数
struct Compare
{bool operator()(const pair<string, int> e1, const pair<string, int> e2){return e1.second > e2.second;}
};int main()
{// 1. 读入文件数据//    ofstream:写文件//	  ifstream:读文件//	  fstream:读写文件fstream f;//	  ios::in//	  ios::out//	  ios::app,追加写,配合ios::out使用//	  ios::trunc,覆盖写,配合ios::out使用//	  ios::binary,以二进制的形式f.open("./test1.txt", ios::in);if (!f.is_open()){cout << "file open failed!" << endl;return 1;}char text[4096] = { 0 };f.read(text, 4096);// 2. 分割字符串存入mapmap<string, int> wordMap;const char* cut = " ,.!?;:\n";	// 部分单词分隔符char* w = strtok(text, cut);while (w){string word = w;// 单词转小写string lwrWord;transform(word.begin(), word.end(), back_inserter(lwrWord), ::tolower);// 排除不计入统计的单词if (find(g_delWord.begin(), g_delWord.end(), lwrWord) == g_delWord.end()){wordMap[lwrWord]++;// map 的 “[]”重载,有插入、查询、修改功能,返回值为键值对的second值或false}w = strtok(NULL, cut);}// 3. 词频排序vector<pair<string, int>> wordVec;for (auto& e : wordMap){wordVec.push_back(e);}// sort是基于快速排序实现的算法,是不稳定的排序算法,可用stable_sort代替stable_sort(wordVec.begin(), wordVec.end(), Compare());for (int i = 0; i < 5; ++i){cout << "<" << wordVec[i].first << "," << wordVec[i].second << ">" << endl;}return 0;
}

四、测试

测试文档test1.txt

No one can help others as much as you do. 
No one can express himself like you. 
No one can express what you want to convey. 
No one can comfort others in your own way. 
No one can be as understanding as you are. 
No one can feel happy, carefree, and no one can smile as much as you do. 
In a word, no one can show your features to anyone else.
hi, how are you? I love you!

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/451562.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么把物品信息图片批量生成二维码?每张图片单独生码的制作技巧

现在通过扫码来查看人员或者物品信息的方式越来越常见&#xff0c;在合适的位置放置对应的二维码内容&#xff0c;让其他人通过扫码来获取图片信息。那么如果我们将每个信息做成一张图片后&#xff0c;需要将图片生成二维码时&#xff0c;有能够批量生成二维码的方法可以快速处…

网络攻击和渗透中:注入信息无回显?(给盲注戴上眼镜)靶机实战利用Ecshop 2.x/3.x SQL注入/任意代码执行漏洞

网络攻击和渗透中:注入信息无回显?(给盲注戴上眼镜)靶机实战利用Ecshop 2.x/3.x SQL注入/任意代码执行漏洞。 工具简介: 平常的漏洞检测或漏洞利用需要进一步的用户或系统交互。但是一些漏洞类型没有直接表明攻击是成功的。如Payload触发了却不在前端页面显示。(像ssrf,XX…

Linux驱动 SPI子系统

1、SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种同步串行数据通信协议&#xff0c;通常用于连接微控制器和外部设备&#xff0c;如传感器、存储器、显示器等。SPI协议使用四根线进行通信&#xff0c;包括时钟线&#xff08;SCLK&#xff09;、数据输…

linux中的mtime,ctime,atime

目录 结论 文件 touch新文件 调整文件内容 echo直接修改 vi修改 修改文件属性 调整归属 调整权限 读取文件 目录 增加文件 调整目录下文件属性 访问目录下文件 删除文件 结论 mtime&#xff1a;文件内容的修改时间&#xff08;不含权限、属组修改&#xff09; …

2024/2/3学习记录

微信小程序 小程序中组件的分类 视图容器 view 普通视图区域&#xff0c;类似于 div 常用来实现页面的布局效果。 scroll-view 可滚动的视图区域&#xff0c;常用来实现滚动列表效果 swiper 和 swiper-item 常用 swiper 组件的常用属性 轮播图容器组件和轮播图item组件 基…

CSS:水平垂直居中

公共的 CSS 样式&#xff1a; .parent {width: 300px;height: 300px;background-color:#d0e4fe; }.child {width: 100px;height: 100px;background-color:orange; }HTML: <div class"parent"><div class"child"></div> </div>最…

新春营销活动推广策略和拓客方式

对于企业而言&#xff0c;新春不仅仅是庆祝和分享欢乐的时刻&#xff0c;更是一个黄金的营销机会&#xff0c;通过精心策划的节日促销活动来提升品牌知名度和销售业绩的绝佳时机。巧妙地将产品、服务与节日气氛相结合&#xff0c;企业能够创造出独特的购物体验&#xff0c;吸引…

LabVIEW电能质量监测系统

LabVIEW电能质量监测系统 随着全球能源需求的增加以及能源危机的加剧&#xff0c;对电能的有效利用和质量监控变得越来越重要。特别是在电力系统中&#xff0c;电能质量的监测对于保证电力设备的稳定运行和提高能源利用效率具有重要意义。采用LabVIEW软件开发了一套高效的电能…

智能设备管理系统:PreMaint助力药厂攻克设备管理难题

在药品生产中&#xff0c;设备管理是确保质量的关键环节。传统的手工操作和纸笔记录方式已经难以适应当今药厂的需求&#xff0c;存在诸多问题。这些问题包括设备管理工作的不成体系&#xff0c;难以随时掌握设备的状态&#xff0c;以及设备无法满足工艺流程的需求。面对这些挑…

原型中之filter()-过滤

注意&#xff1a;filter()不会对空数组进行检测、不会改变原始数组 array.filter(function(currentValue, indedx, arr), thisValue) currentValue&#xff1a;必须。当前元素的值;index&#xff1a;可选。当前元素的索引值&#xff1b;arr&#xff1a;可选。当前元素属于的数…

某人寿保险公司:超融合承载核心业务系统,支撑信创改造与数据中心异地迁移

案例亮点 45 节点超融合承载个险核心、单证管理、统信报送、销管系统等核心业务系统与关键数据库&#xff0c;采用 SmartX 原生虚拟化 ELF。基于鲲鹏&#xff08;ARM 芯片&#xff09;完成信创化改造&#xff0c;顺利通过验收。生产业务虚拟机 guest OS&#xff08;Redhat、ce…

由于误删了node依赖,导致这后面的一系列操作

文章目录 1. 事发原因&#xff1a;Delete select files2. Delete select files引起的cross-env报错3. cross-env是node_modules的依赖工具4. 那么Delete selected files到底是什么操作5. 重装node_modules依赖包&#xff0c;也报错6. 报错&#xff1a;cb() never called!7. 算了…