Python 入門指南 5.0

單元 24 - 繼續測試

~~學習進度表~~

軟體生命週期 (software life cycle) 分成三大階段,開發 (development) 、使用 (use) 、修改 (modification) ,接下來便是使用、修改的無限循環

Development

Use

Modification

開發階段,自然免不了對需求的分析 (analysis) ,然後設計 (design) 、建置 (implement) ,接著進行測試 (testing)

Analysis

Design

Implement

Test

其實這順序沒有絕對,「設計」與「建置」可能只是先做個簡單版本,「測試」與「使用」說到底都是實際執行後觀察結果,「修改」等於以之前的基礎再次「設計」與重新「建置」。

我們打算開發的 Encrypt 類別 (class) 的需求已經很清楚,也就是產生一個英文小寫字母的對照字串 (string) ,換言之就是密碼表,我們用 __code 屬性 (attribute) 儲存密碼表,然後以 setcode() 方法 (method) 建立密碼表。

建立密碼表採用以下公式

  
  
  
y = a * x + b
m = y % n
r = m + diff

上個單元中,我們將 a 設定為 3b 設定為 5 ,順利的跑出一個英文小寫字母的對照字串,現在我們希望把 ab 設定成 09 之間的隨機整數,這該怎麼做呢?簡單講,就是要有個產生隨機整數的方式,還好標準程式庫 (standard library) 中已經有相關程式供我們直接使用,因此我們不需要自己重頭開發。

標準程式庫中 randomrandint() 可產生指定範圍的隨機整數,因此原本的程式檔案修改如下

 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

然後建立 ab 值部分改成用 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. 標準程式庫中 randomrandint() 可產生指定範圍的隨機整數。
4. 設計、建置完軟體的初始版本就進行測試,如果有問題,就重新檢視設計, Encrypt 的數學公式有問題,因此要研究問題出在哪,再回頭修改程式。
問題與討論
1. 軟體的生命週期分成哪些階段?
2. 設計軟體的時候,該不該重視使用者的體驗經驗?
3. 想一想, Encrypt 的數學公式問題可能發生在哪裡?該如何修正呢?
練習
1. 寫一個程式 exercise2401.py ,定義猜數字遊戲的核心類別 Guess ,利用標準程式庫 randomrandint() 設定整數 199 之間的答案屬性 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 中,最後在遊戲結束時顯示最多、最少、平均猜測次數。 參考程式碼

上一頁 單元 23 - 實作 setcode()
回 Python 入門指南 5.0 首頁
下一頁 單元 25 - 修正後的數學公式
回 Python 教材首頁
回程式語言教材首頁