洛谷 P1598 垂直柱状图 代码 注解

题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过100个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。

输入输出格式
输入格式:
四行字符,由大写字母组成,每行不超过100个字符

输出格式:
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。

==================================================================

#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
       int sum[27]={0};            //默认26个字母最初只出现了0次;sum[0]不存东西,
                                           //sum[1]表示第一个字母A出现了几次。(sum数组记录对应字母出现次数)
       int flag[27]={0};           //flag数字表示1-26个字母这一行需不需要打印,需要打印则为1;标记数组
       char a[100];
       char b[100];
       char c[100];
       char d[100];
       gets(a);
       gets(b);
       gets(c);
       gets(d);                   //输入四个字符串
       int lena,lenb,lenc,lend;   
       lena=strlen(a);
       lenb=strlen(b);
       lenc=strlen(c);
       lend=strlen(d);           //strlen()函数得到字符串的长度。
       int i;
       for(i=0;i<lena;i++)
       {
           if(65<=a[i]&&a[i]<=90)
           {
               sum[a[i]-64]++; 
           }
       }
       for(i=0;i<lenb;i++)
       {
           if(65<=b[i]&&b[i]<=90)
           {
               sum[b[i]-64]++;
           }
       }
       for(i=0;i<lenc;i++)
       {
           if(65<=c[i]&&c[i]<=90)
           {
               sum[c[i]-64]++;
           }
       }
       for(i=0;i<lend;i++)
       {
           if(65<=d[i]&&d[i]<=90)
           {
               sum[d[i]-64]++;
           }
       }                                       //依次从四个字符串循环判断字符是否为大写字母
                                              //符合要求,则对应sum数组中的字母出现次数要加1,从而起到计数作用
       int maxsum=sum[1];        //默认第一个字母是出现最多次的;
                                             //一行一行,由上往下打印,从左到右打印,不能打印多余空格
                                             //最后一行就是A B C D E F G H I J K
       for(i=2;i<=26;i++)
       {
           if(sum[i]>=maxsum)
           {
               maxsum=sum[i];          //比较,找出出现最多次的字母,即打印最多个*号的字母
           }
       }
       int j=maxsum;                  //maxsum赋值给j,表示*号最多打印j行,最后一行打印ABCD````Z;
       int k=maxsum;                  //k来记录这回打印的是表示出现第几次的*号
       //k要减1,并且flag要变为0;
       for(i=0;i<j;i++)
       {
           int time=1;                      //最远打印到第几个字母,默认打印到第一个字母就好;
           for(int a=1;a<=26;a++)
           {
               if(sum[a]>=k)              //k是表示当前这行打印的是表示出现了几次的
                                            //举例:如果当前k=7,表示这行打印出的*号对应的字母,至少出现了7次;
                                                  //如果sum[a]>=k;说明该字母出现的次数至少有k次,这一行应该打印。
               {
                   flag[a]=1;               //应该打印*好,故flag数组记为1 这个字母上方需要打印*号。
                   if(2*a-1>=time)
                   {
                       time=2*a-1;      //time 用来记录当前所在行,最远打印到第几个字母
                   }
               }
           }          //以上工作为从上到下标记,以下操作为从左到右打印,从上到下。
           for(int b=0;b<time;b++)
           {
               if(flag[b/2+1]==1)           //  根据标记结果,从左到右打印
               {
                   printf("*");
                   flag[b/2+1]=0;
               }
               else
               {
                   printf(" ");
               }
           }
            printf("\n");

           k--;
       }
        printf("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");
       return 0;
}

有其他方法欢迎互相学习讨论。
2019.7.12;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silam Lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值