0

是的,这是一项家庭作业。但是请,如果你要给我代码,请告诉我你做了什么。我对此非常陌生。

所以任务是根据用户输入的宽度打印一个 ASCII 菱形。我可以做钻石的前半部分,但不能做下半部分,由于某种原因,我不知道该怎么做。

这是我的代码:

wid = int(input("Width: "))
i = 1

while i <= wid:
  print(" " * (wid - i) + "* " * i)
  i = i + 1

如果wid = 5,它将输出以下内容:

Width: 5
    * 
   * * 
  * * * 
 * * * * 
* * * * * 
4

7 回答 7

1
 i=1
 j=input("ENTER NO =")
 l=0
 for i in range(i,j-((j/2)-1),1):
     print (' ' * ((j+1)/2-i)+'*' *(i*2-1))
     l=(j/2+1)
     while  (i==l):
        i=1
        for i in range(i,j,1):
            print (' ' *((i*2)-i)+'*' *(j-i*2))
        if [i==j-1]:
            l=raw_input('<press enter to exit>')       
于 2014-02-11T05:46:59.253 回答
1

我试图用注释来解释代码。我希望它有所帮助。

wid = int(input("Width: "))

#no. of lines will be double the width
#each loop prints a line.
for i in range(wid *2):

    #first half of the diamond
    if i<=wid:
        no_of_spaces = wid - i
        no_of_stars = i
        print(" "*no_of_spaces +  "* "*no_of_stars) 

    #next half of the diamond
    else:
        no_of_spaces = i - wid
        no_of_stars = 2*wid - i
        print(" "*no_of_spaces +  "* "*no_of_stars) 
于 2013-08-13T07:40:21.300 回答
0

你从头开始,i = 1直到i > wid达到顶峰。要制作钻石的底部,您必须做与顶部相反的操作。代码很简单,但除非你愿意,否则我不会写。

于 2013-08-13T07:31:25.677 回答
0

由于已经解决了一些好的方法,这里有一些有趣的小黑客解决方案。

这是一个使用 Python 2.7string.center的例子。

import string    

width = int(raw_input("Width:"))

for i in range(width):
    print string.center(i * " *", width * 2 )

for i in range(width,0,-1):
    print string.center(i * " *", width * 2 )

这是一个使用 HTML 居中输出的离谱的。

file = open('file.html','w')
file.write("<div align='center'>")

for i in range(width):
    file.write(i * " *") 
    file.write("<br>")

for i in range(width,0,-1):
    file.write(i * " *")
    file.write("<br>")

file.write("</div>")
file.close() 

import webbrowser
webbrowser.open("file.html")
于 2014-08-05T19:09:12.947 回答
0

过了一会儿

i=i-2
while i>0:
  print(" "*(wid-i)+"* "*i)
  i=i-1;
于 2013-08-13T07:34:08.020 回答
0

一种方法

最简单的方法可能是有两个循环;一个i向上计数width,另一个i向下计数1

width = int(input("Width: "))

i = 1
while i < width:
    print " " * (width-i) + "* " * i
    i += 1

while i > 0:    
    print " " * (width-i) + "* " * i
    i -= 1

这有点不吸引人,因为它有点笨拙,但它很简单。


另一种方法

另一种方法是有一个循环计算为宽度的两倍,做两件事之一。它的作用取决于是否i通过了最大宽度点。所以它在同一个循环中“向上”和“向下”,i1向上计数到width*2

width = int(input("Width: "))

i = 1
while i < width*2:
    if i < width:
        print " " * (width-i) + "* " * i
    else:
        print " " * (i-width) + "* " * (2*width-i)

    i += 1

这个:

 print " " * (width-i) + "* " * i

...是你的代码。空格从width下到上0*1上到上width

和这个:

 print " " * (i-width) + "* " * (2*width-i)

...是同一件事,但倒置了。空格从0back up to 开始计数width,而*'s go back down 从widthto开始计数1。这在i超过时起作用width

Width: 4
   *      # first half does this onward
  * * 
 * * * 
* * * * 
 * * *    # second half does the rest downward
  * * 
   * 

还有一个

另一种更复杂的替代方法是在包含向上和向下计数的数字的列表上使用 for 循环。例如:[1, 2, 3, 2, 1]

要制作此列表,此代码必须是。我知道,这有点难看:

rows = []
for i in range(1, max+1):
    rows.append(i)
rows += rows[-2::-1]

然后,你看,我们运行 for 循环。

width = int(input("Width: "))

rows = []
for i in range(1, width+1):
    rows.append(i)
rows += rows[-2::-1]    # takes a reversed list and adds it on to the end: [1, 2, 3, 2, 1]

for i in rows:
    print " " * (width-i) + "* " * i

i遍历rows列表中的每个数字,看起来像[1, 2, 3, 2, 1]. 然后我们只需要一个打印小工具。

在 python 中,几乎总是有一种更短且更难理解的 for 循环方式,在这种情况下,我们可以通过缩短第一个 for 循环来去掉两行额外的代码:

width = int(input("Width: "))

rows = [ i for i in range(1, width+1)]  # Brain-bending way of doing a for loop 
rows += rows[-2::-1]

for i in rows:
    print " " * (width-i) + "* " * i

如果你觉得有点疯狂,这里只是整件事的两行版本!

width = int(input("Width: "))
print "\n".join([ " "*(width-i) + "* "*i for i in [ i for i in range(1, width+1) ]+[ i for i in range(1, width+1) ][-2::-1] ])

但我一般不推荐这种编码风格。


抱歉,最后我有点走神了……但我现在能对你说的最好的事情就是尝试一切,尽情玩耍!

希望有帮助。:)

于 2013-08-13T07:43:17.573 回答
0

检查一下(对于 python 2.7x)


填充 ASCII 菱形:

width = 1
width += int(raw_input('Width : '))
for i in range (1,width):
    for j in range (width,i,-1):
        print " ",
    for j in range (1,i,1):
        print " * ",
    print

for i in range (width,1,-1):
    for j in range (width,i,-1):
        print " ",
    for j in range (1,i,1):
        print " * ",
    print

这行得通!但不在任何浏览器窗口中。. .

于 2016-12-09T11:10:18.760 回答