X图案输出

前言

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");
    }
}

总结

了解循环每一步的目的很重要

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值