--- tags: 110-2視窗程式設計 --- # 實作:計算機程式 程式設計的學習,如果能從範例開始,學習絕對是最快的,所以我們先從簡單的程式開始。 老師會建議學習一個程式語言,可以從計算機程式開始,藉此掌握最基本的語法與程式邏輯。 ## 試用軟體 同學你可以在以下連結,先把完整的程式下載回去使用看看。 [下載連結](https://fgu365-my.sharepoint.com/:f:/g/personal/chlu_vdi_fgu_edu_tw/ErAp2L7jZPFLtKxozH19ldgBUePawwFRqANx_wo7HsQj9Q?e=fWApLK) ## 開啟新專案 開啟新專案之前有教學過,如果你忘記了或不太熟悉,請點選[這裡](https://hackmd.io/sFFV6T2oT0-ysHotbIybhw?view#WPF-%E7%9A%84%E5%B0%88%E6%A1%88%E8%A8%AD%E5%AE%9A)。 :::success 我們的專案名稱可以叫做「Calculator」,簡單就好。 ::: ## 開始吧! 還記得第二部分的基本視窗程式設計嗎?同樣的,我們依照之前說過的兩個主要程式設計流程來設計: 1. 介面基本設計 2. 程式撰寫 因此,我們也是先初步設計介面,再來進行程式撰寫。 ## 第一步:進行介面基本設計 同學學習到現在,你應該都有一些自己設計介面的基礎了,請花點時間,拉一下控制項來做出類似以下的畫面。 ![](https://imgur.com/doO6Nkg.png) ### 控制項樣式設定 你應該會發現,這次控制項不能夠完全只用預設樣式,你需要調整字體大小和字型,那麼如何改呢?你可以參考數字顯示的輸入文字框的顯示字型設定,這裡我們設定字型為「微軟正黑體」、字體大小為「24pt」。如下圖,你可以試試看。 ![](https://imgur.com/PO5wyjr.png) 按鍵的樣式也可以調整,方式也與數字顯示差不多,你可以再試試看。 ![](https://imgur.com/3cHLWvr.png) ### 控制項取名 還記得嗎?控制項最重要的屬性就是「==**控制項名稱(Name)**==」,也就是這個控制項的「**名字**」叫什麼?所以別忘了,也要對你的控制項在「屬性視窗」中,選擇「名稱」,輸入一個有意義的名字。你可以自己設定名稱,只要不和別的控制項重複就好,或者你可以也參考以下建議的名稱: :::info 1. 數字顯示輸入文字框:txtNumber 2. 清除按鍵:btnClear 3. 數字鍵0到9:btnZero、btnOne、btnTwo、btnThree、btnFour、btnFive、btnSix、btnSeven、btnEight、btnNine 4. 小數點按鍵:btnDot 5. 等於按鍵:btnEqual 6. 加減乘除按鍵:btnAdd、btnMinus、btnPlus、btnDivide ::: ## 第二步:進行程式撰寫 接下來,我們要開始進行程式的撰寫,其實之前就提及了,寫程式是「**設計一個資料處理的流程**」。因此我們這個計算機程式要設計什麼樣的「工作流程」? :::success 你可以拿出你手機裡面的計算機App,一邊操作一邊想想,你是怎麼使用計算機的? ::: 通常寫程式之前不是馬上就開始狂打鍵盤,你應該先想想看,你的程式要做什麼事?所以,我們先想想看,計算機是怎麼操作的?因為這會決定我們要怎麼寫程式? :::info 1. 輸入第一個數字:輸入一個數字,從最左邊的數字輸入到最後一個數字 2. 選擇四則運算符號:從加、減、乘、除中挑選一個 3. 輸入第二個數字:輸入一個數字,從最左邊的數字輸入到最後一個數字 4. 按等於按鍵:得到計算結果 ::: ``` mermaid graph TD; 按下數字按鍵輸入第一個數字-->選擇要運算的四則運算符號; 選擇要運算的四則運算符號-->按下數字按鍵輸入第二個數字; 按下數字按鍵輸入第二個數字-->按下等於按鍵; 按下等於按鍵-->顯示計算結果; ``` 研究以上的流程,你會發現簡單的計算機,大概操作流程就跟上面類似,所以我們可以先從最上面的流程先慢慢寫程式。第一個流程完成之後,再實現下一個流程,我們從簡單的程式,再修改、增加、調整程式內容,最後就能完成完整的程式了! ### 事件綁定 這次的事件綁定都很單純,也就是所有的按鍵都要有一個「Click」事件綁定,所以請一次把所有的按鍵通通點兩下,讓所有的按鍵都能有事件綁定。也就是說每一個按鍵,都有能有類似以下的程式碼片段: ```csharp private void btnOne_Click(object sender, EventArgs e) { // 以數字1按鍵為例 } ``` ### 實現輸入數字 使用計算機一定會需要輸入數字,因此我們優先把這個功能做出來,這樣才能完成其他的程式。這個功能你不會陌生,就像下面這個簡單的動畫。 ![](https://i.imgur.com/xTxkM0c.gif =300x) 你可以注意到,當你輸入第一個數字,上方的數字就會出現,再輸入第二個數字,原來的數字會左移一格,第二個數字就會出現在第一個數字右邊,繼續輸入數字,新的數字都會出現在最右邊的位置。 輸入第一個數字「1」,顯示以下的樣子: :::success 1 ::: 輸入第二個數字「2」,就會顯示以下的樣子: :::success 12 ::: 所以,你可以發現,**每次輸入一個新數字,就是在原有的數字後面,再「加上」新數字**。程式可以寫成這樣: ```csharp txtNumber.Text = txtNumber.Text + "1"; ``` :::info 上面的程式碼,你可以解讀成:「把原有的數字顯示輸入文字框」再「加上1」 ::: 你可以把這段,放到數字鍵1的事件綁定程式段落,然後測試程式,看看按下數字鍵1會不會一直出現數字1。 ```csharp private void btnOne_Click(object sender, EventArgs e) { txtNumber.Text = txtNumber.Text + "1"; } ``` 完成之後,你可以把別的數字按鍵也實現出來,讓不同數字按鍵能夠出現數字。 ### 小小修正 如果你成功做出按下數字按鍵,數字顯示輸入文字框能夠顯示你輸入的數字,你大概會發現,有一點怪怪的,就是如果一開始輸入文字框只有「0」,再按下數字,數字就會連在「0」後面,這樣很奇怪。 所以我們小小的修改程式,改成以下的程式碼。 ```csharp private void btnOne_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") { txtNumber.Text = ""; //這個簡單的判斷式,會預先檢查輸入文字框是不是只有一個「0」?是的話,就先清除掉裡面的數字內容 } txtNumber.Text = txtNumber.Text + "1"; } ``` 我們再增加數字的程式碼上面增加簡單的判斷式,會預先檢查輸入文字框是不是只有一個「0」?是的話,就先清除掉裡面的數字內容,然後再增加數字在最右邊。 現在這樣修改,就不會出現如果輸入文字框只有「0」,新增數字卻放在「0」後面。 ### 再小小的修改 現在我們再把程式修改一下,你可以把程式修改成下面的樣子,結果都會是一樣的。 ```csharp private void btnOne_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = ""; // 如果你的判斷式簡單到只有一行程式,可以把 { } 大刮號省略掉 txtNumber.Text += "1"; // 這種寫法和這段「txtNumber.Text = txtNumber.Text + "1";」是一樣的 } ``` 這邊是跟同學介紹,有的時候如果你的判斷式如果只有一行程式要執行,那可以省略掉大括號「 { 」與「 } 」。 再來如果你只是要需要在某個變數後面增加資料,可以用運算子「 += 」來連接要增加的資料,這樣就不用連續寫兩次變數,直接用「 += 」來連接就好。 ## 參考程式碼 以下就是我們初步修改的程式碼,請同學試著將其他數字按鍵完成! ```csharp= using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnOne_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") { txtNumber.Text = ""; } txtNumber.Text = txtNumber.Text + "1"; // txtNumber.Text += "1"; // 上面和下面的寫法意思是一樣的 } private void btnTwo_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") // 如果你的判斷式簡單到只有一行程式,可以把 { } 大刮號省略掉 txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "2"; } private void btnThree_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "3"; } // 以下留給你 ... 請把每一個數字按鍵都做進去 } } ``` 如果每一個數字按鍵都可以像下圖,恭喜你已經大概完成所有數字按鍵的實作。 ![](https://imgur.com/6dX86ap.png) :::spoiler 參考答案 ```csharp= using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Calculator { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnOne_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") { txtNumber.Text = ""; } txtNumber.Text = txtNumber.Text + "1"; // txtNumber.Text += "1"; // 上面和下面的寫法意思是一樣的 } private void btnTwo_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") // 如果你的判斷式簡單到只有一行程式,可以把 { } 大刮號省略掉 txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "2"; } private void btnThree_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "3"; } private void btnFour_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "4"; } private void btnFive_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "5"; } private void btnSix_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "6"; } private void btnSeven_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "7"; } private void btnEight_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "8"; } private void btnNine_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = ""; txtNumber.Text = txtNumber.Text + "9"; } private void btnZero_Click(object sender, EventArgs e) { if (txtNumber.Text == "0") txtNumber.Text = txtNumber.Text + "0"; } } } ``` :::