标签:意图 表达式 oid stdio.h 描述 程序 lse 信息 键盘输入
打印字母图形
由键盘输入一个大写字母(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;
}
标签:意图 表达式 oid stdio.h 描述 程序 lse 信息 键盘输入
原文地址:https://www.cnblogs.com/tigerisland45/p/9743206.html