• Openjudge-NOI题库-垂直直方图


    题目描述 Description

    写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
     输入输出格式 Input/output
    输入格式:
    四行字符,由大写字母组成,每行不超过72个字符
    输出格式:
    由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
     输入输出样例 Sample input/output
    样例测试点#1

    输入样例:

    THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
    THIS IS AN EXAMPLE TO TEST FOR YOUR
    HISTOGRAM PROGRAM.
    HELLO!

    输出样例:

                                *
                                *
            *                   *
            *                   *     *   *
            *                   *     *   *
    *       *     *             *     *   *
    *       *     * *     * *   *     * * *
    *       *   * * *     * *   * *   * * * *
    *     * * * * * *     * * * * *   * * * *     * *
    * * * * * * * * * * * * * * * * * * * * * * * * * *
    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

    思路:
    这题难度一般,但是写起来较为复杂
    ①先用一个数组ans统计每个字母出现的次数
    ②将字符串数组kk里的字符全部变为"$"(这样可以避免偶然性)
    ③按照每个字母出现的次数将"*"存入数组(要隔开一行来存,所以我的数组开到了52而不是26)我的思路如下图所示:

    ④从后往前按整列输出不为"$"的字符(这里我用了一个小技巧:记录字母出现最多的次数,用max记录下来从后往前扫时只用以max为起点即可,这样可以减少很多循环)


    代码如下:
     1 #include <stdio.h>
     2 #include <string.h>
     3 int main()
     4 {
     5     int n,i,j,l,q=0;//i,j循环经常用的,l也是用来循环26次的 
     6     l=26;
     7     char a[82],b[82],c[82],d[82];
     8     char kk[52][82];
     9     int ans[26];//记录每个字母出现的次数 
    10     int max=0;//出现次数最多的字母出现的次数 
    11     /*========================*///清零工作开始 
    12     for(i=0;i<26;i++)//归零 
    13     {
    14         ans[i]=0;
    15     }
    16     for(i=0;i<52;i++)//二维字符串数组清零(全部变为$) 
    17     {
    18         for(j=0;j<82;j++)
    19         {
    20             kk[i][j]='$';
    21         }
    22     }
    23     /*========================*///输入四行句子 
    24     gets(a);
    25     gets(b);
    26     gets(c);
    27     gets(d);
    28     /*========================*///统计字母出现的次数 
    29     for(i=0;i<strlen(a);i++)
    30     {
    31         if(a[i]>='A'&&a[i]<='Z') 
    32         {
    33             ans[a[i]-65]++;
    34         }
    35     }
    36     for(i=0;i<strlen(b);i++)
    37     {
    38         if(b[i]>='A'&&b[i]<='Z') 
    39         {
    40             ans[b[i]-65]++;
    41         }
    42     }
    43     for(i=0;i<strlen(c);i++)
    44     {
    45         if(c[i]>='A'&&c[i]<='Z') 
    46         {
    47             ans[c[i]-65]++;
    48         }
    49     }
    50     for(i=0;i<strlen(d);i++)
    51     {
    52         if(d[i]>='A'&&d[i]<='Z') 
    53         {
    54             ans[d[i]-65]++;
    55         }
    56     }
    57     for(i=0;i<26;i++)//找出出现次数最多的字母出现的次数,待会儿会用到 
    58     {
    59         if(ans[i]>max) max=ans[i];
    60     }
    61     /*========================*///开始存入"*"
    62     j=0;
    63     while(l>0)//循环26次 
    64     {
    65         for(i=0;i<ans[q];i++)//按照ans数组中的个数来存入* 
    66         {
    67             kk[j][i]='*';
    68         }
    69         j=j+2;        
    70         l--;
    71         q++;
    72     }    
    73     /*========================*///开始输出 
    74     for(i=max-1;i>-1;i--)
    75     {
    76         for(j=0;j<52;j++)
    77         {
    78             if(kk[j][i]!='$')
    79             {
    80                 printf("%c",kk[j][i]);
    81             }
    82             else
    83             {
    84                 printf(" ");
    85             }
    86         }
    87         printf("
    ");
    88     }
    89     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
    ");
    90     return 0;
    91 }
    
    
    
     
  • 相关阅读:
    移动端h5实现拍照上传图片并预览&webuploader
    移动端实现上拉加载更多(使用dropload.js vs js)
    实用的移动端日历选择插件
    string.replace替换
    js与native的交互
    div实现返回符,倒三角,椭圆+小知识收集
    js返回一组日期中最近连续的天数
    javascript 事件冒泡和事件代理
    微信小程序DEMO——面包旅行的代码
    微信小程序使用 iconfont
  • 原文地址:https://www.cnblogs.com/geek-007/p/5666402.html
Copyright © 2020-2023  润新知