簡體   English   中英

Python中的馬里奧CS50

[英]Mario CS50 in Python

所以我嘗試用 python 而不是 C 來編寫 CS50 中的 mario 作業來挑戰自己,我設法讓它工作了! 我不太明白循環是如何工作的,尤其是數學,因為我只是為了得到我想要的結果。

任務要求如下

  1. 使用哈希創建半金字塔
  2. 確保它正確對齊
  3. 它應該對應於用戶給出的高度
  4. 第一行應該以 2"#"s 開頭

對我的循環的任何澄清將不勝感激:)

print('Height: ', end='');
h = int(input());

while(h<0 or h > 24):
  print("That is an invalid input")
  print('Height: ', end='');
  h = int(input());

for i in range(h):
    print(" "*(h-i)+"#"*(i+1));

范圍(開始,停止[,步驟])

Python range() 函數返回一個整數列表,從某個下限(默認為零)到(但不包括)某個上限,可能以某個其他數字(默認為 1)的增量(步長)返回。 因此,

range(3) returns a sequence: 0, 1, 2
range(1,3) returns a sequence: 1, 2
range(1,7,2) returns a sequence: 1, 3, 5

首先,只是想指出,您的代碼並沒有打印出整個金字塔; 它只打印出一半。 您的輸出應該類似於(例如,如果我們輸入高度為 3):

  # #
 ## ##
### ###

您的代碼僅打印左側:

  #
 ##
###

現在,回答你的問題。 這是你如何讓它工作的:

 for i in range(h): print(" " * (h - i) + "#" * (i + 1));

為了描述 for 循環的條件語句, i從 0 開始,一直到h

要了解您的print()語句的工作原理,請將其視為由空格和散列組成的線段。 該段的長度為h 因此,在h - i ,您將此“段”的一部分打印為空格,而在i + 1 ,您將打印循環的其余部分。

現在,您使用i + 1的原因,而不僅僅是i是因為 for 循環條件; i從零開始。 結果,您一定已經意識到第一行沒有散列,因為有h - 0空格和0散列。 這就是為什么需要i + 1原因; 如果您仔細檢查當前代碼,您將在每一行的開頭打印一個額外的空格。

具有相同結果的更易於理解的代碼邏輯是:

for i in range(1, h + 1): # The counter's range is toyed with here
    print(" " * (h - i) + "#" * i); # The "i + 1" is removed

在這里,循環的范圍被玩弄了; 現在它從 1 開始(以便打印第一個散列,並且整個“段”不僅是第一行中的空格),並且它以h + 1結束(因此循環的范圍保持不變)。

i + 1被移除; 看到print()語句可以更容易地理解上面討論的“段”邏輯。

*澄清一下,我上面提供的替代代碼並不是要替代您的代碼; 我只是將它包含在內以加強我的“細分”想法。 你的代碼非常好,和我的一樣好用。

我認為,這不是正確的答案。 為了理解它,請使用"_"或其他符號代替空格。 如果height = 1 ,我們可以看到_# ,但必須是# 所以正確答案,可以是:

print('Height: ', end='');
h = int(input());

while(h<0 or h > 24):
  print("That is an invalid input")
  print('Height: ', end='');
  h = int(input());

for i in range(h):
     print("_" * (h - (i+1)) + "#" * (i + 1));

對不起我的英語不好。

您希望將它們分成兩部分,以便您可以清楚地看到圖片。從那里並排實施會更容易。

left_align_counter =  0
print("Printing  left aligned")
print("Height: ", end="")
height =  int(input())

for h in range(height):
    left_align_counter +=1 
    print("#"*left_align_counter)

print("DONE.")

right_align_counter = 0
print("Printing right align ")

for h in range(height):
    right_align_counter += 1
    print(" "*int(height-right_align_counter), end="")
    print("#"*int(right_align_counter))
    
print("DONE.")

並排打印

left_align_counter =  0
print("Printing  left aligned")
print("Height: ", end="")
height =  int(input())

for h in range(height):
    left_align_counter +=1 
    print("#"*left_align_counter)

print("DONE.")

right_align_counter = 0
print("Printing right align ")

for h in range(height):
    right_align_counter += 1
    print(" "*int(height-right_align_counter), end="")
    print("#"*int(right_align_counter))
    
print("DONE.")

#here we can use any counter for the blocks be it right or left so just use counter variable
counter = 0
for h in range(height):
    counter += 1
    print(" "*int(height-counter), end="")
    print("#"*int(counter), end=' ')
    print("#"*int(counter),end="\n")
  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM