圣诞树的打印(初级与进阶)

这篇博客展示了如何使用C语言编程实现不同高度的圣诞树图案打印。通过输入高度,程序会输出对应的圣诞树图形,包括大三角部分和树干。示例中给出了不同高度的输出效果,从简单的单行星形到更复杂的多层结构。代码利用循环和条件判断构造了图形,并提供了递归思想的思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

圣诞树:

描述

今天是圣诞节,牛牛要打印一个漂亮的圣诞树送给想象中的女朋友,请你帮助他实现梦想。

输入描述:

输入圣诞树的高度h,1<= h <= 1001<=h<=100

输出描述:

输出对应的圣诞树

示例1

输入:

1

复制输出:

  *  
 * * 
* * *
  *

示例2

输入:

2

复制输出:

     *     
    * *    
   * * *   
  *     *  
 * *   * * 
* * * * * *
     *
     *

示例3

输入:

3

复制输出:

        *  
       * * 
      * * *
     *     *  
    * *   * * 
   * * * * * *
  *     *     *  
 * *   * *   * * 
* * * * * * * * *
        *
        *
        *
#include<stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    
    //printf("  *  \n * * \n* * *"); // 模拟输入为1的状态 其他状态由此构成   //不太行 换行不知道怎么处理
    for(int i=1;i<=3*n;i++) //圣诞树
    {
        int a=i%3;
        int b=i/3;   
        for(int j=3*n-i;j>=1;j--)// 树两边的空格
            printf(" ");
        if(a==1)
        {
            for(int j=1;j<=b;j++)
                printf("*     ");
            printf("*");     
        }
        else if(a==2)
        {
            for(int j=1;j<=b;j++)
                printf("* *   ");
            printf("* *");  
        }
        else
        {
            for(int j=1;j<=b-1;j++)
                printf("* * * ");
            printf("* * *");  
        }
        for(int j=3*n-i;j>=1;j--) // 树两边的空格 中间以“* ”打印 所以少一个空格
            printf(" ");
        printf("\n");
    }
    for(int j=n;j>=1;j--) //尾部
    {    
        for(int i=3*n-1;i>=1;i--)
            printf(" ");
        printf("*\n");    
    }
    return 0;
}

超级圣诞树:

描述

今天是圣诞节,牛牛要打印一个漂亮的圣诞树送给想象中的女朋友,请你帮助他实现梦想。

输入描述:

输入圣诞树的大小 nn

1≤n≤81≤n≤8

输出描述:

输出对应的圣诞树

示例1

输入:

1

复制输出:

  *
 * *
* * *
  *

示例2

输入:

2

复制输出:

     *
    * *
   * * *
  *     *
 * *   * *
* * * * * *
     *
     *

示例3

输入:

3

复制输出:

           *
          * *
         * * *
        *     *
       * *   * *
      * * * * * *
     *           *
    * *         * *
   * * *       * * *
  *     *     *     *
 * *   * *   * *   * *
* * * * * * * * * * * *
           *
           *
           *
 

示例4

输入:

4

复制输出:

                       *
                      * *
                     * * *
                    *     *
                   * *   * *
                  * * * * * *
                 *           *
                * *         * *
               * * *       * * *
              *     *     *     *
             * *   * *   * *   * *
            * * * * * * * * * * * *
           *                       *
          * *                     * *
         * * *                   * * *
        *     *                 *     *
       * *   * *               * *   * *
      * * * * * *             * * * * * *
     *           *           *           *
    * *         * *         * *         * *
   * * *       * * *       * * *       * * *
  *     *     *     *     *     *     *     *
 * *   * *   * *   * *   * *   * *   * *   * *
* * * * * * * * * * * * * * * * * * * * * * * *
                       *
                       *
                       *
                       *
//这道题有股递归地味道 每一级是它上一级的三个组成 但是递归怎么写呢?0_0
//参考题解可以用字符数组模拟递归
#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    scanf("%d",&n);
    int i,j,k;
    int row=3;
    int col=5;
    char ch[400][800]={"  *  "," * * ","* * *"};
    for( i=0;i<n-1;i++) // 上面的大三角部分递归次数 也就是复制的次数
    {
       for( j=0;j<row;j++)
       {
           for(k=0;k<col;k++)
           {
               ch[j+row][k]=ch[j][k]; // 左下角的图形复制
               ch[j+row][k+1+col]=ch[j][k]; //右下角图形复制
           } 
       }
   for(j=0;j<row;j++)  //清空原来的三角位置
       {
           for(k=0;k<col;k++)
           {
               ch[j][k]=' ';
           } 
       }
     for(j=0;j<row;j++)  //将左下角的三角复制到两个中间去
       {
           for( k=0;k<col;k++)
           {
              ch[j][k+row]=ch[j+row][k];
           } 
       }      
    row*=2;            // 递归使用
    col=col*2+1;      
    }
    for( j=0;j<row;j++)  //将左下角的三角复制到两个中间去
       {
           for(k=0;k<col;k++)
           {
              if(ch[j][k]=='*')
                 printf("%c",ch[j][k]);
               else
                   printf(" ");
           } 
        printf("\n");
       }
	for(j=0;j<n;j++)  //打印树干 
       {
           for( k=0;k<row-1;k++)
           {
              printf(" ");
           } 
           printf("*\n");
       }         
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值