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