Python 入門指南 5.0
單元 24 - 繼續測試
軟體生命週期 (software life cycle) 分成三大階段,開發 (development) 、使用 (use) 、修改 (modification) ,接下來便是使用、修改的無限循環
⇓
Use
⇓
Modification
開發階段,自然免不了對需求的分析 (analysis) ,然後設計 (design) 、建置 (implement) ,接著進行測試 (testing)
⇓
Design
⇓
Implement
⇓
Test
其實這順序沒有絕對,「設計」與「建置」可能只是先做個簡單版本,「測試」與「使用」說到底都是實際執行後觀察結果,「修改」等於以之前的基礎再次「設計」與重新「建置」。
我們打算開發的 Encrypt 類別 (class) 的需求已經很清楚,也就是產生一個英文小寫字母的對照字串 (string) ,換言之就是密碼表,我們用 __code 屬性 (attribute) 儲存密碼表,然後以 setcode() 方法 (method) 建立密碼表。
建立密碼表採用以下公式
y = a * x + b
m = y % n
r = m + diff
|
上個單元中,我們將 a 設定為 3 , b 設定為 5 ,順利的跑出一個英文小寫字母的對照字串,現在我們希望把 a 、 b 設定成 0 到 9 之間的隨機整數,這該怎麼做呢?簡單講,就是要有個產生隨機整數的方式,還好標準程式庫 (standard library) 中已經有相關程式供我們直接使用,因此我們不需要自己重頭開發。
標準程式庫中 random 的 randint() 可產生指定範圍的隨機整數,因此原本的程式檔案修改如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | # 使用標準程式庫中 random 的 randint()
from random import randint
# 定義 Encrypt 類別
class Encrypt:
# 定義建構子
def __init__(self):
# 建立密碼表
self.set_code()
# _code 的 getter
@property
def code(self):
return self.__code
# _code 的 setter
def set_code(self):
# 取得 a 、 b 值
a = randint(0, 9)
b = randint(0, 9)
# 利用公式建立密碼表
self.__code = ""
c = "a"
i = 0
while i < 26:
x = c
y = ord(x) * a + b
m = y % 26
self.__code += chr(m + 97)
c = chr(ord(c) + 1)
i += 1
# 編碼的方法
def toEncode(self, str):
pass
# 解碼的方法
def toDecode(self, str):
pass
# 測試部分
if __name__ == '__main__':
e = Encrypt()
print()
print(e.code)
print()
# 檔名: encrypt03.py
# 說明:《Python入門指南》的範例程式
# 網站: http://kaiching.org
# 作者: 張凱慶
# 時間: 2023 年 5 月
|
第二行先從 random 引入 randint
2 | from random import randint
|
然後建立 a 、 b 值部分改成用 randint() 函數
19 20 | a = randint(0, 9)
b = randint(0, 9)
|
其他部分都沒改,來測試看看囉
$ python encrypt03.py |
tuvwxyzabcdefghijklmnopqrs |
$ |
看起來還不錯,再多測試幾次看看
$ python encrypt03.py |
nprtvxzbdfhjlnprtvxzbdfhjl |
$ python encrypt03.py |
ffffffffffffffffffffffffff |
$ python encrypt03.py |
tvxzbdfhjlnprtvxzbdfhjlnpr |
$ python encrypt03.py |
zabcdefghijklmnopqrstuvwxy |
$ |
居然有一行都是 'f' ,有些是我們要的密碼表沒錯,有一些則不是,那表示我們所用的數學公式有問題,接下來要先修正數學公式。
中英文術語對照 | |
---|---|
分析 | analysis |
屬性 | attribute |
類別 | class |
設計 | design |
開發 | development |
建置 | implement |
方法 | method |
修改 | modification |
模組 | module |
參數 | parameter |
軟體生命週期 | software life cycle |
標準程式庫 | standard library |
字串 | string |
測試 | testing |
使用 | use |
重點整理 |
---|
1. 軟體的生命週期分成開發、使用、修改三大階段。 |
2. 開發階段就是對需求分析,然後設計、建置、測試等等。 |
3. 標準程式庫中 random 的 randint() 可產生指定範圍的隨機整數。 |
4. 設計、建置完軟體的初始版本就進行測試,如果有問題,就重新檢視設計, Encrypt 的數學公式有問題,因此要研究問題出在哪,再回頭修改程式。 |
問題與討論 |
---|
1. 軟體的生命週期分成哪些階段? |
2. 設計軟體的時候,該不該重視使用者的體驗經驗? |
3. 想一想, Encrypt 的數學公式問題可能發生在哪裡?該如何修正呢? |
練習 |
---|
1. 寫一個程式 exercise2401.py ,定義猜數字遊戲的核心類別 Guess ,利用標準程式庫 random 的 randint() 設定整數 1 到 99 之間的答案屬性 answer 。 參考程式碼 |
2. 承上題,將新程式寫在 exercise2402.py 中,定義猜數字遊戲的玩家類別 GuessUser ,利用 name 屬性記錄玩家名稱。 參考程式碼 |
3. 承上題,將新程式寫在 exercise2403.py 中,繼續擴充玩家類別,增加 guess() 方法,判斷使用者猜測與答案是否相符,並且給予太大或太小的提示。 參考程式碼 |
4. 承上題,將新程式寫在 exercise2404.py 中,繼續改進 guess() 方法,加入如果差距在 10 以內的提示。 參考程式碼 |
5. 承上題,將新程式寫在 exercise2405.py 中,定義猜數字遊戲類別 GuessGame 的初始版本,利用屬性 player 設定遊戲玩家。 參考程式碼 |
6. 承上題,將新程式寫在 exercise2406.py 中,替猜數字遊戲類別 GuessGame 新增 playgame() 方法,定義命令列遊戲方式。 參考程式碼 |
7. 承上題,將新程式寫在 exercise2407.py 中,新增讓使用者決定是否要進行下一輪遊戲的機制。 參考程式碼 |
8. 承上題,將新程式寫在 exercise2408.py 中,將下一輪機制放到函數 guess_game() 中。 參考程式碼 |
9. 承上題,將新程式寫在 exercise2409.py 中,加入區域變數 count ,記錄使用者進行的遊戲次數。 參考程式碼 |
10. 承上題,將新程式寫在 exercise2410.py 中,最後在遊戲結束時顯示最多、最少、平均猜測次數。 參考程式碼 |