菱形打印程序——谈如何学习算法

菱形打印程序——谈如何学习算法

ID:41517632

大小:28.50 KB

页数:4页

时间:2019-08-26

菱形打印程序——谈如何学习算法_第1页
菱形打印程序——谈如何学习算法_第2页
菱形打印程序——谈如何学习算法_第3页
菱形打印程序——谈如何学习算法_第4页
资源描述:

《菱形打印程序——谈如何学习算法》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、菱形打印程序——谈如何学习算法菱形打印很多人,打印菱形在控制台的思路是,把菱形上下拆分,分两段很接近的代码来打印,其实这样代码很不好看,并且不好阅读我们知道,要打印的图案是这种:*************满足上下对称,左右对称,那么,你能不能也弄一个二重循环,同样是对称的?很简单,首先我们要抛开习惯性思维,for循环不一定要在0开始或者0结束我们可以让循环从-c到c,这样不就轻松产生一个对称的吗?(只要取个绝对值)我们把菱形的中心看成是坐标0,0,那么,会输出星号的坐标,是

2、x

3、+

4、y

5、<=c的点

6、由此可得#include#defineIABS(x)((x)>=0?(x):-(x))//定义一个计算绝对值的宏voidprint(intsize)//size是这个菱形的半径,直径会是size*2+1{intx,y;for(y=-size;y<=size;y++){for(x=-size;x<=size;x++){if(IABS(x)+IABS(y)<=size)//x和y各自的绝对值的和,即

7、x

8、+

9、y

10、<=sizeputchar('*');elseputchar('');}

11、putchar('');}}intmain(){print(5);//输出一个半径为5的菱形getchar();return0;}如果我需要得到空心菱形呢?非常非常简单,因为菱形边界上的点,满足的是

12、x

13、+

14、y

15、==c所以,我们只要把那个if里的小于等于号,改成双等于号==就可以了再类似地,如果我不要*号,我要最外层是字母A,然后里一层是B这样呢?即:AABAABCBAABAA那么,我们只要在putchar那里做一个字符计算:voidprint(intsize)//size是这个菱形的半径,直

16、径会是size*2+1{intx,y;for(y=-size;y<=size;y++){for(x=-size;x<=size;x++){if(IABS(x)+IABS(y)<=size)//x和y各自的绝对值的和,即

17、x

18、+

19、y

20、<=sizeputchar('A'+(size-IABS(x)-IABS(y)));//留意这里的计算方法elseputchar('');}putchar('');}}类似地,如果我们要打印的是X形:*********同样可以利用这个思路完成,这题就作为思考题吧其实

21、includestdlib.h后可以直接用abs()--,而且严格来说intmain(void)是最正确的,当然这些不是重点。拿到一个算法程序,最简单的分析方式就是先跟踪看一下运行过程,由于size理论上可以取任意值,我们只要弄懂一种情况就等于弄懂了所有情况,所以为了简化分析先size=3,看一下第一次大的循环:y=-3x=-3''x=-2''x=-1''x=0'*'x=1''x=2''x=3''到这里我们会发现,开始

22、x

23、+

24、y

25、>size,所以前面输出了三个'',然而由于

26、x

27、渐渐减小,之后输

28、出了一个'*',由于

29、x

30、又渐渐增大,又输出了三个'',这样就巧妙地完成了左右的对称。又由于下一次循环

31、y

32、比这次循环小1,所以就“更容易”输出'*',由于

33、y

34、也有对称的特性,所以完成了上下的对称。至此,我们大概就对为什么可以上下左右对称有了一个感性的认识,不过恐怕更多的是对这些代码的惊叹:为什么这样写就能巧妙地做到这些?IABS(x)+IABS(y)<=size这个表达式也太神奇了!其实我们上来看程序的运行过程,只是为了从运行过程中试着找到入口去探索这个算法的本质是什么,这是一个从现象到本质的

35、过程,而不能被现象吓到了。我们把菱形的中心看成是坐标0,0,那么,会输出星号的坐标,是

36、x

37、+

38、y

39、<=c的点那么程序的原理实际上就是通过枚举{(x,y),

40、x

41、<=size,

42、y

43、<=size,x,y∈Z}中的点(即下图中红色部分,包括边界),再通过一个式子来确认合法点,如果合法,就输出'*',反之输出'':那么我们又有疑问了,为什么是

44、x

45、+

46、y

47、<=c?我们来证明一下上面右上角的红色三角区域(包括边界)的所有点(x,y)(x,y∈N),x+y<=size(自己先试试看):通过观察,我们可以发

48、现y的取值范围随着x在改变,至于“怎么改变”则与size有关,那么我们可以想一下,如果我们把其中的y用size和x表示,这个不等式不就容易得证了吗?那么我们可以得知y∈[0,size-x](x≠size),取两边分别讨论,当y=0时,x+y=x<=size,当y=size-x时,x+y=x+size-x=size,当y∈(0,size-x)(x≠size)时,x+y

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。