jmu数据结构实验四任务
选做:题目 4—统计单词的出现次数并输出
总时间限制: 2000ms 内存限制: 4096kB
描述
根据用户给定的一篇包含若干个单词的英文文章(文章只包含英文字母和空格、回车换行符,单词之间
以空格或者回车换行符分隔,单词最短一个字母,最长100个字母;最多包含100000个不同的单词),请
解析出所有不同的单词,并统计出每个单词出现的次数,然后按照单词出现的次数从小到大输出,如果出
现次数一样,则按照英文单词的词典顺序输出(忽略大小写区别,输出时全部变成小写字母)。
输入
英文文章。以“***”作为结束标志。
输出
单词按照出现次数从小到大的输出,一行一个单词。
样例输入
This is just a test test test te st ***
样例输出
a is just st te this test
题解
使用 map<string, int> dict 存放每个单词与其对应的存放次数。其中 key 值为单词,value 值为单词出现次数,每次输入使用transform函数(或自己编写转化小写的函数)将单词转化为小写,存入dict。
使用正向迭代器遍历dict,将所有单词及其出现个数存入结构体数组words,之后使用sort函数对结构体数组words进行按出现个数从小到大排序。
代码
#include<iostream>
#include<map>
#include<algorithm>
#include<cstring>
using namespace std;
struct word
{
char word[105];
int n;
}words[100005];//保存所有单词及其出现个数用于排序
bool cmp(struct word word1, struct word word2)
{
return word1.n < word2.n;
}
map<string, int> dict;//保存所有单词出现个数
int main()
{
string word;
do
{
cin >> word;
if (word != "***")
{
transform(word.cbegin(), word.cend(), word.begin(), ::tolower);//利用transfor函数将word转换为小写
dict[word]++;//单词个数加一
}
} while (word != "***");
auto it = dict.begin();//dict的正向迭代器,用于遍历dict
int n = 0;//所有单词种数
while (it != dict.end())
{
memcpy(words[n].word, it->first.c_str(), 105);//将word转换为c风格字符串复制给words[n].word
words[n].n = it->second;//将该单词出现个数赋值给words[n].n
it++;//迭代器移动
n++; //单词种数
}
sort(words, words + n, cmp);//对结构体word按单词出现个数从小到大排序
for (int i = 0; i < n; i++)
{
cout << words[i].word << endl;
}
return 0;
}