零基礎入門學習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提供程式碼解答

==============================以下為程式碼==============================

#使用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)

=======================================================================

留言

這個網誌中的熱門文章

簡易版複利計算機

零基礎入門學習python_003筆記及作業_字串與轉譯

哈佛大學計算機通識課程:CS50