需要學習C#編程。第一個任務就是制作一個簡單的計算器。
首先新建一個C#窗體項目,
放置一個Label控件、TextBox控件和Button控件,作用分別是顯示計算過程、顯示計算結果、數字和運算符輸入;
拖入控件時應對其屬性進行設置,如筆者的按鈕名稱(Name屬性)設置為“Button_0”,TextBox的TextAlign屬性設置為Right(使文本右對齊)
窗體布局好的效果圖如右圖所示。
布置完窗體后,就開始對控件的事件寫。我們可以對按鈕單擊事件的方法進行編寫,雙擊按鈕控件,默認進入單擊(Click)事件,
在事件中可以寫如下方法:
private void Button_0_Click(object sender, EventArgs e) { DispBox.Text += "0"; //筆者將TextBox控件命名為DispBox }
采用這種方式有個不好的地方,10個數字按鈕將要寫10個Click事件,因此采用另外一種方法:選中所有數字按鈕,在屬性窗口中選中事件,在Click事件中添加相應的方法,如筆者在Click事件中為所有數字添加一個buttonNum_Click方法。
接着在代碼編輯窗口添加相應的處理方法,具體如下:
private void buttonNum_Click(object sender, EventArgs e) { if (sender == Button_0) { if (DispBox.Text.First() == '0' || state) DispBox.Text = "0"; //不顯示00000123的情況,state作為一個文本框中是否有結果的標志 else if (!state) DispBox.Text += "0"; } else { clearbox(); //載入窗體后第一次按下數字時清除文本框內容 state = false; if (sender == Button_1) DispBox.Text += "1"; else if (sender == Button_2) DispBox.Text += "2"; else if (sender == Button_3) DispBox.Text += "3"; else if (sender == Button_4) DispBox.Text += "4"; else if (sender == Button_5) DispBox.Text += "5"; else if (sender == Button_6) DispBox.Text += "6"; else if (sender == Button_7) DispBox.Text += "7"; else if (sender == Button_8) DispBox.Text += "8"; else if (sender == Button_9) DispBox.Text += "9"; else if (sender == ButtonPi) { DispBox.Text = Convert.ToString(pi); state = true; } //單獨按π鍵后顯示π值,在下個事件觸發時清除文本框顯示 } }
處理完數字的單擊事件后,接下來對運算符的單擊事件進行處理。在這里筆者使用兩個泛型列表,一個存放用戶輸入的數字,一個存放運算符,而在實際的操作中,要防止運算符在輸完一個數字后被重復按下,因此使用了一些布爾變量作為“防呆”設置,具體定義如下:
private List<double> value_list = new List<double>();//存放用戶輸入的數字 private List<char> op_list = new List<char>(); //存放用戶輸入的運算符 private bool state = true;//true 表示只有一位0或文本框已有計算結果 private bool dot_flag = true; //false則小數點不能按下 //運算符防重復按下標志變量 private bool add_flag = false; private bool sub_flag = false; private bool mul_flag = false; private bool div_flag = false; private bool mod_flag = false; private bool result_flag = false;//=按鈕狀態標志 private bool op_state = false; //表示運算符是否可被操作
同樣的方法,對“+”、“-”、“*”、“/”、“%”五個運算符進行單擊事件方法的編寫:
private void button_Op_Click(object sender, EventArgs e) { state = true; if (sender == ButtonAdd && (!add_flag)) { value_list.Add(double.Parse(DispBox.Text)); op_list.Add('+'); add_flag = true; op_state = false; } else if (sender == ButtonSub && (!sub_flag)) { value_list.Add(double.Parse(DispBox.Text)); op_list.Add('-'); sub_flag = true; op_state = false; } else if (sender == ButtonMul && (!mul_flag)) { value_list.Add(double.Parse(DispBox.Text)); op_list.Add('*'); mul_flag = true; op_state = false; } else if (sender == ButtonDiv && (!div_flag)) { value_list.Add(double.Parse(DispBox.Text)); op_list.Add('/'); div_flag = true; op_state = false; } else if (sender == ButtonMod && (!mod_flag)) { value_list.Add(double.Parse(DispBox.Text)); op_list.Add('%'); mod_flag = true; op_state = false; } }
該事件僅僅對運算符的單擊事件進行處理,但實際上對運算結果還未進行處理和顯示,因此可以將處理這個過程的方法給“=”按鈕的單擊事件去處理:
private void ButtonResult_Click(object sender, EventArgs e) { //按 = 鍵時必須有運算符被按下 if ( op_list.Count > 0 && op_state) { value_list.Add(double.Parse(DispBox.Text)); double total = value_list[0]; for (int i = 0; i < op_list.Count; i++) { char op = op_list[i]; switch (op) { case '+': total += value_list[i + 1]; break; case '-': total -= value_list[i + 1]; break; case '*': total *= value_list[i + 1]; break; case '/': total /= value_list[i + 1]; break; case '%': total %= value_list[i + 1]; break; } } DispBox.Text = total + ""; op_list.Clear(); //清空累計的運算符和運算結果組的列表 value_list.Clear(); result_flag = true;//表示=按下 state = true; } }
好了,到此簡單計算器(簡單到沒有運算符優先級功能)的大部分功能都已經能夠實現,剩下的一些小功能的按鈕,如1/x功能,主要要記得處理分母為0時的情況,“±”可濾除±0的情況。最終的初始界面如下圖:
如當我輸入 “ 145+999-666*12/33”時,得出的結果為173.81818181……
總結:本次簡單計算器的制作只是筆者作為一個剛學習C#編程的菜鳥的練習,其中肯定有許多的不足和bug。在C#編程方面,筆者還有許許多多不了解的知識,希望老鳥勿噴,也希望有共同興趣愛好的朋友能夠相互交流,不吝賜教。