閑着無聊做一個簡單版計算器用C#winform實現(面向對象)


 

 

 

簡單版計算器,四則運算功能。

具體怎么做出來的呢,嗯,我先說一說布局。顯示框用兩個label控件,label1顯示操作運算,label2顯示運算值。設置其AutoSize屬性為false,就可以把label控件延伸擴大了。

操作運算符和數字都是button控件,外觀設置就不說了,最基礎的,小白不會的就去查資料。

然后現在就說一下代碼

 

先添加一個操作運算基類Oper,兩個屬性表示操作數

public class Oper
    {
        private double _numberA = 0;
        private double _numberB = 0;

        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }

        public double NumnberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }

        public virtual double GetResult()
        {
            double result = 0d;
            return result;
        }
    }

 

 

添加四個加減乘除類繼承Oper類,重寫父類方法。

 //加法類
public class OperAdd : Oper    {
        /// <summary>
        /// 重寫父方法:GetResult
        /// </summary>
        /// <returns></returns>
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumnberB;
            return result;
        }
    }


//減法類
 public class OperSub : Oper    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumnberB;
            return result;
        }
    }

//乘法類
public class OperMul : Oper    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA * NumnberB;
            return result;
        }
    }

//除法類
public class OperationDiv : Oper    {
        public override double GetResult()
        {
            double result = 0;
            if (NumnberB == 0)
                throw new Exception("除數不能為0.");
            result = NumberA * 1.0 / NumnberB;
            return result;
        }
    }

  

 添加一個運算符枚舉類,代表四則運算符號

        /// <summary>
        /// 運算符枚舉
        /// </summary>
        public enum EnumOperator
        {
            None = 0,
            Add = 1,
            Minus = 2,
            Multiply = 3,
            Divide = 4
        }

 

 

再添加個運算工廠類OperFactory作為中轉站,輸入運算符,工廠就能實例化出合適的對象,通過多態,返回父類的方式實現計算器的結果。

public class OperFactory
    {
        /// <summary>
        /// 只需輸入運算符,工廠就能實例化出合適的對象,通過多態,返回父類的方式實現了計算器的結果
        /// </summary>
        /// <param name="operate">運算符</param>
        /// <returns></returns>
        public static Oper createOpeate(EnumOperator op)
        {
            Oper oper = null;
            switch (op)
            {
                case EnumOperator.Add:
                    oper = new OperationAdd();
                    break;
                case EnumOperator.Minus:
                    oper = new OperationSub();
                    break;
                case EnumOperator.Multiply:
                    oper = new OperationMul();
                    break;
                case EnumOperator.Divide:
                    oper = new OperationDiv();
                    break;
                default:
                    break;
            }
            return oper;
        }
    }

添加一個string類型的有參無返函數——NumberClick(string)

        double currentValue = 0;   //第1個數 
        double numSum = 0;  //第2個數
        private EnumOperator currentOperator; //當前操作符  
        
        /// <summary>
        /// 按數字的時候
        /// </summary>
        /// <param name="strNumber"></param>
        private void NumberClick(string strNumber)
        {
            
            label1.Text = label1.Text + strNumber;
            currentValue = Convert.ToDouble(label1.Text);

            label2.Text += strNumber;

        }    

 

然后在每個數字按鈕的點擊事件中調用函數,顯示運算過程

        private void button6_Click(object sender, EventArgs e)
        {
            NumberClick(button6.Text);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            NumberClick(button7.Text);
        }

        private void button11_Click(object sender, EventArgs e)
        {
            NumberClick(button11.Text);
        }

        private void button9_Click(object sender, EventArgs e)
        {
            NumberClick(button9.Text);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            NumberClick(button1.Text);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            NumberClick(button2.Text);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            NumberClick(button3.Text);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            NumberClick(button4.Text);
        }

        private void button5_Click(object sender, EventArgs e)
        {
            NumberClick(button5.Text);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            NumberClick(button8.Text);
        }

 

定義一個枚舉運算符參數的函數OperatorClick(EnumOperator op),里面調用DisplayOperator(EnumOperator op)方法(見下下)

private void OperatorClick(EnumOperator op)
        { 
            if (currentOperator != EnumOperator.None)
            {
                Evaluate();//計算
            }
            else
            {
                double.TryParse(label1.Text, out numSum);
            }
            DisplayOperator(op);
            label1.Text = "";
            currentOperator = op;
        }

四則運算符按鈕的點擊事件中調用代表運算符號的枚舉

        //+
        private void button12_Click(object sender, EventArgs e)
        {
            OperatorClick(EnumOperator.Add);
        }
        //-
        private void button13_Click(object sender, EventArgs e)
        {
            OperatorClick(EnumOperator.Minus);
        }

        //X
        private void button14_Click(object sender, EventArgs e)
        {
            OperatorClick(EnumOperator.Multiply);
        }
        //÷
        private void button15_Click(object sender, EventArgs e)
        {
            OperatorClick(EnumOperator.Divide);
        } 

根據運算符號來執行四則運算顯示的內容 函數 DisplayOperator(EnumOperator op)

private void DisplayOperator(EnumOperator op)
        {
            switch (op)
            {
                case EnumOperator.None:
                    label2.Text = label1.Text;
                    label2.Text += "";
                    break;
                case EnumOperator.Add:
                    if (label1.Text != "")
                    {
                        label2.Text = label1.Text;
                    }
                    label2.Text += "+";
                    break;
                case EnumOperator.Minus:
                    if (label1.Text != "")
                    {
                        label2.Text = label1.Text;
                    }
                    label2.Text += "-";
                    break;
                case EnumOperator.Multiply:
                    label2.Text = label1.Text;
                    label2.Text += "x";
                    break;
                case EnumOperator.Divide:
                    label2.Text = label1.Text;
                    label2.Text += "";
                    break;
                default:
                    break;
            }
        }

 

根據運算符和兩個數字的計算結果

調用簡單工廠模式生成的類 Evaluate()

private void Evaluate()
        {
            Operation oper;

            //根據不同的對象生成不同的類,多態!
            switch (currentOperator)
            {
                case EnumOperator.None:
                    break;
                case EnumOperator.Add:
                    oper = OperationFactory.createOpeate(EnumOperator.Add);
                    oper.NumberA = numSum;
                    oper.NumnberB = currentValue;
                    numSum = oper.GetResult();
                    break;
                case EnumOperator.Minus:
                    oper = OperationFactory.createOpeate(EnumOperator.Minus);
                    oper.NumberA = numSum;
                    oper.NumnberB = currentValue;
                    numSum = oper.GetResult();
                    break;
                case EnumOperator.Multiply:
                    oper = OperationFactory.createOpeate(EnumOperator.Multiply);
                    oper.NumberA = numSum;
                    oper.NumnberB = currentValue;
                    numSum = oper.GetResult();
                    break;
                case EnumOperator.Divide:
                    if (currentValue != 0)
                    {
                        oper = OperationFactory.createOpeate(EnumOperator.Divide);
                        oper.NumberA = numSum;
                        oper.NumnberB = currentValue;
                        numSum = oper.GetResult();
                    }
                    else
                    {
                        MessageBox.Show("除數不能為0哦,親~", "出錯了~");
                    }
                    break;
            }
            currentValue = 0;
            currentOperator = EnumOperator.None;
        }

 

 

在 “=” 按鈕中添加點擊事件,調用Evaluate()計算結果

       private void button10_Click(object sender, EventArgs e)
        { 
            Evaluate();
            label1.Text = numSum.ToString();
            //防止重復按 = 
            if (label1.Text.Length > 1 && label1.Text.Substring(label1.Text.Length - 1) != "=")
            {
                label1.Text += "";
            }
        }

 

在C按鈕中添加點擊事件,寫入執行代碼如下

        private void button16_Click(object sender, EventArgs e)
        {
            currentOperator = EnumOperator.None;
            label1.Text = "";
            label2.Text = "";
            numSum = 0;
        }

 

 

ok,這就是簡單版計算器的全部解析和代碼量了。

源碼分享鏈接 https://pan.baidu.com/s/1vspuwqVDKh4b6BpTxBR1Uw

有問題的可以參考源碼,當然源碼也只是實現了四則運算功能,但用戶體驗較差

面向對象編程實用性很廣,大家可以多參考學習一下

 

女朋友3D相冊鏈接

https://www.cnblogs.com/wl192/p/11511200.html

 


免責聲明!

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



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