前言
在牛客网的基础语法练习中几乎所有的题目都是入门和简单的题目,只有两道题是中等难度的,其中一道就是这篇文章所要提到的——圣诞树,这个题目在各大网站上几乎都没怎么提到,有的也仅仅只有代码(我刚开始写的时候也是非常的痛苦,自己一个人看代码实在是看的很头痛),接下让我们进入这道题目。
圣诞树
1.题目
这道题的链接我也会放在评论区。
2.示例
3.分析
在做这道题目的时候我们最关键的一步就是找好分析的例子,这里我选择的是第二个示例,相比于3它形状还是较为简单的,相比于1它更具有一般性。
这里我们通过和示例一的对比,我们可以把这个图像分为1,2两个部分(红色的部分),上半部分就是3个三角形,下面就是树干,当然树干的部分是比较容易可以想出的,这道题的难点也就在于上半部分的代码。
对于上半部分我们单独拿出来再分成1,2两个部分(也就是用蓝色框框的部分)。现在,题目开始变的明了了起来,我们接下来要进行的就是打印出第一个三角形,先打印空格再打印号,当然我们还是要画图进行观察。
对于第一行,先打印五个空格,在打印号,第二行4个,第三行三个,这道题目最巧妙的地方在于我们设置一个变量 int d=3*n那么这里的空格就表示成了d-1,d-2,d-3;这里我们再来观察下半部分,下半部分的三角形中最让人压抑的部分在于他中间的空格,所以我们再打印三角形三行的时候我们就要注意这一点,printf("* "); printf("* * "); printf("* * * ");
我们观察中间空格的个数,写出上面三种代码,解决了中间空格下半部分的*号`前面的空格怎么办呢?刚刚说到一个非常巧妙的变量d下面的空格是2,1那么我们就让b-=3就完美的解决了问题。
当然最后树干部分的打印这里也不多说了,代码一目了然。
4.代码
上面题目的分析我也在下面代码的实现中做了一些注意方便大家理解
```c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n=0;
int c = 1;
while ((scanf("%d", &n)) != EOF)
{
int d = 3 * n;
for (int i = 0; i < n; i++)
{
//打印第一行
for (int j = 0; j < d - 1; j++)//先打印空格
{
printf(" ");
}
for (int k = 0; k <= i; k++)//在打印*
{
printf("* ");
}
printf("\n");
//打印第二行
for (int j = 0; j < d - 2; j++)//先打印空格
{
printf(" ");
}
for (int k = 0; k <=i; k++)//在打印*
{
printf("* * ");
}
printf("\n");
//打印第三行
for (int j = 0; j < d - 3; j++)//先打印空格
{
printf(" ");
}
for (int k = 0; k <= i; k++)//在打印*
{
printf("* * * ");
}
printf("\n");
d -= 3;
}
//树干部分打印
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3 * n - 1; j++)
{
printf(" ");
}
printf("*\n");
}
}
return 0;
}
## 5.结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/5c375185802248fdbfeb89b059c08e5d.png)
## 6.总结
这个题目和上一篇文章讲的图形问题不太一样,这个更为进阶,但是所有打印图形的题目都有一个非常重要的解题步骤就是**画图!画图!画图!**画图可以非常方便我们去理解。