绘制带有嵌套循环的M形图案

时间:2015-02-08 12:54:52

标签: python

我刚刚开始使用Python 2.7,但我仍然坚持这个问题:

  

制作一个打印" M"星号的图案。用户应输入图案的高度。

这是问题的图片:

  

Image of problem description with sample output

h=raw_input("Enter the height of MStar here:")
h=int(h)

for row in range(0,(h-1)/2):
     for column in range(row+1):
         print "*",
    print
for row in range((h-1)/2,h):
    for column in range(h):
        print "^",
    print

还建议我可以为模式做两个循环,因为它可以看作两个部分,上面一个是星星和空格,第二个部分看起来像我做过的矩形。我的代码需要一些帮助,因为我真的不知道如何添加第二个三角形,我只能做第一个。

4 个答案:

答案 0 :(得分:2)

我认为这个问题是两个三角形相互重叠。您可以编写两个函数来检查坐标是否在三角形中。例如,此代码

 for i in range(n):
   for j in range(n):
     if left(i,j):
       print '*',
     else:
       print '.',
   print

给出了这个输出:

 * . . . . . .
 * * . . . . .
 * * * . . . .
 * * * * . . .
 * * * * * . .
 * * * * * * .
 * * * * * * *

left更改为right会显示镜像:

 . . . . . . *
 . . . . . * *
 . . . . * * *
 . . . * * * *
 . . * * * * *
 . * * * * * *
 * * * * * * *

一旦您确定leftright的正确实施,只需将两者合并为left(i,j) or right(i,j)即可获得M形状:

 * . . . . . *
 * * . . . * *
 * * * . * * *
 * * * * * * *
 * * * * * * *
 * * * * * * *
 * * * * * * *

答案 1 :(得分:1)

限制:仅输入大于3的旧数字

逻辑:

  1. 通过raw_input()
  2. 获取用户的意见
  3. 通过从用户输入中减去2来获取空间数。例如(i)对于用户输入为3,只有第一行有1个空格,(ii)对于输入5 - >第一行包含空格3,第二行包含空格1
  4. forn的情况下运行n循环user value
  5. 如果空间数大于0,则创建print_line,其中根据字符串中间的空间计数添加空间值,并根据for循环计数在开始和结束时添加*
  6. 如果空间数小于0,则根据用户值将字符串打印到*
  7. 代码:

    no = int (raw_input("Enter a number: "))
    space_no = no - 2
    print_line = "*"*no
    for i in xrange(1,no+1):
        if space_no>0:
            print_line_n = "*"*i+" "*space_no+"*"*i
            space_no -=2
            print print_line_n
        else:
            print print_line
    

    输出:

    vivek@vivek:~/Desktop/stackoverflow$ python 9.py 
    Enter a number: 3
    * *
    ***
    ***
    vivek@vivek:~/Desktop/stackoverflow$ python 9.py 
    Enter a number: 5
    *   *
    ** **
    *****
    *****
    *****
    vivek@vivek:~/Desktop/stackoverflow$ python 9.py 
    Enter a number: 9
    *       *
    **     **
    ***   ***
    **** ****
    *********
    *********
    *********
    *********
    *********
    vivek@vivek:~/Desktop/stackoverflow$ 
    

答案 2 :(得分:0)

有时,绘制一个需要生成的值的表格会有所帮助:

h notch_rows  no_notch_rows  row   "*"s  " "s  "*"s

3     1                       1     1     1     1
                     2        1     3
                              2     3

5     2                       1     1     3     1
                              2     2     1     2
                     3        1     5
                              2     5
                              3     5

7     3                       1     1     5     1
                              2     2     3     2
                              3     3     1     3
                     4        1     7
                              2     7
                              3     7
                              4     7

这会产生类似

的实现
def mstar(h, star_ch="*", space_ch=" "):
    assert h % 2, "h must be odd"

    notch_rows    = h // 2
    no_notch_rows = notch_rows + 1
    rows          = []

    for row in range(1, notch_rows + 1):
        stars  = star_ch  * row
        spaces = space_ch * (h - 2 * row)
        rows.append(stars + spaces + stars)

    for row in range(1, no_notch_rows + 1):
        stars  = star_ch * h
        rows.append(stars)

    return "\n".join(rows)

def main():
    h = int(input("Height of M-Star? "))    # use raw_input for Python 2.x
    print(mstar(h))

if __name__ == "__main__":
    main()

并像

一样运行
Height of M-Star? 5
*   *
** **
*****
*****
*****

Height of M-Star? 9
*       *
**     **
***   ***
**** ****
*********
*********
*********
*********
*********

答案 3 :(得分:0)

最愚蠢的方法是打印越来越多的左右对齐的星,直到它们的数量达到N//2(地板分割),其余的很容易。

for n in range(1,N//2+1):
    line = bytearray(' ' * N)
    line[:n] = line[-n:] = '*' * n
    print line

哈,有了这个,你甚至可以一直循环到N而不是N//2 - 因为分配到交叉范围不会有任何伤害。