如题

解决方案 »

  1.   

    输入框onchange判断输入字符,如果有两个操作符的话,就把第一个操作符两边的数算出来,用结果替换,保证最多只有一个操作符,不知道这样行不行
      

  2.   

    网上下载一个计算器程序的源码,看看别人是怎么做的。
    另外推荐一个网址:http://www.51aspx.com/
      

  3.   

    给你些代码,可以参考,主要是自己动手做哈.{
        public partial class caculator1 : Form
        {
            String op1,op2;           //定义两个操作数
            bool DecimalFlag;         //标识小数点是否存在
            int NumOps;               //记录操作数个数
            String LastInput;         //指示上一次按键事件的类型
            int OpFlag;               //指示将要进行的操作类型
            bool OperaterFlag;        //指示是否已经进行过操作
            String TempReadout;
            public caculator1()
            {
                InitializeComponent();//初始化界面控件
            }
            private void caculator1_Load(object sender, EventArgs e)   //对变量进行初始化赋值
            {
                DecimalFlag = false;                 //小数点标志赋为false
                OperaterFlag = false;                //尚未进行过操作
                NumOps = 0;                          //操作数个数为
                LastInput = "NONE";
                OpFlag = 0;
                ReadOut.Text = "0.";                 //文本框中初始值为“.”
            }
            public void calculate(int MyNumber)            //接收操作数
            {
                if (!OperaterFlag)                         //判断是否点击过操作符,初始值为false  如果没有点击操作符
                {
                    if (DecimalFlag)                       //判断是否点击过小数点,初始值为false   如果已经点击过小数点
                    {
                        ReadOut.Text = ReadOut.Text + MyNumber;   //直接把点击的数字加在框中现有数据的后面  小数点后点击的数字直接追加
                    }
                    else                                       //未曾点击过小数点则进行如下操作  
                    {
                        if (ReadOut.Text == "0.")          
                        {
                            ReadOut.Text = MyNumber + ".";      //如果输入框中此时为“0.”,则在输入数字的后面加上小数点,如此时输入,则显示“.”
                        }
                        Else   
                        {
                            ReadOut.Text = ReadOut.Text.Substring(0, ReadOut.Text.Length - 1) + MyNumber + ".";  //框中数据后面加上小数点
                        }
                    }
                }
                else
                {
                    ReadOut.Text = MyNumber + ".";     //点击过操作符之后,输入的数字后面仍然加个小数点(为了显示的一致性,即任何时候框中的数据都是*.)
                }
               // DecimalFlag = false;
                OperaterFlag = false;
            }
            private void sign_Click(object sender, EventArgs e)        //正负切换(+/-)
            {
                if (ReadOut.Text != "0.")          //此时框中的数值不为“0.”
                {
                    if (LastInput == "NUMS")       //上次输入的数为正数
                    {
                        LastInput = "NEG";             //把LastInput置为“NEG”,表明最后一次输入的数是负数
                        ReadOut.Text = "-" + ReadOut.Text;    //给文本框中的数值前添上“-”号
                    }
                    else if (LastInput == "NEG")     //如果上次输入为负数
                    {
                        LastInput = "NUMS";         //把LastInput置为“NUMS”,表明最后一次输入的数是正数
                        ReadOut.Text = ReadOut.Text.Substring(1, ReadOut.Text.Length - 1);  //把框中的数据最前面的符号去掉(重新变成正数)
                    }
                    else                     //正常情况下默认此时文本框中的数值是正数,点击+/-后,变成负数
                    {
                        LastInput = "NEG";
                        ReadOut.Text = "-" + ReadOut.Text;
                    } 
                }  
                else
                {
                    LastInput = "NUMS";      //为“0.”时的情况
                }
            }
            private void DecimalDot_Click(object sender, EventArgs e)      //小数点(.)
            {
                if (OperaterFlag == true)
                {
                    ReadOut.Text = "0.";
                }
                   DecimalFlag = true;
            }
            public void StandardizationShow(String s)                     //规范化显示
            {
                if (s.IndexOf(".") == -1)
                {
                    ReadOut.Text = s + "."; 
                }
                else
                {
                    ReadOut.Text=s;
                }
            }
            private void Number0_Click(object sender, EventArgs e)    //点击对应的数字键时调用方法
            {
                calculate(0);
            }
            private void Number1_Click(object sender, EventArgs e)
            {
                calculate(1);
            }
            private void Number2_Click(object sender, EventArgs e)
            {
                calculate(2);
            }
            private void Number3_Click(object sender, EventArgs e)
            {
                calculate(3);
            }
            private void Number4_Click(object sender, EventArgs e)
            {
                calculate(4);
            }
            private void Number5_Click(object sender, EventArgs e)
            {
                calculate(5);
            }
            private void Number6_Click(object sender, EventArgs e)
            {
                calculate(6);
            }
            private void Number7_Click(object sender, EventArgs e)
            {
                calculate(7);
            }
            private void Number8_Click(object sender, EventArgs e)
            {
                calculate(8);
            }
            private void Number9_Click(object sender, EventArgs e)
            {
                calculate(9);
            }
            public void OperatorCal(int MyOperator)                  //接收操作符
            {
                if(!OperaterFlag)             //判断以前是否单击过操作符,避免连击操作符错误
                {
                    NumOps = NumOps + 1;  
                }
      
                switch (NumOps)
                {
                    case 0:
                        OperaterFlag = true;
                        break;
                    case 1:
                        op1 = ReadOut.Text;
                        OperaterFlag = true;
                        break;
                    case 2:
                        op2 = ReadOut.Text;
                        switch (OpFlag)
                        {
                            case 1:
                                op1 = (Double.Parse(op1) + Double.Parse(op2)).ToString();  //加
                                break;
                            case 3:
                                op1 = (Double.Parse(op1) - Double.Parse(op2)).ToString();  //减
                                break;
                            case 2:
                                op1 = (Double.Parse(op1) * Double.Parse(op2)).ToString();//乘
                                break;
                            case 0:
                                if (Double.Parse(op2) == 0)                                //除
                                {
                                    MessageBox.Show("除数不能为", "计算器");
                                }
                                else
                                {
                                    try
                                    {
                                        op1 = (Double.Parse(op1) / Double.Parse(op2)).ToString();
                                    }
                                    catch (Exception e)
                                    {
                                        Console.WriteLine("Generic Exception Handler: {0}", e.ToString());
                                    }
                                }
                                break;
                            case 4:
                                op1 = op2;                        //等                                               
                                break;
                        }
                        TempReadout = op1;
                        this.StandardizationShow(TempReadout);
                        NumOps = 1;
                        break;
                }
                if(NumOps!=0)
                {
                    OpFlag = MyOperator;
                }
                OperaterFlag = true;
                DecimalFlag = false;                              
               // LastInput = "NUMS";
            }
            private void operator1_Click(object sender, EventArgs e)
            {
                OperatorCal(1);
            }
            private void operator3_Click(object sender, EventArgs e)
            {
                OperatorCal(3);
            }
            private void operator2_Click(object sender, EventArgs e)
            {
                OperatorCal(2);
            }