【问题标题】:Draw an M-shaped pattern with nested loops用嵌套循环绘制 M 形图案
【发布时间】:2015-02-08 12:54:51
【问题描述】:

我最近才开始使用 Python 2.7,但我遇到了一个问题:

制作一个打印星号“M”模式的程序。用户应输入图案的高度。

这是问题的图片:

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

还建议我可以为图案做两个循环,因为它可以被视为两部分,上面的部分带有星星和空格,第二部分看起来像我已经完成的矩形。我的代码需要一些帮助,因为我真的不知道如何添加第二个三角形,我只能制作第一个。

【问题讨论】:

  • 这是一个很好的问题,我认为您可以通过更多的努力来解决它。继续尝试。
  • 第二个三角形与第一个三角形用空格隔开。想想你需要在第一个三角形星号之后的一行上打印多少个空格。
  • 似乎我们可以启动一个代码库来打印所有用作初学者练习的星号形状:PyramidMTriangelsDiamondHollow square

标签: python


【解决方案1】:

我把这个问题想象成两个三角形相互重叠。您可以编写两个函数来检查坐标是否在三角形中。比如这段代码

 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 形状:

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

【讨论】:

    【解决方案2】:

    限制:只能输入大于 3 的旧数

    逻辑:

    1. 通过raw_input()获取用户输入。
    2. 通过从用户输入中减去 2 来获取空间计数。例如(i) 用户输入是3 只有第一行有1 空格,(ii) 输入5--> 第一行有空格3,第二行有空格1
    3. 运行for循环n时间nuser value
    4. 如果空格计数大于 0,则创建 print_line,其中根据字符串中间的空格计数添加空格值,并根据 for 循环计数在开始和结束处添加*
    5. 如果空间计数小于0,则根据用户值将字符串打印到*

    代码:

    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$ 
    

    【讨论】:

    • (否认我不是投反对票的人),这不是最优雅的方式。 eduffy 的答案绝对是更有帮助的答案(在我看来)。由于这是一个练习题,让发帖人自己解决编码部分,如何解决问题的逻辑比如何每行打印多个空格更重要。
    【解决方案3】:

    有时,勾勒出您需要生成的值的表格会有所帮助:

    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
    *       *
    **     **
    ***   ***
    **** ****
    *********
    *********
    *********
    *********
    *********
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-01-27
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        相关资源
        最近更新 更多