计算器制作

事件函数的两个参数的定义:private void button21_Click(object sender, EventArgs e)

{

button a=(button)sender;

}

sender:事件主体(事件的触发对象)

EvenArgs:事件数据(参数)

例如:可以通过a访问button21的其他属性;


开发计算器过程: 
先分析最简单的现实情况:两个数

目标清晰;

成果展示:

SNAGHTMLcf1651

思路:

1:从最简单的两个数运算出发,找出问题中的两个主要对象:两个数字型字符串,五个运算符。

2.找出各个对象需要在问题中体现的特点,

数字型字符串:通过11个按钮赋值;本身及运算结果在文本框的显示设定与实现;

运算符:主要通过成员函数解决运算问题;

不同对象的功能相似的函数可通过触发事件,通过一个函数来实现,比如各个按钮的赋值功能。(本例题未体现)


private string preOperaror;//用来存储前面的运算符
        private string firstNum;//用来存储运算结果
        private string secondNum;//用来存储当前输入的
        private bool a = false;//标记是否重复输入了运算符
        private double result;


//通过按钮给数字型字符串赋值
 private void twobutton_Click(object sender, EventArgs e)
        {
            //若前面有过计算结果,清空状态框、表达式框
            if (preOperaror == "=")
            {
                expressionBox1.Clear();
                resultBox2.Clear();
                preOperaror = null;
            }
            //如果刚刚输入运算符,清空结果框
            if (a)
            {
                resultBox2.Clear();
                a = false;
            }
            //存入当前数字串secondNum
            secondNum += "2";
            //显示当前数字串
            resultBox2.Text += "2";

        }
//小数点的输入
 private void dotBtn_Click(object sender, EventArgs e)
        {

            if (secondNum.Length > 0 && secondNum.ToString().Contains(".") == false)
            {
                secondNum += ".";
                resultBox2.Text += ".";
            }
        }

//加法运算,其他运算类似写法
private void plusButton_Click(object sender, EventArgs e)
        {
            //如果前面没有运算符
            if (preOperaror == null && secondNum != null)
            {
                firstNum = secondNum;
                preOperaror = "+";
                resultBox2.Clear();
                resultBox2.Text = firstNum;
                //保存表达式
                expressionBox1.Text += secondNum+"+";
                //清空secondNum,准备接收新值
                secondNum = null;
                a = true;//标记当前状态框最后一个字符是运算符,如果a=true,后面不能继续输入运算符
            }

                //如果前面有一个运算符,使用前面这个运算符运算,运算结果在状态框显示,更新表达式框,保存刚输入的运算符
            else
            {
                if (a == false||preOperaror=="=")//确保前面运算符后有数字,“=”是特殊情况
                {
                    //保存表达式
                    expressionBox1.Text +=secondNum+"+";

                    //根据preOperator,执行对应运算    
                    #region
                    if (preOperaror == "+")
                    {
                        //相加
                        result = double.Parse(firstNum) + double.Parse(secondNum);

                    }
                    if (preOperaror == "-")
                    {
                        //相减
                        result = double.Parse(firstNum) - double.Parse(secondNum);
                    }
                    if (preOperaror == "*")
                    {
                        //相乘
                        result = double.Parse(firstNum) * double.Parse(secondNum);
                    }
                    if (preOperaror == "/")
                    {
                        //除法
                        result = double.Parse(firstNum) / double.Parse(secondNum);
                    }
                    if (preOperaror == "=")
                    {
                        expressionBox1.Text = firstNum + "+";
                    }
                    #endregion

                    //清空secondNum,准备接收新值
                    secondNum = null;
                    a = true;
                    //显示计算结果
                    firstNum = result.ToString();
                    resultBox2.Clear();
                    resultBox2.Text = firstNum ;
                    //将当前按钮运算符存入
                    preOperaror = "+";
                }
            }
        }
//等号运算符
  private void resultBtn_Click(object sender, EventArgs e)
        {       
            #region
            if (a == false && secondNum != null)//保证前面有数字串、运算符
            {
                //根据preOperator,执行对应运算 (重复代码)   
                #region
                if (preOperaror == "+")
                {
                    //相加
                    result = double.Parse(firstNum) + double.Parse(secondNum);
                }
                if (preOperaror == "-")
                {
                    //相减
                    result = double.Parse(firstNum) - double.Parse(secondNum);
                }
                if (preOperaror == "*")
                {
                    //相乘
                    result = double.Parse(firstNum) * double.Parse(secondNum);
                }
                if (preOperaror == "/")
                {
                    //除法
                    result = double.Parse(firstNum) / double.Parse(secondNum);
                }
                #endregion
                //显示计算结果
                firstNum = result.ToString();
                resultBox2.Clear();
                resultBox2.Text = firstNum;
                //清空表达式框
                expressionBox1.Clear();
                //清空secondNum,准备接收新值
                secondNum = null;
                //用“=”运算符标记preOperaror,继续输入数字可以清空前面状态框
                preOperaror = "=";
                a = true;
            }

            #endregion
        }

//删除按钮:删除一个当前正在输入的数字字符串的末尾字符
   private void revokeButton_Click(object sender, EventArgs e)
        {
            if (a == false && secondNum.Length > 0)//确定当前输入数据不为空
            {
                secondNum = secondNum.Substring(0, secondNum.Length - 1);//删除当前数据最后一个字符
                resultBox2.Text = resultBox2.Text.Substring(0, resultBox2.Text.Length - 1);//状态框删除最后一个字符
            }
        }

//清除状态框中当前字符串的按钮
 private void clearReBtn_Click(object sender, EventArgs e)
        {
            //清空当前数字串、状态框
            if (!a)//避免删除运算结果
            {
                secondNum = null;
                resultBox2.Text = null;
            }
        }

 

posted @ 2015-04-21 11:01  大哇塞  阅读(190)  评论(0编辑  收藏  举报