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 }


 
原文地址:https://www.cnblogs.com/geek-007/p/5666402.html