2012年10月22日 星期一

綜合練習-簡易提款機

我們今天來練習寫一個簡易提款機的程式,這個程式的程式碼稍多,不過不用擔心,我們一步一步來。

電腦說穿了其實只是運算速度飛快,它什麼都不會做,要怎麼做是你要教他做,你跟它說怎麼做它就照著做。

讓我們先來想想,我們平常怎麼操作提款機。先決條件是要有某個銀行帳戶,然後才能去提款機,輸入帳號密碼後選擇要提款、存款、轉帳還是繳卡費等等功能,執行完一個功能會問你是否要繼續操作,沒有要繼續操作的話就退出系統,我的印象跟大家應該沒有不一樣吧!

有了上述的操作經驗,現在我們來定義一下簡易提款機的重點。

必要條件:
銀行帳戶。

功能:
1查詢餘額 2提款
3存款
流程:
1進入系統
2選擇功能
3執行功能
4是否離開

有了這些重點,就讓我們開始打造程式吧!!

開一個新專案,先把必要條件寫上去。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
        }
    }
}

接下來是提款機的功能部分,在處理提款機功能之前,我們先定義一個字串變數【Message】來存放操作訊息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";
        }
    }
}

接著我們開始處理提款機功能的部分,首先是顯示選單的部分。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";

            //功能
            Message = "【查詢餘額】請按【1】" + "\r\n";
            Message += "【提款】請按【2】" + "\r\n";
            Message += "【存款】請按【3】" + "\r\n";
            Console.Write(Message);
            Console.ReadKey();
        }
    }
}

選單做好了,接下來要跟各位介紹一個大家很熟悉卻又很陌生的函數【Console.ReadKey()】,平常都用它來停住畫面,前面文章也介紹過它的功能是擷取鍵盤上任一個按下的按鍵,這邊他要正式登場囉,不再只是用來停住畫面。

【Console.ReadKey()】會擷取鍵盤上任一個按下的按鍵,並回傳給你究竟是哪個按鍵被按下去,要怎麼做到這件事情,繼續往下看。

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";

            //功能
            Message = "【查詢餘額】請按【1】" + "\r\n";
            Message += "【提款】請按【2】" + "\r\n";
            Message += "【存款】請按【3】" + "\r\n";
            Console.Write(Message);
            switch (Console.ReadKey().Key)
            {
                case ConsoleKey.D1:
                    { }
                    break;
                case ConsoleKey.D2:
                    { }
                    break;
                case ConsoleKey.D3:
                    { }
                    break;
                default:
                    { }
                    break;
            }
        }
    }
}

這邊用了【switch...case】來做為判斷,因為提款機的功能有很多,為了簡化程式我這邊只列出三項功能,其他的功能你可以自己試著加進去。

另外,【ConsoleKey】這裡面放了所有鍵盤的對應碼,所以【ConsoleKey.D1】意味著式鍵盤上的【1】,你可以把滑鼠移到【ConsoleKey.D1】停留一下就會看到說明,後面的【ConsoleKey.D2】以及【ConsoleKey.D3】應該就不難理解了吧!

由於上面的程式碼case裡面的的程式碼區塊是空的,意味著你按下任何按鍵都不會有任何作用,接著程式就關閉,為了測試程式是否有正確擷取到按鍵,我們在【case】的區塊中填入一些測試程式碼。

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";

            //功能
            Message = "【查詢餘額】請按【1】" + "\r\n";
            Message += "【提款】請按【2】" + "\r\n";
            Message += "【存款】請按【3】" + "\r\n";
            Console.Write(Message);
            switch (Console.ReadKey().Key)
            {
                case ConsoleKey.D1:
                    {
                        Message = "這是按鍵1" + "\r\n";
                    }
                    break;
                case ConsoleKey.D2:
                    {
                        Message = "這是按鍵2" + "\r\n";
                    }
                    break;
                case ConsoleKey.D3:
                    {
                        Message = "這是按鍵3" + "\r\n";
                    }
                    break;
                default:
                    {
                        Message = "你按的按鍵是123以外的按鍵" + "\r\n";
                    }
                    break;
            }
            Console.Write(Message);
            Console.ReadKey();
        }
    }
}

到這邊你可以【重新編譯】一下並執行【開始偵錯】跑跑看程式是不是有如預期的行為,按下123或其他按鍵應該都會得到程式的回應。

接下來我們開始一一補齊各功能的程式碼,首先是【餘額查詢】,還記得我們在一開始就宣告了帳戶金額的變數嗎?這邊只要把帳戶金額變數顯示在畫面上就行了。

 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";

            //功能
            Message = "【查詢餘額】請按【1】" + "\r\n";
            Message += "【提款】請按【2】" + "\r\n";
            Message += "【存款】請按【3】" + "\r\n";
            Console.Write(Message);
            switch (Console.ReadKey().Key)
            {
                case ConsoleKey.D1:
                    {
                        Message = "您的帳戶餘額為【" + AccountMoneny + "】元" + "\r\n";
                    }
                    break;
                case ConsoleKey.D2:
                    {
                        Message = "這是按鍵2" + "\r\n";
                    }
                    break;
                case ConsoleKey.D3:
                    {
                        Message = "這是按鍵3" + "\r\n";
                    }
                    break;
                default:
                    {
                        Message = "你按的按鍵是123以外的按鍵" + "\r\n";
                    }
                    break;
            }
            Console.Write(Message);
            Console.ReadKey();
        }
    }
}

【餘額查詢】就這麼簡單,接著要處理的功能是【提款】,我們操作提款機的時候,首先是輸入提款金額,如果餘額足夠,那就會順利領到錢,如果餘額不足,系統會跟你說餘額不足,讓我們把這個功能實踐在這個程式裡面。

這邊另外會看到兩個新東西,一個是【Convert】,另一個是【Console.ReadLine()】。

【Convert】以後也是經常使用的東西,用來處理型態轉換,比方說字串變數轉整數型態,字串變數轉浮點數型態......。

而【Console.ReadLine()】則是與【 Console.ReadKey()】的功能相近,差別在於使用【Console.ReadLine()】可以輸入一整行的資料,直到你按下【enter】按鍵才開始截取按下【enter】以前輸入的所有資料,而【 Console.ReadKey()】是擷取你當下按的按鍵。

讓我們來看看【提款】這段程式碼長的什麼樣子。

 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
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";

            //功能
            Message = "【查詢餘額】請按【1】" + "\r\n";
            Message += "【提款】請按【2】" + "\r\n";
            Message += "【存款】請按【3】" + "\r\n";
            Console.Write(Message);
            switch (Console.ReadKey().Key)
            {
                case ConsoleKey.D1:
                    {
                        //餘額查詢
                        Message = "您的帳戶餘額為【" + AccountMoneny + "】元" + "\r\n";
                    }
                    break;
                case ConsoleKey.D2:
                    {
                        //提款
                        Message = "請輸入提款金額:";
                        Console.Write(Message);
                        int Input = Convert.ToInt32(Console.ReadLine());
                        if (AccountMoneny - Input >= 0)
                        {
                            AccountMoneny = AccountMoneny - Input;
                        }
                        else
                        {
                            Message = "餘額不足" + "\r\n";
                        }                       
                    }
                    break;
                case ConsoleKey.D3:
                    {
                        Message = "這是按鍵3" + "\r\n";
                    }
                    break;
                default:
                    {
                        Message = "你按的按鍵是123以外的按鍵" + "\r\n";
                    }
                    break;
            }
            Console.Write(Message);
            Console.ReadKey();
        }
    }
}

我們透過【Console.ReadLine()】得到一串金額的文字,經過【Convert.ToInt32()】函數將金額的文字轉換成整數存放到變數【Input】裡面,再與帳戶金額做運算,如果帳戶金額扣掉變數【Input】大於等於0,意味著帳戶餘額足夠,如果帳戶金額扣掉變數【Input】小於0,則意味著帳戶餘額不夠。

剩下還沒處理的功能是【存款】,實踐【存款】功能的程式碼就簡單的多,只要把帳戶金額加上輸入的數字就搞定了。

 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
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";

            //功能
            Message = "【查詢餘額】請按【1】" + "\r\n";
            Message += "【提款】請按【2】" + "\r\n";
            Message += "【存款】請按【3】" + "\r\n";
            Console.Write(Message);
            switch (Console.ReadKey().Key)
            {
                case ConsoleKey.D1:
                    {
                        //餘額查詢
                        Message = "您的帳戶餘額為【" + AccountMoneny + "】元" + "\r\n";
                    }
                    break;
                case ConsoleKey.D2:
                    {
                        //提款
                        Message = "請輸入提款金額:";
                        Console.Write(Message);
                        int Input = Convert.ToInt32(Console.ReadLine());
                        if (AccountMoneny - Input >= 0)
                        {
                            AccountMoneny = AccountMoneny - Input;
                        }
                        else
                        {
                            Message = "餘額不足" + "\r\n";
                        }                       
                    }
                    break;
                case ConsoleKey.D3:
                    {
                        //存款
                        Message = "請輸入存款金額:";
                        Console.Write(Message);
                        int Input = Convert.ToInt32(Console.ReadLine());
                        AccountMoneny = AccountMoneny + Input;
                    }
                    break;
                default:
                    {
                        Message = "你按的按鍵是123以外的按鍵" + "\r\n";
                    }
                    break;
            }
            Console.Write(Message);
            Console.ReadKey();
        }
    }
}

最後還有一個地方需要補齊一下程式碼,就是不是按下123鍵的處理,我們修改一下顯示內容就好了。

 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
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";

            //功能
            Message = "【查詢餘額】請按【1】" + "\r\n";
            Message += "【提款】請按【2】" + "\r\n";
            Message += "【存款】請按【3】" + "\r\n";
            Console.Write(Message);
            switch (Console.ReadKey().Key)
            {
                case ConsoleKey.D1:
                    {
                        //餘額查詢
                        Message = "您的帳戶餘額為【" + AccountMoneny + "】元" + "\r\n";
                    }
                    break;
                case ConsoleKey.D2:
                    {
                        //提款
                        Message = "請輸入提款金額:";
                        Console.Write(Message);
                        int Input = Convert.ToInt32(Console.ReadLine());
                        if (AccountMoneny - Input >= 0)
                        {
                            AccountMoneny = AccountMoneny - Input;
                        }
                        else
                        {
                            Message = "餘額不足" + "\r\n";
                        }                       
                    }
                    break;
                case ConsoleKey.D3:
                    {
                        //存款
                        Message = "請輸入存款金額:";
                        Console.Write(Message);
                        int Input = Convert.ToInt32(Console.ReadLine());
                        AccountMoneny = AccountMoneny + Input;
                    }
                    break;
                default:
                    {
                        Message = "本提款機沒有此功能選項" + "\r\n";
                    }
                    break;
            }
            Console.Write(Message);
            Console.ReadKey();
        }
    }
}

好了,到這邊目前為止功能大致上都完成了,剩下一個功能,就是【是否離開】這個功能,我們在操作提款機的時候,如果你提款完成都會問你是否要繼續操作,如果要繼續操作,就會又回到估能選單,怎麼實踐這個功能?那就要用到我們之前講過的迴圈敘述【while】。

要怎麼做?先試試看寫一個【while】敘述,並把實踐提款機功能的那些程式碼搬進【while】敘述裡面,然後【while】的判斷式不寫,只填入【true】,什麼!!判斷式可以不寫,而且為蝦米要填入【true】?這個稍後解釋,先看程式碼。

 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";

            while (true)
            {
                //功能
                Message = "【查詢餘額】請按【1】" + "\r\n";
                Message += "【提款】請按【2】" + "\r\n";
                Message += "【存款】請按【3】" + "\r\n";
                Console.Write(Message);
                switch (Console.ReadKey().Key)
                {
                    case ConsoleKey.D1:
                        {
                            //餘額查詢
                            Message = "您的帳戶餘額為【" + AccountMoneny + "】元" + "\r\n";
                        }
                        break;
                    case ConsoleKey.D2:
                        {
                            //提款
                            Message = "請輸入提款金額:";
                            Console.Write(Message);
                            int Input = Convert.ToInt32(Console.ReadLine());
                            if (AccountMoneny - Input >= 0)
                            {
                                AccountMoneny = AccountMoneny - Input;
                            }
                            else
                            {
                                Message = "餘額不足" + "\r\n";
                            }
                        }
                        break;
                    case ConsoleKey.D3:
                        {
                            //存款
                            Message = "請輸入存款金額:";
                            Console.Write(Message);
                            int Input = Convert.ToInt32(Console.ReadLine());
                            AccountMoneny = AccountMoneny + Input;
                        }
                        break;
                    default:
                        {
                            Message = "本提款機沒有此功能選項" + "\r\n";
                        }
                        break;
                }
                Console.Write(Message);
                Console.ReadKey();
            }          
        }
    }
}

【重新編譯】一下程式碼執行看看,原本執行程式碼跑完一次流程就結束了,要重新進入選單就要重新執行一次程式,現在不用重執行程式碼就可以重新跑整個提款機流程,但是問題來了,怎麼結束程式?好像不管按蝦米按鍵都沒辦法結束程式,妳只好先按右上角的X強制結束程式,怎麼會這樣?

我來解釋一下,關鍵在於【while】敘述的判斷式,我們沒有填入任何判斷式,只填入【true】,造成【無限迴圈】的現象,什麼是【無限迴圈】意思就是迴圈沒有終止條件,會一直執行下去。所以,現在【while】迴圈解決了重複跑提款機流程的問題,卻產生無法結束的問題?怎麼辦!!

讓我們來修改一下【while】迴圈的判斷式,要怎麼修改?想法是這樣的,當我們按下某一個特定的按鍵,就讓【while】迴圈終止,怎麼做?繼續往下看。

 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";
            bool Exist = false;

            while (!Exist)
            {
                //功能
                Message = "【查詢餘額】請按【1】" + "\r\n";
                Message += "【提款】請按【2】" + "\r\n";
                Message += "【存款】請按【3】" + "\r\n";
                Console.Write(Message);
                switch (Console.ReadKey().Key)
                {
                    case ConsoleKey.D1:
                        {
                            //餘額查詢
                            Message = "您的帳戶餘額為【" + AccountMoneny + "】元" + "\r\n";
                        }
                        break;
                    case ConsoleKey.D2:
                        {
                            //提款
                            Message = "請輸入提款金額:";
                            Console.Write(Message);
                            int Input = Convert.ToInt32(Console.ReadLine());
                            if (AccountMoneny - Input >= 0)
                            {
                                AccountMoneny = AccountMoneny - Input;
                            }
                            else
                            {
                                Message = "餘額不足" + "\r\n";
                            }
                        }
                        break;
                    case ConsoleKey.D3:
                        {
                            //存款
                            Message = "請輸入存款金額:";
                            Console.Write(Message);
                            int Input = Convert.ToInt32(Console.ReadLine());
                            AccountMoneny = AccountMoneny + Input;
                        }
                        break;
                    default:
                        {
                            Message = "本提款機沒有此功能選項" + "\r\n";
                        }
                        break;
                }
                Console.Write(Message);
                Message = "你是否要離開此系統?(y/n):";
                Console.Write(Message);
                if (Console.ReadKey().Key == ConsoleKey.Y)
                    Exist = true;
            }          
        }
    }
}

我們修改了一些程式碼,在必要條件那邊另外宣告一個布林變數【Exist】,初始值設定為【false】,由他控制【while】迴圈是否要終止,另外,【while】敘述的【判斷式】由【true】改為【!Exist】,最後是在提款機功能結束後加入訊息詢問使用者是否要離開系統,並由【Console.ReadKey()】擷取使用者輸入的按鍵判斷是否要離開系統。

好了,簡易提款機終於完成了,美中不足的是,每次重新跑流程的時候,顯示的訊息都會跟之前的訊息混在同一行,怎麼解決?聰明的你應該知道吧!

 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Exercise_2
{
    class Program
    {
        static void Main(string[] args)
        {
            //必要條件
            int AccountMoneny = 0;
            string Message = "";
            bool Exist = false;

            while (!Exist)
            {
                Console.Clear();
                //功能
                Message = "【查詢餘額】請按【1】" + "\r\n";
                Message += "【提款】請按【2】" + "\r\n";
                Message += "【存款】請按【3】" + "\r\n";
                Console.Write(Message);
                switch (Console.ReadKey().Key)
                {
                    case ConsoleKey.D1:
                        {
                            //餘額查詢
                            Message = "您的帳戶餘額為【" + AccountMoneny + "】元" + "\r\n";
                        }
                        break;
                    case ConsoleKey.D2:
                        {
                            //提款
                            Message = "請輸入提款金額:";
                            Console.Write(Message);
                            int Input = Convert.ToInt32(Console.ReadLine());
                            if (AccountMoneny - Input >= 0)
                            {
                                AccountMoneny = AccountMoneny - Input;
                            }
                            else
                            {
                                Message = "餘額不足" + "\r\n";
                            }
                        }
                        break;
                    case ConsoleKey.D3:
                        {
                            //存款
                            Message = "請輸入存款金額:";
                            Console.Write(Message);
                            int Input = Convert.ToInt32(Console.ReadLine());
                            AccountMoneny = AccountMoneny + Input;
                        }
                        break;
                    default:
                        {
                            Message = "本提款機沒有此功能選項" + "\r\n";
                        }
                        break;
                }
                Console.Write(Message);
                Message = "你是否要離開此系統?(y/n):";
                Console.Write(Message);
                if (Console.ReadKey().Key == ConsoleKey.Y)
                    Exist = true;
            }          
        }
    }
}

什麼??做法跟你想的不一樣,這是一定的,因為畢竟資歷比你深一點點,今天最後要介紹的是【 Console.Clear()】,這個函數是用來清除畫面資料的,我把它寫在【while】敘述第一行,意味著每次【while】迴圈重新執行的時候,都會先把畫面清除,再開始顯示功能選單,於式介面就變得乾乾淨淨囉,今天就到這裡了,改天見。

沒有留言:

張貼留言