解题思路: 把问题分成多个小问题,一个一个处理,读入字符串后,先分离单词,变大写,去符号,放入map去重,统计个数,找最长单词,用vector找输入顺序,格式化输出;

注意事项: 因为要实现的功能有点多,所以用到了7个头文件,要是不喜欢太多,可以换成万能头文件:#include

#include <iostream>
#include <map>
#include <sstream>
#include <string>
#include <vector> 
#include <algorithm>
#include <iomanip>
using namespace std;
int main()
{
    int max=0; 
    string str,w,ww;
    vector<string> v1;
    map<string,int> s,flags;
    getline(cin, str);//string类按行读入 
    istringstream ss(str);//一个构造函数,用于分离有空格的字符串
    while (ss >> w)
    {
        ww="";//每次统计从空开始
       transform(w.begin(),w.end(),w.begin(),::toupper);//把string类的单词转换为大写,反之::tolowwer 
       for(int i=0;i<w.size();i++)
       {
           if(w[i]>='A'&&w[i]<='Z')//去除多余符号 
           ww+=w[i];//string 类不能一个一个赋值(ww[i]=w[i]),应该用自加的方式实现部分赋值,但对于字符串本身可以;
    }
    v1.push_back(ww);//把输入的所有单词存入vector,不会去重,也不会排序,使用尾插能实现按输入顺序保存单词 
    s[ww]++;//存入map容器,统计单词出现次数,会根据键值从小到大自动排序并去重, 
    }
    map<string,int>::iterator it;//定义迭代器 
    for(it=s.begin();it!=s.end();it++)
    {
        if(it->first.size()>max)//查找最长单词,键值也可以size,很棒 
            max=it->first.size();
    } 
    for(int k=0;k<v1.size();k++)
    {
        for(it=s.begin();it!=s.end();it++)
        {
            if(v1[k]==it->first&&flags[it->first]==0)//按照输入顺序查找并输出 
            {
                flags[it->first]=1;//标记为1,代表已经输出过一次了 
                cout<<setw(max)<<it->first<<":";//按最大单词长度输出键值(单词),默认右对齐 
                for(int j=0;j<it->second;j++)//输出单词后面的星号 
                    cout<<"*";
                cout<<it->second<<endl;//输出映射数据(出现次数) 
            }
        }
    }
    return 0;
}//dongdong


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论