这是第一次 完全靠自己过的 普及- 难度
特此写blog纪念一下
可以看出,只要求四行,且每行的最大长度也不过100
这里就已经大大降低了难度。
由于是 行 所以直接用gets()获取了。
char a[500],b[120],c[120],d[120];//四行话,不用scanf是因为不知道怎么判断最后一个单词。
gets(a);//读入四行话语
gets(b);
gets(c);
gets(d);
创建四个字符串函数即可。
注意,待会要用 strcat 函数连接到一起,于是a[500]要开大点,用来存放最后那个数组。
strcat(a,b);
strcat(a,c);
strcat(a,d);
然后就是给A~Z的26个字母 出现的次数,放在一个数组里面。
int word[26];
不过要注意,这个放在主函数之前,直接默认置0
然后就是switch 遇到A~Z的字母就对应word[i]++即可
for(int i=0;i<strlen(a);i++){//小于有效长度,这样就可以恰好完全读完了。
switch (a[i]){//一个个判断
case 'A':word[0]++;break;
case 'B':word[1]++;break;
...//省略其他字母
case 'Z':word[25]++;break;
}
}
由于开了个很大的数组,会有剩下的空间空余,且不利于for循环做判断
所以要用到strlen函数 直接获取有效长度,当作循环终止条件
此时要取出最大的那个word[i]
当 “顶梁柱”
效果图中,O出现了最高,就是出现了最多次。所以max就是“顶梁柱”
接下来 如何输出是最重头戏了。
首先,输出max列6行 * 和 空格 交替出现的表
只需要两重for即可
for(j=max;j>0;j--){
for(k=0;k<26;k++){
第一重的一个j,代表一行
每行开始都要从第一个开始,所以k每次要从0重新开始
重点在于 如何判断是否输出*
以A为例,word[0]是4,max为10,那么就是前六行 该输出第一个的时候,就是 空格 。
此时设置一个line 记录当前已经几行了
最后 发现总满足
max - word[k]<=line (k为这一行第k-1个字符,A位置就是word[0])
则输出 *
最后,再判断一下是否为行末即可。
附上自己的草图:
#include <stdio.h>
#include <string.h>
int word[26];//用于存放26个大写字母各自出现个数,word[0]储存A出现的次数,以此类推
int main(){
int max=0,n=0,i=0,j=0,k=0;
//a开这么大是因为这是要放四行话所有内容的。
char a[500],b[120],c[120],d[120];//四行话,不用scanf是因为不知道怎么判断最后一个单词。
gets(a);//读入四行话语
gets(b);
gets(c);
gets(d);
strcat(a,b);
strcat(a,c);
strcat(a,d);
for(int i=0;i<strlen(a);i++){//小于有效长度,这样就可以恰好完全读完了。
switch (a[i]){//一个个判断
case 'A':word[0]++;break;
case 'B':word[1]++;break;
case 'C':word[2]++;break;
case 'D':word[3]++;break;
case 'E':word[4]++;break;
case 'F':word[5]++;break;
case 'G':word[6]++;break;
case 'H':word[7]++;break;
case 'I':word[8]++;break;
case 'J':word[9]++;break;
case 'K':word[10]++;break;
case 'L':word[11]++;break;
case 'M':word[12]++;break;
case 'N':word[13]++;break;
case 'O':word[14]++;break;
case 'P':word[15]++;break;
case 'Q':word[16]++;break;
case 'R':word[17]++;break;
case 'S':word[18]++;break;
case 'T':word[19]++;break;
case 'U':word[20]++;break;
case 'V':word[21]++;break;
case 'W':word[22]++;break;
case 'X':word[23]++;break;
case 'Y':word[24]++;break;
case 'Z':word[25]++;break;
}
}
for(n=0;n<26;n++){//找出最大的那个值max,当顶梁柱。
if(word[n]>max){
max = word[n];
}
}
int line=0;//记录已经扫了几行,且从上往下数,0和1的选取,关乎是否取等号
for(j=max;j>0;j--){
for(k=0;k<26;k++){//k每次都要是0,因为每一行要从头开始
if(max - word[k]<=line){//神来之笔!必须要画图才能看懂---一个竖列里,line+要打*数量=max
if(k==25){
printf("*\n");
}else{
printf("* ");}
}else{
if(k==25){
printf(" \n");
}else{
printf(" ");
}
}
}
line ++;//扫完一行加一次
}
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;
}