在学习循环语句的过程中,做到一题用循环打印用“*”组成的菱形图案,图案为:
*
***
*****
*******
*********
*******
*****
***
*
最开始的思路是将菱形分成上下两个三角形打印。上半部分为前五行的三角形,行数i,菱形数每行增加两个,满足第i行星星个数为2*i-1,而每行前面的空格数满足5-i;而下半部分为6至9行组成的三角形,星星数每行递减两个,此时第i行星星个数满足19-2*i,这样就能写两各独立的while来打印菱形。
但在上课过程中海哥提到将图形看成9*9的正方形图案,从图案中去掉不需要打印出来的星星即可。将整个正方形图案看成一个二维坐标系,而这里要注意的是两个数轴分别为i轴与j轴,要与平面坐标系的数轴有所区分,坐标系的原点与象限取决于在写代码的时候对i、j的初始赋值和增减。i为行数,j为每行要打印的星星数。
下面是我最后完成的代码:
i = 1
while i <=9:
j = 1
while j <=9:
j += 1
if i-4 < j < i+6 and 6-i < j <16-i:
print("*",end="")
continue
#不执行if里的代码时用英文空格代替*输出
print(" ",end="")
i += 1
print("")
先使用while嵌套while语句输出9*9的正方形,将整个正方形看成画板,要想输出一个上图中的菱形,可以对正方形进行切割,需要切4刀,切掉的地方用空格代替"*"。那在实现的过程中只要在双重循环中嵌套一个if判断语句,而判断条件则是对图形进行切割的四条线。
在我所写的语句时,我将平面想象在第一象限,i和j在循环过程中依次+1递增,初始值都为1,所以图形之外最左上角为原点的第一象限,这里与一般的二维坐标系要有所区分。而if里面的四个不等式即为四条线所组成的区域,在满足这个区域内的输出“*”,而不满足的则输出空格,最后就得到所需要的菱形。除了用continue之外,用else也可以达到相同效果,因为当时上课正好提到continue的用法。
除了在画菱形之外,只要是规则的几何图形,一旦清楚的知道需要那几条线进行切割,结合自己建的坐标系将临界值得出,就可以写出满足自己条件的不等式,在满足不等式的条件下输出“*”,不满足时输出空格(也可用其他符号代替)。这样都能画出一些规则的图形。
需要注意的点:
1.内部的星星数循环的时候每次要对星星数j重新赋值
2.if条件中逻辑关系满足and,而不是用or
3.注意清楚自己设置的变量之后再结合坐标系,求出线方程后变成不等式后注意比较运算符的开口(即注意最后所包围图形的范围) |
|