“圣诞树图案的打印~C语言”

题目原文:圣诞树

在这里插入图片描述

题目分析

首先我们把树分为上下两部,树干和树枝。仔细观察树枝我们发现,不管层级n是多少的圣诞树,它们的树枝都是由类似于小金字塔构成的。
例如:层数n == 1,树枝部分有1层,第一场是1个金字塔图案。
n == 2,树枝部分有2层,第一层有1个金字塔,第2层有2个金字塔。
n == 3,树枝部分有3层,第一层有1个,第二层有2个,第三层有3个…
树枝的部分,可以用循环来实现。

树枝第一步,打印空格。

在这里插入图片描述

n == 1,打印空白个数d == 2 , 1 , 0
n == 2,d == 2+3, 4 , 3 , 2 , 1 , 0
n == 3,d==2+3+3, 7 , 6 , … 3 , 2 , 1 ,0
规律:d == 3 * n - 1;
即每一层金字塔空白字符的打印都比上一次多3个 。

树枝打印第二步:打印图案

以n == 2为例:

打印第1层金字塔

		int d = 3 * n;
		for (int a = d -1;a>0;a--)//
		{
			printf(" ");
		}
		for (int k = 1; k <= i; k++)//k代表一行打印多少个“*     ”,i其实表示层数
		{
			printf("*     ");//把第一层当作“*     ”来打印,原因是n>1时(举例n==2),第二层
			//有2个金字塔,它们之间有5个空格。
		}
		printf("\n");
		for (int a = d - 2; a > 0; a--)//同上
		{
			printf(" ");
		}
		for (int k = 1; k <= i; k++)
		{
			printf("* *   ");
		}
		printf("\n");
		for (int a = d-3; a > 0; a--)//同上
		{
			printf(" ");
		}
		for (int k = 1; k <= i; k++)
		{
			printf("* * * ");
		}
		printf("\n");

接下来打印第2层,它开头的空格比上一次少3个:即d -= 3;
第2层打印2个金字塔图案,金字塔图案 k和层数 i 成正比例关系。所以用循环来表示。

int main()
{
	int n = 0;//层数
    scanf("%d", &n);
	int d = 3 * n;//a和d用于控制最开始的空白数;
	for (int i = 1; i <= n; i++)//树枝层数
	{
		for (int a = d -1;a>0;a--)//
		{
			printf(" ");
		}
		for (int k = 1; k <= i; k++){
			printf("*     ");
		}
		printf("\n");
		for (int a = d - 2; a > 0; a--)//同上
		{
			printf(" ");
		}
		for (int k = 1; k <= i; k++)
		{
			printf("* *   ");
		}
		printf("\n");
		for (int a = d-3; a > 0; a--)//同上
		{
			printf(" ");
		}
		for (int k = 1; k <= i; k++)
		{
			printf("* * * ");
		}
		printf("\n");
		d = d - 3;
	}
}

打印树干第一步,打印空格

层数n == 1,打印空格 d == 2;
n == 2,d == 2 + 3;
n == 3,d == 2 + 3 + 3;
规律 : d == 3 * n - 1;

for (int i = 1; i <= 3 * n - 1; i++)
		{
			printf(" ");
		}

打印树干第二步,打印图案

层数 n == 1;打印1行,每行1个
n == 2,打印2行,每行1个
n == 3,打印3行,每行1个

int c = 1;
while (c<=n)
	{
		for (int i = 1; i <= 3 * n - 1; i++)
		{
			printf(" ");
		}
		printf("*\n");
		c++;
	}

完整代码

int main()
{
	int c = 1;
	int n = 0;
    scanf("%d", &n);
	int d = 3 * n;
	for (int i = 1; i <= n; i++)
	{
		for (int a = d -1;a>0;a--)
		{
			printf(" ");
		}
		for (int k = 1; k <= i; k++)
		{
			printf("*     ");
		}
		printf("\n");
		for (int a = d - 2; a > 0; a--)
		{
			printf(" ");
		}
		for (int k = 1; k <= i; k++)
		{
			printf("* *   ");
		}
		printf("\n");
		for (int a = d-3; a > 0; a--)
		{
			printf(" ");
		}
		for (int k = 1; k <= i; k++)
		{
			printf("* * * ");
		}
		printf("\n");
		d = d - 3;
	}
	while (c<=n)
	{
		for (int i = 1; i <= 3 * n - 1; i++)
		{
			printf(" ");
		}
		printf("*\n");
		c++;
	}
	return 0;
}

如有不足,请大佬们指正。。。

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Filex;

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值