洛谷-垂直柱状图-简单字符串
题目描述 Description
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入输出格式 Input/output
输入格式:
四行字符,由大写字母组成,每行不超过72个字符
输出格式:
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
四行字符,由大写字母组成,每行不超过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("\n"); 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\n"); 90 return 0; 91 }
我不怕千万人阻挡,只怕自己投降…