打印菱形详解!

 1、问题

有一个问题需要大家来想一下,用C语言怎么打印菱形图案呢?

 好的,经过大家的思考,应该都有思路或者答案了吧,那么请大家跟我一起往下看。

 2、思路和解析

其实这个问题很简单,首先我们先整理一下思路:

首先观察图案,从第一行开始直到第七行每一行都会在上一行的基础上增加两个“*”,从第七行到最后一行每一行在上一行的基础上减少两个“*”。

假设我们把这个图形分为上下两个部分,分别打印,上半部分由第一行到第七行组成,下半部分由第八行到第十三行组成。此时我们可以把总行数定义为7或者line

#define line 7

上半部分 

接着开始开始打印上半部分图形。根据上面的思路

由此我们可以写出以下代码:

#define line 7
int main()
{
   for(int i=1;i<=line;i++)       //初始化i=1,表示从第一行开始计算
   {
      for(int j=1;j<=2*i-1;j++)    //为什么是 j<=2*i-1 呢? 因为用该式子可以表示每一行需要的*号的数量、、、比如第一行需要一个*号,根据式子 2*i-1==2*1-1=1
      {   
          printf("*");
      }
     printf("\n");
    }
}

但是我们最后得出的结果是下图这个图形

这是为什么呢???

原因是通过以上的代码我们只求出每一行需要打印的“*”的个数,然鹅忽略了每一行“*”之前还有空白的存在,所以导致最后出现的结果不是我们预期中的样子。

那么该怎么解决呢?

既然我们找到了原因就是每一行“*”之前的空白我们没有处理,那我们可以在每次打印“*”之前先打印对应的空格数量就可以解决了。

 由此我们可以对上面的代码将进行补充:

#define line 7
int main()
{
   for(int i=1;i<=line;i++)       //初始化i=1,表示从第一行开始计算
   {
      //首先打印空格
      for(int j=1;j<=line-i;j++)   //为什么是j<=line-i呢?因为要先打印空格,所以根据规律就可以得知,每一行要打印的空格的个数(就是每一行,要循环的列的数)。、、、在第一行,有六个空格就要循环六次列,每一次循环列都打印一次空格,所以第一行可以打印六次空格。以此类推                                                                                                                                                       
      {
         printf(" ");
      } 
      //然后打印“*”号
      for(int j=0;j<2*i-1;j++)    //为什么是 j<=2*i-1 呢? 因为用该式子可以表示每一行需要的*号的数量、、、比如第一行需要一个*号,根据式子 2*i-1==2*1-1=1
      {   
          printf("*");
      }
     printf("\n");
    }
}

 接下来我们就可以打印完整的上半部分:

下半部分

上半部分已经打印完成,接下来我们打印下半部分的图形

下半部分应该如何打印呢?可以参考上半部分的步骤,下半部分也可以先打印“*”之前的空格,然后再打印“*”。

全部都整理完成后,我们可以把代码补充完整

#define line 7
int main()
{
   for(int i=1; i<=line; i++)       //初始化i=1,表示从第一行开始计算
   {
      //首先打印空格
      for(int j=1; j<=line-i; j++)   //为什么是j<=line-i呢?因为要先打印空格,所以根据规律就可以得知,每一行要打印的空格的个数(就是每一行,要循环的列的数)。、、、在第一行,有六个空格就要循环六次列,每一次循环列都打印一次空格,所以第一行可以打印六次空格。以此类推                                                                                                                                                       
      {
         printf(" ");
      } 
      //然后打印“*”号
      for(int j=1; j<=2*i-1; j++)    //为什么是 j<=2*i-1 呢? 因为用该式子可以表示每一行需要的*号的数量、、、比如第一行需要一个*号,根据式子 2*i-1==2*1-1=1
      {   
          printf("*");
      }
     printf("\n");
    }

for (int i = 1; i <= line - 1; i++)
{
    //打印空格
    for (int j = 1; j <= i; j++)    //此步骤同上
    {
        printf(" ");
    }
    //打印“*”号
    for (int j = 1; j <= 2 * (line - i) - 1; j++)  //此步骤同上
    {
        printf("*");
    }
    printf("\n");
    }
}

 通过以上代码可以得到结果:

这就是菱形的打印方法,感谢大家的观看,如果有错误欢迎大家纠正和补充,我一定会纠正和反思,感谢!!!😎😎😎😎😍😍😘

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值