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

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

// 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 中 Random 的 Next() 回傳 0 到 MaxValue 的隨機整數。
4. 設計、建置完軟體的初始版本就進行測試,如果有問題,就重新檢視設計, Encrypt 的數學公式有問題,因此要研究問題出在哪,再回頭修改程式。
問題與討論
1. 軟體的生命週期分成哪些階段?
2. 設計軟體的時候,該不該重視使用者的體驗經驗?
3. 想一想, Encrypt 的數學公式問題可能發生在哪裡?該如何修正呢?
練習
1. 承接上一個單元的猜數字遊戲,將新專案寫在 Exercise1601 中,把測試答案的部份寫在 Guess 類別的 Test() 方法裡,結果回傳布林值。
2. 承上題,在 Guess 類別設計一個 ABCounter() 方法計算 A 、 B 值, A 、 B 值,用欄位記錄,若使用者沒用猜對就印出A 、 B 值,將新專案寫在 Exercise1602 中。
3. 承上題,加入迴圈直到使用者猜對答案為止,將新專案寫在 Exercise1603 中。