簡單版計算器,四則運算功能。
具體怎么做出來的呢,嗯,我先說一說布局。顯示框用兩個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