经典循环案例——打印空心金字塔

*“在得知转专业成功后我便开始了各方面的准备

这个五一假期来的十分及时,刚好给予了我学习C语言基础的时间

(虽然我不太喜欢调休,不过以后的课程数量,调不调休应该都差不多吧,习惯就好)”*


《打印空心金字塔》这是我在C语言课程学习中,遇到的一个很有趣的项目,主要是对循环语句的考察

# 题目:打印一个空心的金字塔
## 思路:通过对输出结果的分析,逐渐推理出方法

### 过程1:先利用for循环打印一个n层的实心的金字塔

  先打印一个四层金字塔
     *    ——第一层,1个"*",前半部分n-1个" "
    ***   ——第二层,3个"*",前半部分n-2个" "
   *****  ——第三层,5个"*",前半部分n-3个" "
  ******* ——第四层,7个"*",前半部分n-4个" "
  
  以此类推得到:
  ......  ——第n-1层 , [2(n-1)-1]个"*",  前半部分n-(n-1)个" "
  ......  ——第n层 ,  (2n-1)个"*"   ,  前半部分n-n个" "
  
代码如下:
复制代码
    void main()
    {
        int i, j, k, n;
        printf("请输入您希望打印的金字塔的层数\n");
        scanf_s("%d", &n);
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= n - i; j++)
            {
                printf(" ");
            }

            for (k = 1; k <= (2 * i - 1); k++)
            {
                printf("*");
            }

            printf("\n");
        }
        system("pause");
    }
复制代码
运行结果如下:
复制代码

QQ截图20210512135937.png

### 过程2:再利用if语句判断是打印“*”还是“ ”,打印一个n层的空心的金字塔

  先打印一个四层空心金字塔
     *    ——第一层,前半部分n-1个" ",第一个"*"与最后一个"*"之间有0个" "
    * *   ——第二层,前半部分n-2个" ",第一个"*"与最后一个"*"之间有1个" "
   *   *  ——第三层,前半部分n-3个" ",第一个"*"与最后一个"*"之间有3个" "
  ******* ——第四层,前半部分n-4个" ",打印7个"*"              
  
  以此类推得到:
  ......  ——第n-1层 ,前半部分n-(n-1)个" ", 第一个"*"与最后一个"*"之间有[2(n-1)-1]个" "
  ......  ——第n层 ,前半部分n-n个" ",打印(2n-1)个"*"                                  
  
  代码如下:
  
复制代码
    void main()
    {
        int i, j, k, n;
        printf("请输入您希望打印的金字塔的层数\n");
        scanf_s("%d", &n);
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= n - i; j++)
            {
                printf(" ");
            }
            if (i < n)
                for (k = 1; k <= (2 * i - 1); k++)
                {
                    if (k == 1 || k == (2 * i - 1))
                        printf("*");
                    else
                        printf(" ");
                }
            else
                for (k = 1; k <= (2 * i - 1); k++)
                {
                    printf("*");
                }
            printf("\n");
        }
        system("pause");
    }
复制代码
运行结果如下:
复制代码

QQ截图20210512140015.png

# 改进
  
上述代码是我自己思索出来的实现方法,通过运行上述代码,的确可以输出一个空心的金字塔

但有些地方写的比较繁琐,不够简洁省时

在我的学习中,通过对老师在课程中讲述的理解,了解到有一些地方可以改进

例如实行打印"*"号时,并不需要判断两个"*"之间有几个" "

只需要在需要打印"*"的地方打印,其它地方打印" "即可

具体代码替换如下
复制代码
    if (i < n)
        for (k = 1; k <= (2 * i - 1); k++)
        {
            if (k == 1 || k == (2 * i - 1))
                printf("*");
            else
                printf(" ");
        }
    else
        for (k = 1; k <= (2 * i - 1); k++)
            printf("*");
复制代码
替换为
复制代码
    for (k = 1; k <= (2 * i - 1); k++)
    {
        if(k==1||k== (2 * i - 1)||i==n)
        printf("*");
        else
        printf(" ");
    }
复制代码
这样写不但使代码更为简洁,也节省了判断语句的数量,节约时间、空间

替换后的代码如下,运行结果同上
复制代码
    void main()
    {
        int i, j, k, n;
        printf("请输入您希望打印的金字塔的层数\n");
        scanf_s("%d", &n);
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= n - i; j++)
            {
                printf(" ");
            }

            for (k = 1; k <= (2 * i - 1); k++)
            {
                if(k==1||k== (2 * i - 1)||i==n)
                printf("*");
                else
                printf(" ");

            }

            printf("\n");
        }
        system("pause");
    }
复制代码
# 总结:本项目主要考察了循环语句的使用,for、while语句均可以实现,原理相同。虽然十分容易,但这也算是我完成的第一个项目。


“路恒久远,不忘初心,砥砺前行”
我是Lemon,在这里记录自己学习的成长过程
谢谢您的阅读,我们下期再见。

  
  
  


复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享