无聊做了一个简单版计算器用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;
        }
    }

  

再添加个运算工厂类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;
        }   
View Code

然后给每个数字按钮弄一个点击事件,调用数字函数。

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

定义一个函数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;
            }
        }
View Code

根据运算符和两个数字的计算结果

调用简单工厂模式生成的类

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;
        }
View Code

再定义一个函数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;
        }
View Code

在加减乘除按钮上双击,进入后台,调用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);
        }
View Code

在=按钮上双击,进入后台,编辑

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 += "=";
            }
        }
View Code

在C按钮上双击,进入后台编辑

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

ok,这就是简单版计算器的全部讲解以及代码了。

根据一个大佬的源码改进的,编程语言勉强入门,有不足的地方请大佬们指点。

猜你喜欢

转载自www.cnblogs.com/wl192/p/9577846.html