完整版下载 | 超详细Python算法案例讲解100例.zip-Python文档类资源-CSDN下载 |
1.问题描述
编程打印如图11.12所示的空心菱形图案。
2.问题分析
该问题要求绘制空心菱形,在此基础上,还可以添加其他要求,
如尽可能少地使用printf语句,或者由键盘输入正数n,并绘制出有
2*n+1行的空心菱形图案。
那么针对此类问题我们究竟应该从何入手分析呢?观察图11.12可
知,图中每一行和每一列的星号和空格所出现的位置并非杂乱无章
的,而是都呈现出一定的规律。这样就可以将绘制空心菱形的问题转
换为找出这些星号和空格与它们所在行与列之间存在的某种规律的问
题。只要这个规律找到了,那么问题就迎刃而解了。
下面以第5行(n=5)作为对称轴的空心菱形为例来寻找规律。观
察图形和积累的经验告诉我们,空心菱形应该分上下两个部分来打
印,那么菱形的上下两部分和行列之间有什么联系呢?我们仔细来观
察图11.12,首先标示出每一行和每一列的行号和列号,其次寻找上半
部分之间的联系。
图11.12中1~5行的规律如表11.1所示,其中行号用i表示,列号用j
表示。
根据表11.1,我们不难写出以下语句:
if j == n + 1 - i or j == n - 1 + i:
print("* ", end="")
else:
print(" ", end="")
再结合行列的循环关系,得到以下代码:
# 外层循环控制行数,从控制台输入的参数n即为菱形上半个三角形的行数
for i in range(1, n + 1):
for j in range(1, (n + i - 1) + 1):
if j == n + 1 - i or j == n - 1 + i:
print("* ", end="")
else:
print(" ", end="")
print()
接下来,我们观察图11.12中6~9行的规律。为了使寻找到的规律
中和行列号建立的关系数值相对简单且小,我们假定行号重新从1开始
排列,即我们寻找的是下半部分1~4行的规律,具体如表11.2所示。
根据表11.2,我们不难写出以下语句:
if j == i + 1 or j == 2 * n - 1 - i:
print("* ", end="")
else:
print(" ", end="")
再结合行列的循环关系,得到以下代码:
# 外层循环控制行数,由于下半个三角形比上面的少一行,所以循环变量i的最大值为n-1
for i in range(1, n):
for j in range(1, (2 * n - 1 - i) + 1):
if j == i + 1 or j == 2 * n - 1 - i:
print("* ", end="")
else:
print(" ", end="")
print()
找到空心菱形的规律后,程序就很容易编写了,只需要在核心代
码的基础上再将程序补充完整即可。
3.完整的程序
根据上面的分析,编写程序如下:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 绘制空心菱形
def draw(n):
# 外层循环控制行数,从控制台输入的参数n即为菱形上半个三角形的行数
for i in range(1, n + 1):
for j in range(1, (n + i - 1) + 1):
if j == n + 1 - i or j == n - 1 + i:
print("* ", end="")
else:
print(" ", end="")
print()
# 打印下半个三角形
# 外层循环控制行数,由于下半个三角形比上面的少一行,所以循环变量i的最大值为n-1
for i in range(1, n):
for j in range(1, (2 * n - 1 - i) + 1):
if j == i + 1 or j == 2 * n - 1 - i:
print("* ", end="")
else:
print(" ", end="")
print()
if __name__ == "__main__":
n = int(input("请输入菱形对称轴的行数n: "))
draw(n)
4.运行结果
在PyCharm下运行程序,屏幕上提示“请输入菱形对称轴的行数
n:”,此处输入5,则打印出以第5行为对称轴的空心菱形,如图11.13
所示。