JSK-16014 打印字母图形【打印图案】

打印字母图形
由键盘输入一个大写字母(A 到 Z 中的任意一个),输出如下图所示由相关大写字母组成的图形。所输入的字母一定为输出文件的第一个字符(位于图形的左上角),其余部分的字母构成规律和分布由样例给出。
输入格式
输入只有一行,仅为一个大写字母。
输出格式
输出包含一个如样例所示的图形。注意图形的行数与输入的字母有关,图形中的第一行最左侧一定是你输入的那个字母。
样例输入1
C
样例输出1
CBAAB
  BAA
    A
样例输入2
E
样例输出2
EDCBAABCD
  DCBAABC
    CBAAB
      BAA
        A
题目来源
2016 年海淀区中小学生信息学奥林匹克竞赛

问题链接JSK-16014 打印字母图形
问题描述:(略)
问题分析
    这是一个打印图案问题。关键是找出其中的规律与关系。
    对于输入的字母,首先要先算出需要打印几行,以便程序控制输出的行数。
    实际上,输出的每一行包括三部分组成,空格、字符串和换行。其数量都与行数成函数关系。这种函数关系在程序中通常是用表达式给出的,并写在程序中。
    这个问题的另外一个关键的输出的字符是有规律变化的,程序中用函数nextchar()来计算下一个输出的字符。用程序计算这种变化规律,相比数学公式来说更加方便灵活。
程序说明:(略)
参考链接:(略)
题记:规律与关系尤为重要。

AC的C语言程序如下:

/* JSK-16014 打印字母图形 */

#include <stdio.h>

char c, a;
int step;
char nextchar(char a)
{
    if(a == 'A' && step == -1) {
        step = -step;
        c--;
        return a;
    } else if(a == c && step == 1) {
        step = -step;
        return a;
    } else
        return a + step;
}

int main(void)
{
    int n, i, j;

    scanf("%c", &c);

    a = c;
    n = c - 'A' + 1;

    step = -1;
    for(i = 0; i < n; i++) {
        for(j = 0; j < i; j++)
            putchar(' ');
        for(j = 0; j < 2 * (n - i) - 1; j++) {
            putchar(a);
            a = nextchar(a);
        }
        putchar('\n');
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/82939420