第二周 记录自己第一次纯靠自己过 普及-难度 P1598 垂直柱状图

这是第一次 完全靠自己过的 普及- 难度
特此写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;
} 
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值