在C中打印字母金字塔

时间:2013-05-04 03:43:55

标签: c

我正在尝试在C中编写一个程序,它提供一个13行金字塔,其输出如下(注意字母的模式,即BCB):

            A
           BCB
          DEFED
         GHIJIHG
        KLMNONMLK
       PQRSTUTSRQP
      VWXYZABAZYXWV
     CDEFGHIJIHGFEDC
    KLMNOPQRSRQPONMLK
   TUVWXYZABCBAZYXWVUT
  DEFGHIJKLMNMLKJIHGFED
 OPQRSTUVWXYZYXWVUTSRQPO
ABCDEFGHIJKLMLKJIHGFEDCBA

以下是我对解决方案的尝试:

#include <stdio.h>
#include <stdlib.h>


int main(void){

    char c = 'A';
    int height = 13;
    int max = 1;
    for (int i = 1; i <= height; i++){
        //int j = 1;
        for (int k = 0; k < height - i; k++) 
            printf(" "); // print space on left
        for (int j = 1; j <= max; j++){ 
            if (j <= max / 2){ // print left side of pyramid 
                printf ("%c", c);
                c = (c - 'A' + 1) % 26 + 'A';
            }
            else{ // print right side of pyramid 
            printf ("%c", c);
            c = (c -'A' + 25) % 26 + 'A';
            }
        }
        printf("\n");
        max += 2;
    }

}

但是它会输出以下错误信息:

            A
           ZAZ
          YZAZY
         XYZAZYX
        WXYZAZYXW
       VWXYZAZYXWV
      UVWXYZAZYXWVU
     TUVWXYZAZYXWVUT
    STUVWXYZAZYXWVUTS
   RSTUVWXYZAZYXWVUTSR
  QRSTUVWXYZAZYXWVUTSRQ
 PQRSTUVWXYZAZYXWVUTSRQP
OPQRSTUVWXYZAZYXWVUTSRQPO

如果我删除将金字塔拆分为两边并且只有if/else的{​​{1}}语句,我会得到以下输出:

c = (c - 'A' + 1) % 26 + 'A';

有什么想法吗?

2 个答案:

答案 0 :(得分:6)

问题在于你忘记增加实际的整体角色。对于每一行,您需要添加字符,直到获得下一行应该开始的值。值得庆幸的是,这很容易做到:

    ...
    max += 2;
    c = (c - 'A' + max / 2 + 1) % 26 + 'A'; // Add this line
}

答案 1 :(得分:1)

这是一个简短的版本:

#include <stdio.h>

#define HEIGHT 6

int main(void) {
    char* f = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char* b = "ZYXWVUTSRQPONMLKJIHGFEDCBA";
    int c = 0;

    for(int i=0; i<HEIGHT; ++i)
    {
        printf("%*.*s%.*s\n", 10, i+1, f+i+c, i, b+strlen(b)-(c+2*i));
        c+=i;
    }
    return 0;
}

IDEOne Link

输出:

Success #stdin #stdout 0s 9424KB
         A
        BCB
       DEFED
      GHIJIHG
     KLMNONMLK
    PQRSTUTSRQP