C# 入門指南

單元 16 - 繼續測試

~~學習進度表~~

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

Development

Use

Modification

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

Analysis

Design

Implement

Test

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

我們打算開發的 Encrypt 類別 (class) 的需求已經很清楚,也就是產生一個英文小寫字母的對照字串 (string) ,我們用 code 欄位儲存這個字串,然後以 SetCode() 方法建立這個字串。

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

SystemRandomNext() 方法 (method) 可產生指定範圍的隨機整數,範圍介於 0Int32.MaxValue 之間。使用前要先建立 Random 型態的物件,也就是 Random 型態的變數, ab 初始化的部分修改如下

// a 、 b 初始化
Random r = new Random();
a = r.Next(0, 10);
b = r.Next(0, 10);

完整的 Program.cs 如下

using System;

namespace EncryptDemo03
{
    class EncryptDemo03
    {
        // 宣告密碼表欄位
        public string code;

        // 建構子,呼叫建立密碼表的 SetCode() 方法
        public EncryptDemo03()
        {
            SetCode();
        }

        // 建立密碼表
        public void SetCode()
        {
            // 宣告變數
            int a, b, x, y, m;
            char c = 'a';
            // a 、 b 初始化
            Random r = new Random();
            a = r.Next(0, 10);
            b = r.Next(0, 10);
            code = "";
            // 建立密碼表的迴圈
            for (int i = 0; i < 26; i++)
            {
                x = c;
                y = x * a + b;
                m = y % 26;
                code += Convert.ToChar(m + 97);
                c++;
            }
        }

        // 編碼方法
        public string ToEncode(string s)
        {
            return s;
        }

        // 解碼方法
        public string ToDecode(string s)
        {
            return s;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 印出 20 個密碼表
            for (int i = 0; i < 20; i++)
            {
                // 建立密碼物件
                EncryptDemo03 e = new EncryptDemo03();
                // 印出密碼表
                Console.WriteLine(e.code);
            }
        }
    }
}

//《程式語言教學誌》的範例程式
// http://kaiching.org/
// 專案:EncryptDemo03
// 檔名:Program.cs
// 功能:示範利用 C# 設計 Encrypt 類別
// 作者:張凱慶

執行部分改為印出 20 個密碼表,這是為了測試公式是否正確無誤

static void Main(string[] args)
{
    // 印出 20 個密碼表
    for (int i = 0; i < 20; i++)
    {
        // 建立密碼物件
        EncryptDemo03 e = new EncryptDemo03();
        // 印出密碼表
        Console.WriteLine(e.code);
    }
}

執行結果如下

C:\EncryptDemo03> dotnet run
loruxadgjmpsvybehknqtwzcfi
nqtwzcfiloruxadgjmpsvybehk
elszgnubipwdkryfmtahovcjqx
hhhhhhhhhhhhhhhhhhhhhhhhhh
mtahovcjqxelszgnubipwdkryf
wfoxgpyhqzirajsbktcludmven
cgkoswaeimquycgkoswaeimquy
hknqtwzcfiloruxadgjmpsvybe
bfjnrvzdhlptxbfjnrvzdhlptx
lrxdjpvbhntzflrxdjpvbhntzf
msyekqwciouagmsyekqwciouag
gggggggggggggggggggggggggg
eeeeeeeeeeeeeeeeeeeeeeeeee
qwciouagmsyekqwciouagmsyek
aiqygowemucksaiqygowemucks
pyhqzirajsbktcludmvenwfoxg
ouagmsyekqwciouagmsyekqwci
pyhqzirajsbktcludmvenwfoxg
ouagmsyekqwciouagmsyekqwci
xfnvdltbjrzhpxfnvdltbjrzhp
C:\EncryptDemo03>

居然有幾行都是 'h''g''e',有些是我們要的密碼表沒錯,有一些則不是,那表示我們所用的數學公式有問題,接下來要先修正數學公式。

相關教學影片

上一頁 單元 15 - 實作 SetCode()
回 C# 入門指南首頁
下一頁 單元 17 - 修正後的數學公式
回 C# 教材首頁
回程式語言教材首頁
中英文術語對照
分析analysis
類別class
設計design
開發development
建置implement
方法method
修改modification
軟體生命週期software life cycle
字串string
測試testing
使用use
參考資料
1. C# 程式設計手冊 | Microsoft Docs - 類別
2. System | Microsoft Docs - Random.Next Method
重點整理
1. 軟體的生命週期分成開發、使用、修改三大階段。
2. 開發階段就是對需求分析,然後設計、建置、測試等等。
3. .NET 中 RandomNext() 回傳 0MaxValue 的隨機整數。
4. 設計、建置完軟體的初始版本就進行測試,如果有問題,就重新檢視設計, Encrypt 的數學公式有問題,因此要研究問題出在哪,再回頭修改程式。
問題與討論
1. 軟體的生命週期分成哪些階段?
2. 設計軟體的時候,該不該重視使用者的體驗經驗?
3. 想一想, Encrypt 的數學公式問題可能發生在哪裡?該如何修正呢?
練習
1. 承接上一個單元的猜數字遊戲,將新專案寫在 Exercise1601 中,把測試答案的部份寫在 Guess 類別的 Test() 方法裡,結果回傳布林值。
2. 承上題,在 Guess 類別設計一個 ABCounter() 方法計算 AB 值, AB 值,用欄位記錄,若使用者沒用猜對就印出AB 值,將新專案寫在 Exercise1602 中。
3. 承上題,加入迴圈直到使用者猜對答案為止,將新專案寫在 Exercise1603 中。