C#初學——簡單計算器的制作


需要學習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#編程方面,筆者還有許許多多不了解的知識,希望老鳥勿噴,也希望有共同興趣愛好的朋友能夠相互交流,不吝賜教。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM