现在需要统计若干段文字(英文)中的单词数量,并且还需统计每个单词出现的次数。 注1:单词之间以空格(1个或多个空格)为间隔。 注2:忽略空行或者空格行。统计前,需要从文字中删除指定标点符号!.,:*?。 注意:所谓的删除,就是用1个空格替换掉相应字符。 统计单词时需要忽略单词的大小写。用c++完成
时间: 2024-03-17 15:43:06 浏览: 162
好的,这是一个比较基础的文本处理问题,可以按照以下步骤实现:
1. 读入若干段文字,可以使用 getline() 函数逐行读入。
2. 删除标点符号,可以使用字符串的 replace() 函数,将指定字符替换为空格。
3. 将每行字符串按空格分割成单词,可以使用 stringstream 类和 while 循环,依次读取每个单词并统计出现次数。
4. 统计单词总数,可以使用 unordered_map 存储每个单词的出现次数,最后遍历 unordered_map 统计总数。
下面是实现代码:
```c++
#include <iostream>
#include <string>
#include <sstream>
#include <unordered_map>
using namespace std;
// 删除标点符号
void removePunct(string &s) {
for (int i = 0; i < s.length(); i++) {
if (s[i] == '.' || s[i] == ',' || s[i] == ':' || s[i] == '*' || s[i] == '?' || s[i] == '!') {
s[i] = ' ';
}
}
}
int main() {
unordered_map<string, int> wordCount; // 存储单词出现次数的 unordered_map
int totalCount = 0; // 总单词数
string line;
// 逐行读取
while (getline(cin, line)) {
// 删除标点符号
removePunct(line);
// 使用 stringstream 分割单词
stringstream ss(line);
string word;
while (ss >> word) {
// 忽略大小写
transform(word.begin(), word.end(), word.begin(), ::tolower);
// 统计单词出现次数
wordCount[word]++;
// 统计总单词数
totalCount++;
}
}
// 输出结果
cout << "Total words: " << totalCount << endl;
cout << "Word count:" << endl;
for (auto it : wordCount) {
cout << it.first << ": " << it.second << endl;
}
return 0;
}
```
这段代码使用了 unordered_map 来存储每个单词出现的次数,unordered_map 是一种基于哈希表实现的关联容器,可以快速地查找、插入和删除元素。在遍历 unordered_map 时,使用了 auto 关键字和范围 for 循环,更加简洁高效。
阅读全文