零基礎入門學習python_009筆記及作業_分支與循環_猜數字小遊戲V3.2
作業1:設計一個驗證使用者密碼程式,使用者只有三次機會輸入錯誤,不過如果使用者輸入的內容中包含”*”則不計算在內。
===========================以下為第一次程式碼===========================
temp = input('請設定您的密碼:')
count = 3
while True:
password = input('請輸入您的密碼:')
if count == 0:
print('錯誤太多次,程式結束')
break
elif password == temp:
print('密碼驗證成功!')
break
else:
if '*' in password:
print('輸入錯誤!')
else:
count = count -1
print('輸入錯誤,還剩',count,'次!')
=======================================================================
因為count = count -1放在第三段判斷式內,
所以會造成在count = 3的時候就先運作判斷式,
直到都不符合判斷式時才計算count -1,變成:
第一輪迴圈:
count = 3 -> 輸入密碼 -> 判斷是否count = 0 -> 不符合判斷式 -> count = 3 -1 = 2
第二輪迴圈:
count = 2 -> 輸入密碼 -> 判斷是否count = 0 -> 不符合判斷式 -> count = 2 -1 = 1
第三輪迴圈:
count = 1 -> 輸入密碼 -> 判斷是否count = 0 -> 不符合判斷式 -> count = 1 =1 = 0
第四輪迴圈:
count = 0 -> 輸入密碼 -> 判斷是否count = 0 -> 符合判斷式,中止迴圈
變成跑四個迴圈,不符合預期。
===========================以下為第二次程式碼===========================
temp = input('請設定您的密碼:')
count = 3
while True:
password = input('請輸入您的密碼:')
count = count -1
if count == 0:
print('錯誤太多次,程式結束')
break
elif password == temp:
print('密碼驗證成功!')
break
else:
if '*' in password:
print('輸入錯誤!')
else:
print('輸入錯誤,還剩',count,'次!')
=======================================================================
這樣就可以解決迴圈的bug,但是偶然又發現另一個問題:
第一輪迴圈:
輸入錯誤密碼 -> count = 3 -1 = 2 -> 密碼錯誤
第二輪迴圈:
輸入錯誤密碼 -> count = 2 -1 = 1 -> 密碼錯誤
第三輪迴圈:
輸入正確密碼 -> count = 1 -1 = 0 -> 達成判斷式if count == 0
結果雖然第三次終於打對了,
但是卻優先執行if count = 0的判斷式,
所以回應「密碼驗證成功」,而不是回應「錯誤太多次,程式結束」
===========================以下為第三次程式碼===========================
temp = input('請設定您的密碼:')
count = 3
while True:
password = input('請輸入您的密碼:')
count = count -1
if password == temp:
print('密碼驗證成功!')
break
elif count == 0:
print('錯誤太多次,程式結束')
break
else:
if '*' in password:
print('輸入錯誤!')
else:
print('輸入錯誤,還剩',count,'次!')
=======================================================================
將「if count == 0」和「if password == temp」的判斷式對調,
就可以解決這個bug了。
作業完成了之後,
隱約想起了什麼,那就是:
我的猜數字小遊戲一直都是先判斷count == 0啊啊啊啊啊啊啊啊啊啊!
所以就順手將他修正成3.2版吧!
==============================以下為程式碼==============================
import random
secret = random.randint(1,10)
count = 3
print("----------Elliot Production----------")
while True:
temp = input("guess the number from 1 to 10 : ")
count = count -1
while str.isdigit(temp) != True:
print('Type Error')
temp = input('Please key in again: ')
count = count -1
if count == 0:
break
if str.isdigit(temp) == True:
guess = int(temp)
else:
guess = str(temp)
if guess == secret:
print("Wonderful")
print("But still no reward")
break
elif count == 0:
print('stupid')
break
else:
if guess > secret:
print('Hey, too BIG')
else:
print('Hey, too small')
print('Game Over')
=======================================================================
後來發現第三次程式碼有個最大的問題,
就是違反作業前提:「如果使用者輸入的內容中包含”*”則不計算在內」
也就是當使用者輸入的密碼內有包含「*」符號,
count一樣會 -1
所以還是必須要把count -1放在判斷式內處理才行。
==============================以下為程式碼==============================
temp = input('請設定您的密碼:')
count = 3
while True:
password = input('請輸入您的密碼:')
if password == temp:
print('密碼驗證成功!')
break
else:
if '*' in password:
print('輸入錯誤,還剩',count,'次輸入機會!')
else:
count = count -1
if count == 0:
print('錯誤太多次,程式結束')
break
else:
print('輸入錯誤,還剩',count,'次輸入機會!')
=======================================================================
我的作業版本只有使用到break語句,
沒有用到continue。
以下提供甲魚版解答:
==============================以下為程式碼==============================
temp = input('請設定您的密碼:')
count = 3
while count >= 1:
password = input('請輸入您的密碼:')
if password == temp:
print('密碼驗證成功!')
break
elif '*' in password:
print('輸入錯誤,密碼不能有「*」號,還剩',count,'次輸入機會!')
continue
else:
print('輸入錯誤,還剩',count-1,'次輸入機會!')
count -= 1
=======================================================================
作業2:編寫一個程式,求 100~999 之間的所有水仙花數。
※ 如果一個 3 位元數等於其各位數字的立方和,則稱這個數為水仙花數。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一個水仙花數。
提示:利用餘數及地板除法的運算子,達到取得個位、十位及百位數字的效果。
# 特別感謝Frank Tsai提供程式碼解答
==============================以下為程式碼==============================
=======================================================================
===========================以下為第一次程式碼===========================
temp = input('請設定您的密碼:')
count = 3
while True:
password = input('請輸入您的密碼:')
if count == 0:
print('錯誤太多次,程式結束')
break
elif password == temp:
print('密碼驗證成功!')
break
else:
if '*' in password:
print('輸入錯誤!')
else:
count = count -1
print('輸入錯誤,還剩',count,'次!')
=======================================================================
因為count = count -1放在第三段判斷式內,
所以會造成在count = 3的時候就先運作判斷式,
直到都不符合判斷式時才計算count -1,變成:
第一輪迴圈:
count = 3 -> 輸入密碼 -> 判斷是否count = 0 -> 不符合判斷式 -> count = 3 -1 = 2
第二輪迴圈:
count = 2 -> 輸入密碼 -> 判斷是否count = 0 -> 不符合判斷式 -> count = 2 -1 = 1
第三輪迴圈:
count = 1 -> 輸入密碼 -> 判斷是否count = 0 -> 不符合判斷式 -> count = 1 =1 = 0
第四輪迴圈:
count = 0 -> 輸入密碼 -> 判斷是否count = 0 -> 符合判斷式,中止迴圈
變成跑四個迴圈,不符合預期。
===========================以下為第二次程式碼===========================
temp = input('請設定您的密碼:')
count = 3
while True:
password = input('請輸入您的密碼:')
count = count -1
if count == 0:
print('錯誤太多次,程式結束')
break
elif password == temp:
print('密碼驗證成功!')
break
else:
if '*' in password:
print('輸入錯誤!')
else:
print('輸入錯誤,還剩',count,'次!')
=======================================================================
這樣就可以解決迴圈的bug,但是偶然又發現另一個問題:
第一輪迴圈:
輸入錯誤密碼 -> count = 3 -1 = 2 -> 密碼錯誤
第二輪迴圈:
輸入錯誤密碼 -> count = 2 -1 = 1 -> 密碼錯誤
第三輪迴圈:
輸入正確密碼 -> count = 1 -1 = 0 -> 達成判斷式if count == 0
結果雖然第三次終於打對了,
但是卻優先執行if count = 0的判斷式,
所以回應「密碼驗證成功」,而不是回應「錯誤太多次,程式結束」
===========================以下為第三次程式碼===========================
temp = input('請設定您的密碼:')
count = 3
while True:
password = input('請輸入您的密碼:')
count = count -1
if password == temp:
print('密碼驗證成功!')
break
elif count == 0:
print('錯誤太多次,程式結束')
break
else:
if '*' in password:
print('輸入錯誤!')
else:
print('輸入錯誤,還剩',count,'次!')
=======================================================================
將「if count == 0」和「if password == temp」的判斷式對調,
就可以解決這個bug了。
作業完成了之後,
隱約想起了什麼,那就是:
我的猜數字小遊戲一直都是先判斷count == 0啊啊啊啊啊啊啊啊啊啊!
所以就順手將他修正成3.2版吧!
==============================以下為程式碼==============================
import random
secret = random.randint(1,10)
count = 3
print("----------Elliot Production----------")
while True:
temp = input("guess the number from 1 to 10 : ")
count = count -1
while str.isdigit(temp) != True:
print('Type Error')
temp = input('Please key in again: ')
count = count -1
if count == 0:
break
if str.isdigit(temp) == True:
guess = int(temp)
else:
guess = str(temp)
if guess == secret:
print("Wonderful")
print("But still no reward")
break
elif count == 0:
print('stupid')
break
else:
if guess > secret:
print('Hey, too BIG')
else:
print('Hey, too small')
print('Game Over')
後來發現第三次程式碼有個最大的問題,
就是違反作業前提:「如果使用者輸入的內容中包含”*”則不計算在內」
也就是當使用者輸入的密碼內有包含「*」符號,
count一樣會 -1
所以還是必須要把count -1放在判斷式內處理才行。
==============================以下為程式碼==============================
temp = input('請設定您的密碼:')
count = 3
while True:
password = input('請輸入您的密碼:')
if password == temp:
print('密碼驗證成功!')
break
else:
if '*' in password:
print('輸入錯誤,還剩',count,'次輸入機會!')
else:
count = count -1
if count == 0:
print('錯誤太多次,程式結束')
break
else:
print('輸入錯誤,還剩',count,'次輸入機會!')
我的作業版本只有使用到break語句,
沒有用到continue。
以下提供甲魚版解答:
==============================以下為程式碼==============================
temp = input('請設定您的密碼:')
count = 3
while count >= 1:
password = input('請輸入您的密碼:')
if password == temp:
print('密碼驗證成功!')
break
elif '*' in password:
print('輸入錯誤,密碼不能有「*」號,還剩',count,'次輸入機會!')
continue
else:
print('輸入錯誤,還剩',count-1,'次輸入機會!')
count -= 1
=======================================================================
作業2:編寫一個程式,求 100~999 之間的所有水仙花數。
※ 如果一個 3 位元數等於其各位數字的立方和,則稱這個數為水仙花數。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一個水仙花數。
提示:利用餘數及地板除法的運算子,達到取得個位、十位及百位數字的效果。
# 特別感謝Frank Tsai提供程式碼解答
==============================以下為程式碼==============================
#使用for循環列印出100到1000中的所有數字
for i in range(100, 1000):
#設定變數sum = 0
sum = 0
#設定變數temp = i
temp = i
#使用迴圈:當temp存在時。亦即當temp不等於0時,迴圈不中止;當temp等於0時,等於迴圈False,會自動中止
while temp:
#設定變數digit = temp除以10所得之餘數。第一次迴圈會取得個位數,待temp執行過地板除法後,第二次迴圈會取得十位數,第三次迴圈則會取得百位數。
digit = temp % 10
#設定變數square = digit的立方值。第一次迴圈取得個位數的立方和,第二次迴圈取得十位數的立方和,第三次迴圈取得百位數的立方和
square = digit ** 3
#設定變數sum = sum + square。在三次迴圈內,可加總所有立方和
sum = sum + square
#設定變數temp = temp除以10並只取整數,而後將新取得之數繼續迴圈運算,便可取得個位數、十位數及百位數
temp = temp // 10
#當sum等於i時
if sum == i:
#列印i值
print(i)
for i in range(100, 1000):
#設定變數sum = 0
sum = 0
#設定變數temp = i
temp = i
#使用迴圈:當temp存在時。亦即當temp不等於0時,迴圈不中止;當temp等於0時,等於迴圈False,會自動中止
while temp:
#設定變數digit = temp除以10所得之餘數。第一次迴圈會取得個位數,待temp執行過地板除法後,第二次迴圈會取得十位數,第三次迴圈則會取得百位數。
digit = temp % 10
#設定變數square = digit的立方值。第一次迴圈取得個位數的立方和,第二次迴圈取得十位數的立方和,第三次迴圈取得百位數的立方和
square = digit ** 3
#設定變數sum = sum + square。在三次迴圈內,可加總所有立方和
sum = sum + square
#設定變數temp = temp除以10並只取整數,而後將新取得之數繼續迴圈運算,便可取得個位數、十位數及百位數
temp = temp // 10
#當sum等於i時
if sum == i:
#列印i值
print(i)
=======================================================================
留言
張貼留言