当前位置:编程学习 > C#/ASP.NET >>

好难的计算器!!做了N个晚上也做不出来的计算器!!救命啊~~~~~~~~~~

Default.aspx:

<body>
    <form id="form1" runat="server">
    <div style="text-align: center">
        <br />
        <asp:Panel ID="Panel1" runat="server" Height="200px" Width="211px" ForeColor="Black" BackColor="#FFFF80">
            <br />
            计算器<br />
            <br />
            <asp:TextBox ID="TextBox1" runat="server" Width="139px" Height="23px" style="text-align:right" >0</asp:TextBox><br />
            <br />
            <asp:Button ID="Button1" runat="server" Text="C" Height="35px" Width="73px" OnClick="Button1_Click" />
            <asp:Button ID="Button2" runat="server" Text="+/-" Height="35px" Width="35px" OnClick="Button2_Click" />
            <asp:Button ID="Button4" runat="server" Text="+" Height="35px" Width="35px" OnClick="Button4_Click"  /><br />
            <asp:Button ID="Button5" runat="server" Text="7" Height="35px" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button6" runat="server" Text="8" Height="35px" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button7" runat="server" Text="9" Height="35px" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button8" runat="server" Text="-" Height="35px" Width="35px" OnClick="Button8_Click" /><br />
            <asp:Button ID="Button9" runat="server" Text="4" Height="35px" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button10" runat="server" Text="5" Height="35px" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button11" runat="server" Text="6" Height="35px" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button12" runat="server" Text="*" Height="35px" Width="35px" OnClick="Button12_Click"  /><br />
            <asp:Button ID="Button13" runat="server" Text="1" Height="35px" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button14" runat="server" Text="2" Height="35px" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button15" runat="server" Height="35px" Text="3" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button16" runat="server" Height="35px" Text="/" Width="35px" OnClick="Button16_Click"/><br />
            <asp:Button ID="Button17" runat="server" Text="0" Height="35px" Width="35px" OnClick="Button13_Click" />
            <asp:Button ID="Button18" runat="server" Height="35px" Text="." Width="35px" OnClick="Button18_Click" />
            <asp:Button ID="Button19" runat="server" Text="=" Height="35px" Width="73px" OnClick="Button19_Click"  />
            <br />
            <br />
        </asp:Panel>
         </div>
    </form>
</body>



Default.aspx.cs

public partial class _Default : System.Web.UI.Page
{
    static string sOper = "";
    static double dblA, dblB;
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button13_Click(object sender, EventArgs e)
    {
        Button B1 = (Button)sender;
        if (this.TextBox1.Text != "0")
            this.TextBox1.Text += B1.Text;
        else
            this.TextBox1.Text = B1.Text;
    }
    
    protected void Button1_Click(object sender, EventArgs e)  //清除
    {
        this.TextBox1.Text = "0";
    }

    protected void Button18_Click(object sender, EventArgs e)  //小数点
    {
        int n = TextBox1.Text.IndexOf(".");
        if (n == -1)  //如果没有小数点,增加小数点,防止多次输入小数点 
            TextBox1.Text += ".";
    }

    protected void Button2_Click(object sender, EventArgs e)  //正负号
    {
        this.TextBox1.Text = Convert.ToString(double.Parse(this.TextBox1.Text) * -1);
    }


    protected void Button4_Click(object sender, EventArgs e)
    {
        dblA = Convert.ToDouble(this.TextBox1.Text);
        sOper = "+";
        this.TextBox1.Text = "";
    }
    protected void Button8_Click(object sender, EventArgs e)
    {
        dblA = Convert.ToDouble(this.TextBox1.Text);
        sOper = "-";
        this.TextBox1.Text = "";
    }
    protected void Button12_Click(object sender, EventArgs e)
    {
        dblA = Convert.ToDouble(this.TextBox1.Text);
        sOper = "*";
        this.TextBox1.Text = "";
    }
    protected void Button16_Click(object sender, EventArgs e)
    {
        dblA = Convert.ToDouble(this.TextBox1.Text);
        sOper = "/";
        this.TextBox1.Text = "";
    }
    protected void Button19_Click(object sender, EventArgs e)
    {
        dblB = Convert.ToDouble(this.TextBox1.Text);
        switch (sOper)
        {
            case "+": dblA += dblB; break;
            case "-": dblA -= dblB; break;
            case "*": dblA *= dblB; break;
            case "/":
                if (dblB != 0)
                     dblA /= dblB; break;
        }
        this.TextBox1.Text =Convert .ToString(dblA );
        dblB =dblA ;//将计算结果赋给易做图作数,以便执行第二次操作
    }
}



点击两下那些运算符号~
就出错了~!!
错在哪啊??
怎么改啊??

还有~按了数字再按运算符号~
TextBox就清空~!!
怎样才不清空啊??

麻烦各位指教了~~~~~~~~~~~~~~~~ --------------------编程问答-------------------- --------------------编程问答--------------------
引用 1 楼 bancxc 的回复:
帮顶了


谢谢~ --------------------编程问答-------------------- public class Operation 
    { 
        private double _numberA = 0; 
        private double _numberB = 0; 
        public double NumberA 
        { 
            get 
            { 
                return _numberA; 
            } 
            set 
            { 
                _numberA = value; 
            } 
        } 
        public double NumberB 
        { 
            get 
            { 
                return _numberB; 
            } 
            set 
            { 
                _numberB = value; 
            } 
        } 
        public virtual double GetResult() 
        { 
            double result = 0; 
            return result; 
        } 
        public static string checkNumberInput(string currentNumber, string inputString) 
        { 
            string result = ""; 
            if (inputString == ".") 
            { 
                if (currentNumber.IndexOf(".") < 0) 
                { 
                    if (currentNumber.Length == 0) 
                        result = "0" + inputString; 
                    else 
                        result = currentNumber + inputString; 
                } 
            } 
            else if (currentNumber == "0") 
            { 
                result = inputString; 
            } 
            else 
            { 
                result = currentNumber + inputString; 
            } 

            return result; 
        } 


    } 
    class OperationAdd : Operation 
    { 
        public override double GetResult() 
        { 
            double result = 0; 
            result = NumberA + NumberB; 
            return result; 
        } 
    } 
    class OperationSub : Operation 
    { 
        public override double GetResult() 
        { 
            double result = 0; 
            result = NumberA - NumberB; 
            return result; 
        } 
    } 
    class OperationMul : Operation 
    { 
        public override double GetResult() 
        { 
            double result = 0; 
            result = NumberA * NumberB; 
            return result; 
        } 
    } 
    class OperationDiv : Operation 
    { 
        public override double GetResult() 
        { 
            double result = 0; 
            if (NumberB == 0) 
                throw new Exception("除数不能为0。"); 
            result = NumberA / NumberB; 
            return result; 
        } 
    } 
    class OperationSqr : Operation 
    { 
        public override double GetResult() 
        { 
            double result = 0; 
            result = NumberB * NumberB; 
            return result; 
        } 
    } 
    class OperationSqrt : Operation 
    { 
        public override double GetResult() 
        { 
            double result = 0; 
            if (NumberB < 0) 
                throw new Exception("负数不能开平方根。"); 
            result = Math.Sqrt(NumberB); 
            return result; 
        } 
    } 
    class OperationReverse : Operation 
    { 
        public override double GetResult() 
        { 
            double result = 0; 
            result = -NumberB; 
            return result; 
        } 
    } 
public class OperationFactory 

    public static Operation createOperate(string operate) 
    { 
        Operation oper = null; 
        switch (operate) 
        { 
            case "+": 
                { 
                    oper = new OperationAdd(); 
                    break; 
                } 
            case "-": 
                { 
                    oper = new OperationSub(); 
                    break; 
                } 
            case "*": 
                { 
                    oper = new OperationMul(); 
                    break; 
                } 
            case "/": 
                { 
                    oper = new OperationDiv(); 
                    break; 
                } 
            case "sqr": 
                { 
                    oper = new OperationSqr(); 
                    break; 
                } 
            case "sqrt": 
                { 
                    oper = new OperationSqrt(); 
                    break; 
                } 
            case "+/-": 
                { 
                    oper = new OperationReverse(); 
                    break; 
                } 
        } 

        return oper; 
    } 


  private void buttonAdd_Click(object sender, EventArgs e) 
        { 
            if (txtShow.Text != "") 
            { 
                oper = OperationFactory.createOperate(((Button)sender).Text); 
                
                oper.NumberA = Convert.ToDouble(txtShow.Text); 
                
                bOperate = true; 
            } 
        } 
private void buttonEqual_Click(object sender, EventArgs e) 
        { 
            if (txtShow.Text != "") 
            { 
                if (((Button)sender).Text != "=") 
                { 
                    oper = OperationFactory.createOperate(((Button)sender).Text); 
                } 
                oper.NumberB = Convert.ToDouble(txtShow.Text); 
                txtShow.Text = oper.GetResult().ToString(); 
                bOperate = true; 
            } 
        }
http://topic.csdn.net/u/20090928/21/a476920f-49aa-4975-a1cd-2d6fc806698f.html --------------------编程问答-------------------- 1、你点第一运算符没错是因为你有个默认值0,第一点完textBox被清空,第二点击 

你执行了  ,空字符是不能进行数据转换的
 dblA = Convert.ToDouble(this.TextBox1.Text);


2、你没点完一次Button 执行了下面那段代码,数据能不被清空吗?
  this.TextBox1.Text = "";
--------------------编程问答--------------------
引用 4 楼 poorchild 的回复:
1、你点第一运算符没错是因为你有个默认值0,第一点完textBox被清空,第二点击

你执行了  ,空字符是不能进行数据转换的
C# code dblA= Convert.ToDouble(this.TextBox1.Text);

2、你没点完一次Button 执行了下面那段代码,数据能不被清空吗?
C# codethis.TextBox1.Text="";



如果无默认值,正负号就出错了。。。。 --------------------编程问答--------------------  慢慢研究3楼的 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 研究3楼当中~~
可是我很菜。。。。。。。。 --------------------编程问答-------------------- 点了运算符后为什么要清空数据呀??
那样你第二次点的话,,再转化为空肯定就会报错了!~~
我觉得点击加减之类的运算符,只要用一个变量记住运算符就行了,没有必要清空数据!~~

点数据的时候判断运算符是什么,执行操作,并清空存储运算符的变量!~~ --------------------编程问答-------------------- 还是做不出来..................... --------------------编程问答-------------------- 谁来帮帮我啊~~~~~~~~~~~~~~ --------------------编程问答-------------------- 运算符号点击两下就出错.......
如何解决啊...???
能在我原有的基础上改进吗??
太复杂我不懂.......... --------------------编程问答-------------------- 这个我记得有源码的。 --------------------编程问答--------------------
引用 13 楼 jxyxhz 的回复:
这个我记得有源码的。


哪里啊? --------------------编程问答-------------------- 计算器C#全代码

我搜索的,我自己以前就看过c#的计算器源代码 --------------------编程问答-------------------- 窗体的??

我要网页的........ --------------------编程问答-------------------- up --------------------编程问答--------------------
引用 16 楼 iorokk 的回复:
窗体的??

我要网页的........


有区别? --------------------编程问答--------------------
引用 18 楼 jxyxhz 的回复:
引用 16 楼 iorokk 的回复:
窗体的??

我要网页的........


有区别?


有啊.......... --------------------编程问答-------------------- 唉~
5........... --------------------编程问答--------------------

   protected void Button12_Click(object sender, EventArgs e)
    {
        dblA = Convert.ToDouble(this.TextBox1.Text);
        sOper = "*";
        this.TextBox1.Text = "";
    }


点乘号,,点了一次后this.TextBox1.Text = "";清空
然后还点一次乘号。
注意:dblA = Convert.ToDouble(this.TextBox1.Text); 这句错了,
因为此时    this.TextBox1.Text 为空  

需要进行判断是否可以转化为double
--------------------编程问答--------------------


    static string sOper = "";
    static string Oper2 = "";//存放第二个操作数
    static double dblA, dblB;
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button13_Click(object sender, EventArgs e)
    {
        Button B1 = (Button)sender;
        if (sOper != "")
        {
            this.TextBox1.Text = "";
            Oper2 += B1.Text;
            this.TextBox1.Text += Oper2;
        }
        else
        {
            if (this.TextBox1.Text != "0")
                this.TextBox1.Text += B1.Text;
            else
                this.TextBox1.Text = B1.Text;
        }

    }

    protected void Button1_Click(object sender, EventArgs e)  //清除 
    {
        this.TextBox1.Text = "0";
    }

    protected void Button18_Click(object sender, EventArgs e)  //小数点 
    {
        int n = TextBox1.Text.IndexOf(".");
        if (n == -1)  //如果没有小数点,增加小数点,防止多次输入小数点 
            TextBox1.Text += ".";
    }

    protected void Button2_Click(object sender, EventArgs e)  //正负号 
    {
        this.TextBox1.Text = Convert.ToString(double.Parse(this.TextBox1.Text) * -1);
    }


    protected void Button4_Click(object sender, EventArgs e)
    {
        dblA = Convert.ToDouble(this.TextBox1.Text);
        sOper = "+";

    }
    protected void Button8_Click(object sender, EventArgs e)
    {
        dblA = Convert.ToDouble(this.TextBox1.Text);
        sOper = "-";

    }
    protected void Button12_Click(object sender, EventArgs e)
    {
        if (this.TextBox1.Text != "")
        {
            dblA = Convert.ToDouble(this.TextBox1.Text);
            sOper = "*";

        }

    }
    protected void Button16_Click(object sender, EventArgs e)
    {
        dblA = Convert.ToDouble(this.TextBox1.Text);
        sOper = "/";

    }
    protected void Button19_Click(object sender, EventArgs e)
    {
        if (sOper != "")
        {
            dblB = Convert.ToDouble(Oper2);
            switch (sOper)
            {
                case "+": dblA += dblB; break;
                case "-": dblA -= dblB; break;
                case "*": dblA *= dblB; break;
                case "/":
                    if (dblB != 0)
                        dblA /= dblB; break;
            }
            this.TextBox1.Text = Convert.ToString(dblA);
            dblB = dblA;//将计算结果赋给易做图作数,以便执行第二次操作 
            Oper2 = "";
            sOper = "";
        }
    }

    protected void TextBox1_TextChanged(object sender, EventArgs e)
    {
        TextBox tb = (TextBox)sender;

    }


在你的代码上修改的,技术简陋,基本解决你说的问题 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 我也在做,一开始做个简单的 --------------------编程问答-------------------- 如果只想用JS实现可以直接用eval(),C#也可以使用js的eval --------------------编程问答--------------------
引用 19 楼 iorokk 的回复:
引用 18 楼 jxyxhz 的回复:
引用 16 楼 iorokk 的回复:
窗体的??

我要网页的........


有区别?


有啊..........

木有区别的, --------------------编程问答--------------------

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
  <title>无标题页</title>
</head>
<body>
  <form id="form1" runat="server">
  <div style="text-align: center">
  <br />
  <asp:Panel ID="Panel1" runat="server" Height="200px" Width="211px" ForeColor="Black" BackColor="#FFFF80">
  <br />
  计算器<br />
  <br />
  <asp:TextBox ID="txtResult" runat="server" Width="139px" Height="23px" style="text-align:right" >0</asp:TextBox><br />
  <br />
  <asp:Button ID="Button1" runat="server" Text="C" Height="35px" Width="73px" OnClick="Button1_Click" />
  <asp:Button ID="Button2" runat="server" Text="+/-" Height="35px" Width="35px" 
          OnClick="Button2_Click" />
  <asp:Button ID="Button4" runat="server" Text="+" Height="35px" Width="35px" OnClick="Opar_Click" /><br />
  <asp:Button ID="Button5" runat="server" Text="7" Height="35px" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button6" runat="server" Text="8" Height="35px" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button7" runat="server" Text="9" Height="35px" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button8" runat="server" Text="-" Height="35px" Width="35px" OnClick="Opar_Click" /><br />
  <asp:Button ID="Button9" runat="server" Text="4" Height="35px" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button10" runat="server" Text="5" Height="35px" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button11" runat="server" Text="6" Height="35px" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button12" runat="server" Text="*" Height="35px" Width="35px" OnClick="Opar_Click" /><br />
  <asp:Button ID="Button13" runat="server" Text="1" Height="35px" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button14" runat="server" Text="2" Height="35px" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button15" runat="server" Height="35px" Text="3" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button16" runat="server" Height="35px" Text="/" Width="35px" OnClick="Opar_Click"/><br />
  <asp:Button ID="Button17" runat="server" Text="0" Height="35px" Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button18" runat="server" Height="35px" Text="." Width="35px" OnClick="btnNumber_Click" />
  <asp:Button ID="Button19" runat="server" Text="=" Height="35px" Width="73px" OnClick="Opar_Click" />
  <br />
  <br />
  </asp:Panel>
   </div>
  </form>
</body>
</html>



using System;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{

    static private double prepValue = 0;//前一次值
    static private bool bAppend = true;//用户按的数字是否连接在显示的数字后面
    static private string prepOpar = "";//前一次的操作符号

    //置0
    protected void Button1_Click(object sender, EventArgs e)
    {
        txtResult.Text = "0";
        prepOpar = "";
        bAppend = true;
        prepValue = 0;
    }
    //处理数字键和“.”
    protected void btnNumber_Click(object sender, EventArgs e)
    {
        string strNum = ((Button)sender).Text;
        if (bAppend)
        {
            if (strNum == ".")
            {
                txtResult.Text += ".";
                return;
            }
            txtResult.Text = double.Parse(txtResult.Text + strNum).ToString();
        }
        else
        {
            txtResult.Text = strNum;
            bAppend = true;
        }
    }

    //处理+-*/
    protected void Opar_Click(object sender, EventArgs e)
    {

        if (txtResult.Text == "")
        {
            return;
        }
        double nCurValue = double.Parse(txtResult.Text); ;
        switch (prepOpar)
        {
            case "+":
                nCurValue += prepValue;
                break;
            case "-":
                nCurValue = prepValue - nCurValue;
                break;
            case "*":
                nCurValue *= prepValue;
                break;
            case "/":
                nCurValue = prepValue / nCurValue;
                break;
            default:
                break;
        }
        prepOpar = ((Button)sender).Text;
        bAppend = false;
        txtResult.Text = nCurValue.ToString();
        prepValue = nCurValue;
    }

    //正负转换
    protected void Button2_Click(object sender, EventArgs e)
    {
        txtResult.Text = (double.Parse(this.txtResult.Text) * -1).ToString();
    }
}

--------------------编程问答-------------------- 厉害 偶没有搞过
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,