我們今天來練習寫一個簡易提款機的程式,這個程式的程式碼稍多,不過不用擔心,我們一步一步來。
電腦說穿了其實只是運算速度飛快,它什麼都不會做,要怎麼做是你要教他做,你跟它說怎麼做它就照著做。
讓我們先來想想,我們平常怎麼操作提款機。先決條件是要有某個銀行帳戶,然後才能去提款機,輸入帳號密碼後選擇要提款、存款、轉帳還是繳卡費等等功能,執行完一個功能會問你是否要繼續操作,沒有要繼續操作的話就退出系統,我的印象跟大家應該沒有不一樣吧!
有了上述的操作經驗,現在我們來定義一下簡易提款機的重點。
必要條件:
銀行帳戶。
功能:
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】迴圈重新執行的時候,都會先把畫面清除,再開始顯示功能選單,於式介面就變得乾乾淨淨囉,今天就到這裡了,改天見。