超详解之动态打印圣诞树

前言:这篇文章是我在牛客网刷题过程(打印圣诞树🎄图案)中遇到的较为难做的一道(对如今的我而言哈),特在此发表一下自己的理解,希望能给对这道题目有疑惑的人一些帮助。

a10b115eb8e4495cb49239cd1f1754e8.jpeg

目录

1. 题目(没做的可以去做一做哈)

2. 详细解答(重要环节)

3. 完整代码及图案展示

4. 结语


1. 题目

这是牛客网编程初学者入门训练的一道题目

88a433d182294f36b69fe8dd87b87c46.png

 大家没做的可以先去做一做,题目如下9ee162e3db904d9aa98f480d70935ff4.png

 2. 详细解答

简述:这道题的重点是分析圣诞树的图案,题目中给出了h=1~3时圣诞树的图案,而我们需要从这这三个图案中提取出一些关键的信息。当然,图案越丰富关键信息越多,所以这道题的突破重点就是h=3时的图案,同时在分析图案三时要结合图二与图一,使得图三中提取出的条件同样满足二者.

分析:具体分析图案三,结合图一图二可以得到以下的一些规律

(1) 输入h后,每颗圣诞树的树体都有 row = 3 * h

(2) 每一行前的空格个数依次为8,7,6,5,...,0,从而得到这个有关的一个规律:即各行i对应的空格数 k = row - i

(3) 打印出的各行*号与空格的具体信息,我们直接见图分析

 

在完成(3)规律的寻找后,我们就可以完成该树体程序的大致框架

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int h = 0;
    scanf("%d", &h);
    int i = 0;
    int j = 0;
    int row = 3 * h;
    for (i = 1;i <= row;i++) //打印row行的树体
    {
        for (j = 1;j <= row - i;j++) //注意:这里是row-i,不是row-1
        {
            printf(" ");
        }
        if (i % 3 == 1) //打印一颗星
        {
            

        }
        else if (i % 3 == 2) //打印两颗星
        {
            

        }
        else //打印三颗星
        {
            

        }
    }
	return 0;
}

(4) 接下来就是该程序最大的难点了,就是如何实现各个相似过程的循环,由分析可知相似有三

1. 打印 1 个 * 5个空格(*     )------1,4,7...行

2. 打印 1 个 * 1个空格 1个 * 3个空格(* *   )------ 2,5,8...行

3. 打印1 个 * 1 个空格 1 个 * 1 个空格 1 个 * 个 1 空格 (* * * )------ 3,6,9...行

而分析各个数字与可以得出相关规律:

1. 数字 1,4,7,10,13在表达式(i / 3 + i % 3)中可以得到数字1,对应一次循环次数

2. 同样的,数字 2,5,8,11,14在表达式((i-1) / 3 + (i-1) % 3)中可以得到数字2,对应两次循环次数

3. 如法炮制,数字 3,6,9,12,15在表达式((i-2) / 3 + (i-2) % 3) 中可以得到数字3,对应三次循环次数

分析好这三步,这个程序也就结束了,其实也不难,只要想到了 1. 其他两个就简单了,我们会觉得难也是做题比较少。所以,xdm,冲冲冲!!!

这样就可以把整个树体程序补充完了

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int h = 0;
    scanf("%d", &h);
    int i = 0;
    int j = 0;
    int row = 3 * h;
    for (i = 1;i <= row;i++) //打印row行的树体
    {
        for (j = 1;j <= row - i;j++) //注意:这里是row-i,不是row-1
        {
            printf(" ");
        }
        if (i % 3 == 1) //打印一颗星
        {
            for (j = 0;j < i / 3 + i % 3;j++)
            {
                printf("*     ");
            }
            printf("\n");
        }
        else if (i % 3 == 2) //打印两颗星
        {
            for (j = 0;j < (i - 1) / 3 + (i - 1) % 3;j++)
            {
                printf("* *   ");
            }
            printf("\n");
        }
        else //打印三颗星
        {
            for (j = 0;j < (i - 2) / 3 + (i - 2) % 3;j++)
            {
                printf("* * * ");
            }
            printf("\n");
        }
    }
	return 0;
}

 (5)一棵树的树体完成后,接下来就要解决树干部分了,该程序中这个树干是最简单的地方,理解树体的形成后,树干的代码编写就不难了,我在此就不一 一赘述了,xdm自己好好理解一下哈。相关代码给你们了哟

for (i = 0;i < h;i++)//树干的形成
    {
        for (j = 0;j < row - 1;j++)
        {
            printf(" ");
        }
        printf("*\n");
    }

3. 完整代码及图案展示

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int h = 0;
    scanf("%d", &h);
    int i = 0;
    int j = 0;
    int row = 3 * h;
    for (i = 1;i <= row;i++) //打印row行的树体
    {
        for (j = 1;j <= row - i;j++) //注意:这里是row-i,不是row-1
        {
            printf(" ");
        }
        if (i % 3 == 1) //打印一颗星
        {
            for (j = 0;j < i / 3 + i % 3;j++)
            {
                printf("*     ");
            }
            printf("\n");
        }
        else if (i % 3 == 2) //打印两颗星
        {
            for (j = 0;j < (i - 1) / 3 + (i - 1) % 3;j++)
            {
                printf("* *   ");
            }
            printf("\n");
        }
        else //打印三颗星
        {
            for (j = 0;j < (i - 2) / 3 + (i - 2) % 3;j++)
            {
                printf("* * * ");
            }
            printf("\n");
        }
    }
    for (i = 0;i < h;i++)//树干的形成
    {
        for (j = 0;j < row - 1;j++)
        {
            printf(" ");
        }
        printf("*\n");
    }
	return 0;
}

图案:

89962b3e3560403b90149fe07b9588b1.png

4. 结语

各位,我相信看到这句话的人肯定是想解决这一问题的,可能你一下子没看懂,但千万不要放弃,我们的编程之路才刚刚起步,未来一个又一个难到自己的题目会出现,难道要全放弃吗?相信自己,解决自己的疑问才会有所收获,有所进步,才能在进步中喜悦,越走越远!在未来,我会更积极努力地学习编程知识,多写代码,也希望各位如此,希望我们这些现在的菜鸟在未来也可以成为大牛,加油吧各位! 

                                                                 Never  Give  Up ! ! !

4d25458022ab428486e8baee0f0f0928.jpeg

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值