poj 2136 打印字母的树状图

水一发。注意每列中间有空格,每行末无空格。

还有另一个需要注意的地方:如下这段代码

if(s[i]>='A' && s[i]<='Z'){
                num[s[i]-'A']++;
                res = max(res,num[s[i]-'A']);
            }
如果写成

if(s[i]>='A' && s[i]<='Z')
        res = max(res,++num[s[i]-'A']);
那么会出现错误。 原因在于max的宏定义。因为max的定义采用三目运算符,所以在res更新的时候,++运算会执行两次,导致错误。以后要注意在宏定义中要少用表达式或者函数调用。

#include <stdio.h>
#include <string.H>
#define N 100
#define max(a,b) ((a)>(b)?(a):(b))
char s[N];
int num[27];
int main(){
    int i,j,res=0;
    memset(num,0,sizeof(num));
    for(j = 0;j<4;j++){
        gets(s);
        for(i = 0;s[i]!='\0';i++)
            if(s[i]>='A' && s[i]<='Z'){
                num[s[i]-'A']++;
                res = max(res,num[s[i]-'A']);
            }
    }
    for(i = res;i>=1;i--){
        for(j = 0;j<26;j++){
            if(num[j] >= i)
                putchar('*');
            else
                putchar(' ');
            if(j<25)
                putchar(' ');
        }
        putchar('\n');
    }
    for(j = 0;j<26;j++){
        putchar('A'+j);
        if(j<25)
            putchar(' ');
    }
    putchar('\n');
    return 0;
}


你可能感兴趣的:(poj 2136 打印字母的树状图)