【C语言】打印图案问题(下卷)

前言

哎呀,看来上卷的打印金字塔和菱形都满足不了你啊,那我只好再拿出两题考考你了。相信在看完这两题的解说后,你对打印图案的理解一定能更上一层楼。

话不多说,继续闯关吧!

崭露头角:空心正方形图案

提示:

这题找到规律并不难,但是怎么打代码写得整洁、简单呢?这是一个问题。这里给出改造前后对比的两种写法,大家感受一下。

题目:

输入一个整数,表示输出的行数,也表示组成正方形边的“*”的数量。针对输入的整数,输出用“*”组成的“空心”正方形,每个“*”后面有一个空格。

法一
分析:

我们不难想到应该去用循环与判断语句来完成打印任务。然后不难想到规律就是第一行和最后一行打印的全是星号,其他行的首尾打印星号,中间打印空格。所以我们可以使用双层循环,外循环为行数,内循环为列数,就像一个二维数组,每一个元素要么是星号要么就是空格(这样非此即彼的关系可以用if和else来处理),只不过我们不使用数组存储而是直接输出。

这样讲还有点抽象,我们直接来看代码:

代码参考

这时,代码是写出来,也能完成任务,但循环(循环(判断(判断)))的结构着实看起来不太舒服。 

法二
分析:

其实只要一点修改,这个代码瞬间就可以变得更简洁易读。我们为何不在内层循环中,将i和j整合在一起判断呢?

代码参考

运行效果:

这个写法在思路上其实是和前一种写法相同的,只不过前一种与它相比就像是不加思考,直接生硬地把自然语言转化成了代码,而我们在写代码的时候应该更灵活一些,带着思考去写。

规律还是第一行和最后一行打印的全是星号,其他行的首尾打印星号,中间打印空格,但这一次我们浓缩成一句判断:if(i==1 || i==num || j==1 || j==num) printf("*");不过其实对这句更贴切的规律是:在四条边的任意一边上(体现于代码为i==1 || i==num || j==1 || j==num)时就打印星号。这一点细微的不同,可能导致写出的代码乍一看效果十分不同。

渐入佳境:X形图案

提示:

这道题的逻辑与上一题的法二非常相似,首先肯定还是有控制行和列的变量i与就,在找规律时我们去从i和j下手,对于这道题,我们没法向上一题一样,一眼就看出来i和j应该满足什么条件时打印星号,所以我们不妨有耐心地寻找一下。

题目:

输入一个整数,表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。

分析:

输入的5代表了行数和列数,以及每条斜线方向上的星号个数,所以在用i表示行数,j表示列数后,我们不难写出循环条件,重要的是,规律应该怎么找呢?

这个图案如果想像打印图案(上卷)中打印金字塔那样先打印空格再打印星号显然是十分困难的,而正如前面也说过的,无法做到我想在屏幕哪个位置打印就打印在哪,我们需要有空格才能将星号的位置控制在我们要的位置,比如我们想要在第二行的“第二个”位置打印星号,我们就不得不在前面打印一个空格。所以大的思路仍然是我们if什么什么就打印星号,else就打印空格。

所以我们现在重点关注什么时候要打印星号。我们很清楚就是要两个星号的斜线,一条正斜线和一条反斜线,然后我们有意识要去找i和j在打印斜线时的规律。反斜线的规律并不难找,只要我们观察一下,就能发现是i==j。

看下图,n是输入值,在这个例子中是6。i和j变量一个控制行一个控制列,不妨让i和j从1开始取值,那么i和j的值和行数、列数恰好相等。在反斜线中,看我圈出来的这个星号位置,它的i==j都为2,你再看每一个反斜线上的星号,都满足这一点。所以当i==j时,我们要打印星号。

那么正斜线呢?请看我圈出来的这个星号,它的i+j的值可不是一个随便的数,而恰好是n+1,你再去看正斜线上每一个星号都满足i+j==n+1,所以当i+j=n+1时,我们要打印星号。

分析到这里,就只差写出代码了。

代码参考 

vs2022运行效果:

打印图案总结 

看到这里,恭喜你已经斩获了四道打印图案的题目啦,感觉如何?其实打印图案类的题目就是要紧紧抓住规律,而且是要有用的规律,一般是与循环控制变量有关的规律。然后记得善用逻辑运算符,逻辑或'||'来简洁负责打印星号的代码。希望大家发现文章的错误可以及时向我反馈,共同进步,吃透打印图案问题!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值