C语言小白题目:打印菱形

一、小故事

题目:你可以打印一个菱形吗?

小吴:........(不就是个简单的图形吗?能有什么难的,看我先画个小图,把菱形放进你去,再找找规律,分分钟拿捏,图形打印关键在于找规律(自信地)。数分钟后..........明明就是这样的,我的分析绝对没错,这玩意怎么又是歪的!受不了啦,受不了辣,快去CSDN找找答案吧!)

(在CSDN看答案中)哦!哦!,原来是这样,嗯先这样再这样,再那样就搞定了,原来这么简单。

(立马去试试,打开VS)coding.....额这一步是什么来着?唔......不行,再去看看,coding......这又是什么来着?Let me see see.

接着小吴就在又看又写中艰难完成了“小小的“打印菱形任务,心满意足地走了。

二、引言

初学C语言的小伙伴常常会遇到和小吴一样的困扰,遇到一些看起来很简单的题目,觉得自己能做,但细细想来,好像有不是那么好做,于是去看答案,乍看一眼,感觉差不多懂了,但慢慢写下,又有一点点懵比。这都是正常的现象,不要再一开始学习的时候就觉得自己一下就会变得很牛,也不要觉得别人认为简单的题目而自己做不出来就觉得自己不行。别人讲的都是什么高深的东西啊!他这又是什么工具?他已经在学这个了?代码不是只有某些人能学的高深学问,无论专业的还是非专业的都可以学习,它是计算机时代的一种工具,与农耕时代的锄头本质上是一样的,每个人都能学,每个人都能用。讲这么多废话,我们开始分析问题吧。

三、分析问题

正如小吴所说,打印特定图形时,画图找规律是最直接的方法。

经过一大顿操作,我们画了一个很丑的图,并且简单地分析了一下

经过分析,我们可以发现,菱形的上下两部分的数列规律恰好是相反的,所以我们不能够用一个数列就搞定这个菱形,我们要用到两个数列,就是上下两部分,那么现在就好了,我们先打印上半部分,再打印下半部分,双剑合一,即可召唤神龙(您的作答正确!),我仿佛听到了通过的提示音了,不知道是不是错觉。 

四、代码

 先分为上下部分,用两个变量up,和down,表示,down刚好就等与13/2=6(整型变量的除法),up自然就等与总行数减去down咯;

确定行数后,我们进入循环,用i遍历行数,用j打印空格和*;经过分析,我们确定了上半部分的空格数就是(up-i-1),其中i是用来递减的;打印的星星的规律就是2*i+1;记得要换行;

完成上半部分后看看效果,看着还行

接着我们开始做下半部分 

 下半部分跟上半部分有差别,但差别不大,同样地,我们先打印空格,根据图像,下半部分的空格数是递增的,所以我们用j<=i来表示要打印的空格数,i用来递增。再打印星星,我们可以看出下半部分第一行是2*5+1,也就是down-1-i,用i来表示递减,所以就是2*(down-i-1)+1;打印完后记得换行!这样,下班部分也搞定啦!接着,双剑合璧,看看效果。

 恭喜看到这里的小伙伴,你成功打印乐一个菱形!我没有神龙,只能给你个小小的赞,希望你也能给我个小小的赞。

五、补充曼哈顿距离法

不过,话又说来,能坚持看到这里的学霸们想必都不想局限于这么平庸的做法,为了满足大家的需求,小编在这里再介绍一种做法,就是曼哈顿距离法,话不多说,看图。

 首先,讲讲曼哈顿距离是什么,曼哈顿距离的数学公式是d=|x1-x2|+|y1-y2|,还是不懂,这又是什么意思呢?还是看图

假设图中就是曼哈顿,我们需要从A点开车去B点,最短的当然是黑线的距离,但是没有车子能这么走,我们可以走蓝线或者绿线,还有在城区内绕行,而这些路线的距离实际上都是相等的,这就是曼哈顿距离。 

根据图片,我们可以发现,在绿色框框内的位置都是星星,在绿框外的位置都是空格,而这个绿色的框是以中心为中心的,所以它是有中心的,这个中心的坐标恰好是(2,2)、(6,6)即(n/2,n/2),(在C语言中0表示第一行),那么 只要与中心点的曼哈顿距离小于等于2、6即n/2,就可以放心地打印星星了。分析完毕,我们就开始写代码吧!

 如图所示,我们需要先确定中心点的坐标(center_x,center_y),也就是(n/2,n/2),然后用i表示横坐标,用j表示纵坐标,只要这个点与中心点的曼哈顿距离小于n/2,程序就打印星星,否则打印空格。并且记得换行!那么,我们来看看效果!

至此,日渐聪明的大家又学会了一种打印菱形的方法,叫曼哈顿距离法(听着挺高级)

 六、最后

最后,感谢大家用宝贵的时间读完这篇写的废话连篇的文章,文中有一些说法和解释不太成熟,有望大家指正(当然,错字也请大家多多包涵)。

祝屏幕前的各位过上愉快的一天!早安午安晚安!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值