简单版计算器,加减乘除功能。
具体怎么做出来的呢,嗯,我先说一说布局。显示框用两个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; } }
再添加个运算工厂类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; } }
首先按数字的时候,添加一个函数NumberClick
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 button7_Click(object sender, EventArgs e) { NumberClick(button7.Text); }
定义一个函数DisOperator,实现显示框中输入的数字和运算符
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() { Oper 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; }
再定义一个函数OperatorClick,调用DisOperator函数和Evaluate函数
private void OperatorClick(EnumOperator op) { if (currentOperator != EnumOperator.None) { //计算 Evaluate(); } else { //numSum = double.Parse(lblResult.Text); double.TryParse(label1.Text, out numSum); } DisplayOperator(op); label1.Text = ""; currentOperator = op; }
在加减乘除按钮上双击,进入后台,调用OperatorClick()函数
private void button12_Click(object sender, EventArgs e) { OperatorClick(EnumOperator.Add); } private void button13_Click(object sender, EventArgs e) { OperatorClick(EnumOperator.Minus); } private void button14_Click(object sender, EventArgs e) { OperatorClick(EnumOperator.Multiply); } private void button15_Click(object sender, EventArgs e) { OperatorClick(EnumOperator.Divide); }
在=按钮上双击,进入后台,编辑
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,这就是简单版计算器的全部讲解以及代码了。
根据一个大佬的源码改进的,编程语言勉强入门,有不足的地方请大佬们指点。