前言
NWAFU2022年1阶段问题C
一、题目
题目描述
请编程序实现:输入一个不大于13的正整数n和一个大写字母ch,输出以字母ch为中心,边长为n的X形图案。其中,若从上往下看,在X图案4条边上的字母都是依次递增的。
在此,认为大写字母'A'-'Z'按顺序构成了一个环形结构,即'Z'与'A'是相邻的。如果n>13,或n<=0,或输入字母不为大写字母,则输出“Input Data Error.”并结束程序。
输入
一个整数n和一个大写字母ch(输入时数字和字母中间允许有空格)
输出
对应的X形图案
样例输入
4X
样例输出
(图中.表示空格)
U.....U
.V...V.
..W.W..
...X...
..Y.Y..
.Z...Z.
A.....A
二、设计
最终结果
1.初学循环
代码如下(示例):
//2022_1536.c
#include <stdio.h>
void X_Print(int, char);
char if_OverFlow(int *);//溢出判断函数
int main(void) {
int n;
char ch;
scanf("%d%c", &n, &ch);
if (n > 13 || n <= 0 || ch < 65 || ch > 90) {
printf("Input Data Error.\n");
return 0;
} else {
X_Print(n, ch);
}
}
void X_Print(int x, char ch) {
int i, j, k;
int c = ch - x + 1;
for (i = 0; i < x; i++) {//打印图案的上半部分
if (i < x - 1) {
for (j = 0; j < i; j++) {
printf(" ");
}
c = if_OverFlow(&c);
printf("%c", c);
for (k = 0; k < 2 * (x - 1 - i) - 1; k++) {
printf(" ");
}
c = if_OverFlow(&c);
printf("%c", c);
for (k = 0; k < i; k++) {
printf(" ");
}
printf("\n");
} else if (i = x - 1) {
for (j = 0; j < i; j++) {
printf(" ");
}
c = if_OverFlow(&c);
printf("%c", c);
for (j = 0; j < i; j++) {
printf(" ");
}
printf("\n");
}
c++;
}
for (i = 0; i < x - 1; i++) {
for (j = 0; j < x - 2 - i; j++) {
printf(" ");
}
c = if_OverFlow(&c);
printf("%c", c);
for (k = 0; k < 2 * i + 1; k++) {
printf(" ");
}
c = if_OverFlow(&c);
printf("%c", c);
for (j = 0; j < x - 2 - i; j++) {
printf(" ");
}
printf("\n");
c++;
}
}
char if_OverFlow(int *pc) {
if (*pc < 65)
*pc += ('Z' - 'A' + 1);
else if (*pc > 90)
*pc -= ('Z' - 'A' + 1);
return *pc;
}
2.数学参透
#include <stdio.h>
#define _CRT_SECURE_NO_WORNINGS 1
int main()
{
int i, j, n;
char ch, r;
scanf("%d %ch", &n, &ch);
if(n>=13 || n<0 || ch<'A' || ch>'Z')
{
printf("Input Data Error.\n");
return 1;
}
for(i = 1; i<= 2*n-1; i++)
{
for(j = 1; j <= 2*n-1; j++)
{
if(i == j || j == 2*n-i)
{
r = 'A'+ (ch -'A' - (n-i) +26)%26;
printf("%c",r);
}
else
{
printf(" ");
}
}
printf("\n");
}
}
总结
了解循环每一步的目的很重要