20190103-打印各种类型的三角形,四边形等
1. 打印四边形
1.1打印实心四边形
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
如图:四边形由宽和高构成,将宽转换为每行打印的的个数,将高转换为打印的行数
def quadrangle_generate(width,hight):
for i in range(hight+1):
for j in range(width+1):
print('*',end=' ')
if j == width:
print()
quadrangle_generate(5,4)
解析:for i in range(hight+1)循环保证打印的行数,for j in range(width+1)循环保证每行打印的*个数。当打印完成,即j == width的时候换行,其中 print('*',end=' ')执行一次打印2个字符
1.2打印空心四边形
* * * * * * * * *
* *
* *
* *
* * * * * * * * *
空心四边形除第一行和最后一行全部打印外,其他行仅打印首尾
def quadrangle(hight,width):
for i in range(hight+1):
for j in range(width+1):
if i ==0 or i ==hight:
print('*',end =' ')
#空心四边形第一行全部打印
elif j==0 or j ==width:
print('*',end =' ')
#空心四边形中间行数打印首尾
else:
print(' ',end =' ')
print()
quadrangle(4,8)
2. 打印各类等腰三角形
2.1左下角等腰三角形
*
* *
* * *
* * * *
* * * * *
* * * * * *
左下角三角形由*和空格构成,保证三角形在四边形的基础上高(等价于三角形的腰)不变,每行打印的*个数进行变化。具体规则如下:
第一行保留打印一个*,剩下的用空格代替
第二行保留打印两个*,剩下用空格代替
第i行,打印i个星
第n行,打印n个星
def left_down_Isosceles_trigal_generate(n):
for i in range(n+1):
for j in range(i+1):
print('*',end = ' ')
if j == i:
print()
left_down_Isosceles_trigal_generate(10)
解析:for i in range(n+1)保证了打印的行数(等腰三角形的腰),for j in range(i+1)循环保证每行打印的*个数,第1行打印1个,第二行打印2个,j==i的时候打印换行。
2.2左上角等腰三角形
* * * * * *
* * * * *
* * * *
* * *
* *
*
左上角等腰三角形是由三角形由*和空格构成,保证三角形在四边形的基础上高(等价于三角形的腰)不变,每行打印的*个数进行变化。具体规则如下:
第一行保留打印n个*
第二行保留打印n-1两个*
第i行,打印n-i+1个*
第n行,打印1个*
因此打印的*个数使用n-i+1来确定,打印*以空格分隔
def left_top_Isosceles_trigal_generate(n):
for i in range(n+1):
for j in range(n-i+1):
print('*',end = ' ')
if j ==n-i:
print()
left_top_Isosceles_trigal_generate(10)
解析:for i in range(n+1)保证了打印的行数,for j in range(n-i+1)保证了打印的*个数逐级递减,当每行打印结束的时候使用j==n-i换行
2.3右下角等腰三角形
*
* *
* * *
* * * *
* * * * *
* * * * * *
右下角等腰三角形,保证三角形在四边形的基础上高(等价于三角形的腰)不变,每行打印的*个数进行变化。具体规则如下,此处需要留意打印空格的时候end=‘ ’,一次print(' ',end = ' ')执行,打印出2个空格字符:
第一行前面保留打印2(n-1)个空格,加上1个*,如上图,n=6,则第一行打印10个空格
第二行前面保留打印2(n-2)个空格,加上2个*
第i行,打印2(n-i)个空格,加上i个*
第n行,打印n个*,中间以空格分隔
因此打印的*个数使用i来确定,打印的空格使用n-i+1来确定
def right_down_Isosceles_trigal_generate(n):
for i in range(n+1):
for j in range(n-i+1):
print(' ',end = ' ')
for k in range(i+1):
print('*',end = ' ')
if k ==i:
print()
right_down_Isosceles_trigal_generate(10)
解析:for i in range(n+1)保证打印的行数,for j in range(n-i+1)来打印空格,空格的个数随着i的增加逐级减少,使用i来打印逐级增加的*
2.4右上角等腰三角形
* * * * * *
* * * * *
* * * *
* * *
* *
*
右上角等腰三角形,保证三角形在四边形的基础上高(等价于三角形的腰)不变,每行打印的*个数进行变化。具体规则如下:
第一行保留打印n个*,前面填充0个空格
第二行保留打印n-1个*,前面填充2个空格,书写格式为print(' ',end = ' ')
第i行,打印n-i个*,前面填充2*i个空格
第n行,打印1个*,前面填充2(n-1)个空格,如上图n=6,第6行前面填充10个空格
因此打印的*个数使用n-i来确定,打印的空格使用i来确定
def right_top_Isosceles_trigal_generate(n):
for i in range(n+1):
for j in range(i):
print(' ',end = ' ')
for k in range(n-i):
print('*',end = ' ')
if k ==n-i-1:
print()
right_top_Isosceles_trigal_generate(10)
解析:使用 for i in range(n+1)来确定要打印的行数(三角形的腰),右上角等腰三角形,每行的*逐级递减,因此使用for k in range(n-i)来确定要打印的*的个数,当*打印完的时候使用k == n-i-1来换行
2.5正三角形
*
* *
* * *
* * * *
* * * * *
正三角形保证三角形在四边形的基础上高(等价于三角形的腰)不变,每行打印的*位置不同,具体规则如下:
第一行,打印n-1个空格,1个*,以空格分隔
第二行,打印n-2个空格,2个*,以空格分隔
第n行,打印n-n个空格,n个*,以空格分隔
打印的空格以n-i+1来确定,打印的*用i来确定
def Isosceles_trigal_generate(n):
for i in range(n+1):
for k in range(n-i+1):
print(' ',end = '')
for j in range(i+1):
print('*',end = ' ')
if j == i:
print()
Isosceles_trigal_generate(10)
解析:正三角和右下角三角形的唯一区别为代码中红色的部分,end =''还是end = ' ',如果end =''则为正三角;如果end=' '则为右下角三角形,因为end = ' '的时候,是以空格结尾,打印的字符数需要加1
2.6 倒三角形
* * * * * *
* * * * *
* * * *
* * *
* *
*
倒三角形保证三角形在四边形的基础上高(等价于三角形的腰)不变,每行打印的*位置不同,具体规则如下:
第一行,打印n个*,以空格分隔,前面打印0个空格
第二行,打印n-1个*,以空格分隔,前面打印1个空格
第i行,打印n-i,以空格分隔,前面打印i个空格
第n行,打印1个*,前面打印n-1个空格
因此打印的*个数使用n-i来确定,打印的空格使用i来确定
def reverse_Isosceles_trigal_generate(n):
for i in range(n+1):
for j in range(i):
print(' ',end ='')
for k in range(n-i+1):
print('*',end =' ')
if k ==n-i:
print()
reverse_Isosceles_trigal_generate(10)
解析:for i in range(n+1),保证打印的行数,区别于右上角三角形的是代码中红色部分,由end=''决定print语句打印的是几个字符。
2.7打印倒空心三角形
* * * * *
* *
* *
* *
*
倒空心三角形在倒三角的基础上,每行打印的*个数与倒三角形有区别,具体规则如下:
第一行从第0个位置开始打印n个*,以空格分隔
第二行从第1个位置开始打印1个*,在第2(n-1)个位置打印一个*
第i行从第i个位置开始打印1个*,在倒数第2(n-i)个位置开始打印一个*
第n行打印1个*
因此,打印的*除第一行外,从第2行开始,使用i-1来确定开始打印*的位置,使用n-i+1来确定每行第二个*的位置
def reverse_empty_Isosceles_trigal_generate(n):
for i in range(n+1):
for j in range(i):
print(' ',end ='')
#三角形前面填充的空格数不变
for k in range(n-i+1):
if i==0 or i ==n:
print('*',end =' ')
#空心三角形的第一行和最后一行仍然全部打印*
elif k==0 or k==n-i:
print('*', end=' ')
#空心三角形的中间打印首尾*,注意因为print(' ',end=' ')打印的是2个空格,所有第二个*开始打印位置为n-i
else:
print(' ',end =' ')
print()
reverse_empty_Isosceles_trigal_generate(10)
2.8打印正空心三角形
*
* *
* *
* *
* *
* *
* *
* *
* *
* *
* * * * * * * * * * *
def Isosceles_empty_trigal_generate(n):
for i in range(n+1):
for k in range(n-i+1):
print(' ',end = '')
# 三角形前面填充的空格数不变
for j in range(i+1):
if i==0 or i ==n:
print('*',end = ' ')
# 空心三角形的第一行和最后一行仍然全部打印*
elif j ==0 or j ==i:
print('*', end=' ')
# 空心三角形的中间行打印首尾*
else:
print(' ',end =' ')
print()
Isosceles_empty_trigal_generate(10)
解析:与倒空心三角形算法类似,在正三角形的基础上,首行和尾行打印*不变,中间行仅首尾打印*,其他打印空格
总结:打印三角形的时候,最大的注意点是确定打印多少行,每行打印多少个,以及前面填充多少空格。特别注意填充空格时候注意空格的占位数。print(' ',end ='')打印一个空格,print(' ',end =' ')打印2个空格。