2015-02-08 53 views
2

我剛開始的Python 2.7最近,但我被困在這一個問題:繪製一個M形圖案與嵌套循環

製作,打印星號的「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 

還建議我可以爲模式做兩個循環,因爲它可以被看作是兩個部分,上面有星星和空格,第二部分看起來像我做過的矩形。我需要一些幫助,因爲我真的不知道如何添加第二個三角形,我只能做第一個。

+6

這是一個很好的問題,我認爲你可以用更多的努力解決它。繼續嘗試。 – nbro 2015-02-08 12:56:59

+1

第二個三角形與*空格*分開。考慮在第一個三角星出現之後,您需要在一條線上打印多少個空格。 – 2015-02-08 12:58:34

+0

似乎我們可以啓動一個代碼庫來打印用作初學者練習的所有星號形狀:[Pyramid](http://stackoverflow.com/questions/33179423/upside-down-pyramid-py),[M]( http://stackoverflow.com/questions/28394149/draw-an-m-shaped-pattern-with-nested-loops),[Triangels](http://stackoverflow.com/questions/26352412/python-print-a - 三角形模式的星號),[鑽石](http://stackoverflow.com/questions/31364162/print-shape-in​​-python),[空心廣場](http://stackoverflow.com/questions/ 16108446/drawing-a-hollow-asterisk-square) – cfi 2015-10-16 21:17:26

回答

1

限制:只能輸入的舊號碼超過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 

輸出:

[email protected]:~/Desktop/stackoverflow$ python 9.py 
Enter a number: 3 
* * 
*** 
*** 
[email protected]:~/Desktop/stackoverflow$ python 9.py 
Enter a number: 5 
* * 
** ** 
***** 
***** 
***** 
[email protected]:~/Desktop/stackoverflow$ python 9.py 
Enter a number: 9 
*  * 
**  ** 
*** *** 
**** **** 
********* 
********* 
********* 
********* 
********* 
[email protected]:~/Desktop/stackoverflow$ 
+0

爲什麼要投票?所以我可以改進我的答案? – 2015-02-08 13:34:24

+0

(聲稱我不是一個倒票的人),這不是最優雅的方式。 eduffy的答案肯定是更有用的答案(以我的觀點來看)。由於這是一個練習題,讓海報自己處理編碼部分,如何處理這個問題的邏輯比如何每行打印多個空格更重要。 – Eran 2015-02-08 13:40:20

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

我想象這個pro兩個相互重疊的三角形瑕疵。您可以編寫兩個函數來檢查座標是否在三角形中。例如,該代碼

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

給出了這樣的輸出:

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

更改leftright給人的鏡像:

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

一旦你想通了的正確實施leftright,只需將兩者合併爲left(i,j) or right(i,j)即可獲得M形狀:

* . . . . . * 
* * . . . * * 
* * * . * * * 
* * * * * * * 
* * * * * * * 
* * * * * * * 
* * * * * * * 
0

最笨的辦法是打印越來越多的明星正當左右,直到它們的數量達到N//2(樓科)中,休息很簡單。

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

哈,有了這個,你甚至可以循環一路N而不是N//2 - 因爲分配給交叉範圍將沒有壞處。