第二章:我们都有梦想 (艺术打印字符型)

本题也是属于打印字符题型,但似乎比普通的找规律格式控制输出不太一样。
用到了类似桶排序的计数法,涉及到字符时需要特别注意的就是整型和字符型的转换,可以通过在整型后减去一个字符得到整型类型,也可以直接转换成字符对应的ASCII值来控制循环进行遍历。

下面进入正题:
描述

林静究竟在忙什么?暑假没有回家,现在打电话到他宿舍总是不在,郑微通过他的舍友给他留了自己的电话,也不见他回复。明明上火车的前两天郑微还跟林静通过电话,他在那一头答应得好好的,等她到了广州,他就会带她到处去玩,吃遍广州的小吃,当时郑微没有感觉到丝毫的异样,就连他的笑声也是一如既往地带着她熟悉的宠溺和宽容。
  可是现在郑微没忘记两人的约定,林静却踪影全无。难道是她打错了电话?不可能!那个电话她倒着也能背出来,何况那边接电话的舍友明明也是认得林静的,只是说他不在。
  不在不在,老是不在!还说是个模范好学生,不知道跑到哪鬼混去了!郑微气鼓鼓地想,等到见了面,非把他数落一顿不可。

有点不高兴的郑薇手里拿着一封已经封上了口的信,里面写满了她想对林静说的话,但此时的她小心将信封撕开,想再看一遍写下时的那份甜蜜。

你要做的就是对一篇文章的字母进行统计。 而文章是由好多行字母,空格,标点组成的每行不会超过72个字符,请打印一个统计直方图来统计每个字母出现的次数 (不统计空行,数字,标点)。

输入
输入一份郑薇的甜言蜜语,只含有大小写字符,空格,标点。

输出
打印这一份甜蜜的统计图,具体如样例(最后不要空行)。

输入样例 1

Amazing grace! How sweet the sound!
That saved a wretch like me!
I once was lost but now I am found,
Was blind but now I see.

输出样例 1

        *                                          
        *                                          
*       *                                          
*       *                             *            
*       *                 * *       * *     *      
*       *       *         * *       * *     *      
*       *       *         * *       * *     *      
*     * *     * *         * *       * * *   *      
* * * * *     * *     * * * *       * * *   *      
* * * * *   * * *     * * * *     * * * *   *      
* * * * * * * * *   * * * * *     * * * * * *     *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

提示

出国的林静并没有告诉郑薇任何消息。

思路:
首先,由于输出的均为大写字母,肯定要将小写字母转换为大写字母,这里我用到的是toupper函数,也可以判断是否为小写字母,如果是,则减去32得到其大写字母;
全部转换完之后,用一个数组对所有输入的字母计数,用来统计这26个字母分别具有的个数,然后得到个数最大值;
最后通过得到的这个个数最大值循环遍历,并且用flag来标记控制字符之间空格的输出。

下面是对应的AC代码实现:

#include<bits/stdc++.h>

using namespace std;
int a[100];  //定义一个数组用来计数
int main()
{
    string s; //定义字符串类型
    memset(a,0,sizeof(a));  //初始化该数组,即数组中无元素时计数为0
    while(getline(cin,s))  
    {
        int len=s.length();
        for(int i=0; i<len; i++)
        {
            s[i]=toupper(s[i]);  //toupper函数,若该元素是小写字母,则返回其大写字母
            a[toupper(s[i])]++;  //对每个输入的元素计数,即统计各个元素的个数,如:A出现了5次,计数为a[A]=5
        }
    }
    int maxx=0;  //首先将所统计的元素中个数最多的先置为0
    for(int i=65; i<=90; i++)  //由于i定义的是整型,而大写字母A和Z的ASCII值分别为65和90
        maxx=max(maxx,a[i]); //得到统计中的个数最多的值
    for(int i=0; i<maxx; i++) 
    {
        flag=0; //作为标记,控制空格的输出
        for(int j=65; j<=90; j++)
        {
            if(flag) 
                cout<<" ";
            if(maxx-i-1<a[j]) //表示只有该元素的个数比maxx-i大1时才输出星号,开始时只有个数最多的该元素才输出*
                cout<<"*";
            else cout<<" "; //字母对应列不符合的均输出空格
            flag=1; //由于每个字符或者*之间均有空格,因此不在字母对应列的均为空格
        }
        cout<<endl; //每循环一行之后输出换行
    }
    cout<<"A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\n";
}

加了注释,希望能更好的帮助你理解哦!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值