计算器,在所选运算符后键入第二个变量时清除 window

Calculator, clear window when second variable is typed after chosen operator

所以我有这个计算器http://gyazo.com/589156935eec141c3aedf83b9f960d29(声望不够抱歉)

当我输入 [1] 然后输入 [2] 时,显示屏显示 [12]

如果我按操作符,例如 [+],数字 12 仍应显示在显示屏上。

但是,如果我现在开始输入新数字,旧的数字应该从显示中删除。但我无法让它工作。

我的表格:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Miniräknare
{
    public partial class Form1 : Form
    {
        Miniräknare miniräknare;

        public Form1()
        {
            InitializeComponent();

            miniräknare = new Miniräknare(0, 0, "", 0, false);
        }

        private void btnEquals_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.doEquals();
        }

        private void btnNum1_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.getOperand("1", tbxWindow.Text);             
        }

        private void btnNum2_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.getOperand("2", tbxWindow.Text);
        }

        private void btnNum3_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.getOperand("3", tbxWindow.Text);
        }

        private void btnNum4_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.getOperand("4", tbxWindow.Text);

        }

        private void btnNum5_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.getOperand("5", tbxWindow.Text);
        }

        private void btnNum6_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.getOperand("6", tbxWindow.Text);
        }

        private void btnNum7_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.getOperand("7", tbxWindow.Text);
        }

        private void btnNum8_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.getOperand("8", tbxWindow.Text);
        }

        private void btnNum9_Click(object sender, EventArgs e)
        {

            tbxWindow.Text = miniräknare.getOperand("9", tbxWindow.Text);
        }

        private void btnNum0_Click(object sender, EventArgs e)
        {

            if (tbxWindow.Text != "") tbxWindow.Text = miniräknare.getOperand("0", tbxWindow.Text);

        }

        private void btnOperatorDivision_Click(object sender, EventArgs e)
        {

        }

        private void btnOperatorTimes_Click(object sender, EventArgs e)
        {

        }

        private void btnOperatorPlus_Click(object sender, EventArgs e)
        {
            miniräknare.Op = "+";




        }

        private void btnOperatorMinus_Click(object sender, EventArgs e)
        {
            miniräknare.Op = "-";
            miniräknare.Change = true;
        }        

        private void btnDecimal_Click(object sender, EventArgs e)
        {
            tbxWindow.Text = miniräknare.getOperand(",", tbxWindow.Text);
        }

        private void btnClear_Click(object sender, EventArgs e)
        {

        }

        private void btnSin_Click(object sender, EventArgs e)
        {

        }

        private void btnCos_Click(object sender, EventArgs e)
        {

        }

        private void btnTan_Click(object sender, EventArgs e)
        {

        }

        private void btnSquared_Click(object sender, EventArgs e)
        {

        }

        private void btnModulus_Click(object sender, EventArgs e)
        {

        }

        private void btnExponential_Click(object sender, EventArgs e)
        {

        }

        private void btnlogarithm_Click(object sender, EventArgs e)
        {

        }

        private void btn1OverX_Click(object sender, EventArgs e)
        {

        }

        private void btnLn_Click(object sender, EventArgs e)
        {

        }

        private void btnPi_Click(object sender, EventArgs e)
        {

        }

        private void btnMemoryClear_Click(object sender, EventArgs e)
        {

        }

        private void btnMemoryRecall_Click(object sender, EventArgs e)
        {

        }

        private void btnMemorySave_Click(object sender, EventArgs e)
        {

        }        
    }
}

我的class:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Miniräknare
{
    class Miniräknare
    {
        private double first;
        private double second;
        private string op; 
        private double memory; 
        private bool change;

        public Miniräknare(double first, double second, string op, double memory, bool change)
        {
            this.first = 0;
            this.second = 0;
            this.op = "";
            this.memory = 0;
            this.change = false;
        }

        public double First
        {
            get {return first; }
            set { first = value; }
        }

        public double Second
        {
            get { return second; }
            set { second = value; }
        }

        public string Op
        {
            get { return op; }
            set { op = value; }
        }

        public double Memory
        {
            get { return memory; }
            set { memory = value; }
        }

        public bool Change
        {
            get { return change; }
            set { change = value; }
        }

        public string getOperand(string t, string textBox)
        {
            textBox = textBox + t;
            if (t.Equals(","))
            {
                change = true;
                second = double.Parse(textBox);
            }
            else if (op.Equals(""))
            {
                if (!change)
                {
                    textBox = "";
                    change = true;
                    textBox = textBox + t;
                }
                first = double.Parse(textBox);
            }
            else
            {
                if (!change)
                {
                    textBox = "";
                    change = true;
                    textBox = textBox + t;
                }
                second = double.Parse(textBox);
            }
            return textBox;
        }

       /* public string calculateAnswer()
        {


        } */

        public string doEquals()
        {
            if (op == "-" ) return (first - second).ToString();





            else return null;



        }        
    }
}

在按下“+”按钮后的以下块中 "change" 为真,当键入第二个数字的第一个数字时跳过该块。

    else
    {
        if (!change)
        {
            textBox = "";
            change = true;
            textBox = textBox + t;
        }
        second = double.Parse(textBox);
    }

由于您在 getOperand 方法的开头分配了 textBox,因此它将 return 将屏幕上已有的值与新字符相结合的值。

public string getOperand(string t, string textBox)
{
    textBox = textBox + t;

这应该可以解决问题:

public string getOperand(string t, string textBox)
{


    if (t.Equals(","))
    {
        textBox = textBox + t;
        change = true;
        second = double.Parse(textBox);
    }
    else if (Op.Equals(""))
    {
        textBox = textBox + t;
        if (!change)
        {
            textBox = "";
            change = true;
            textBox = textBox + t;
        }
        first = double.Parse(textBox);
    }
    else
    {
        if (!change)
        {
            textBox = textBox + t;
        }
        else
        {
            textBox = t;
            change = false;
        }
        second = double.Parse(textBox);
    }
    return textBox;
}

我知道这不是 https://codereview.stackexchange.com/ and this does not answer the question asked (which has already been ),可能会被标记为题外话,但我想以有序的方式展示各种评论中建议的更改,只是为了帮助您改进编码 (当前和未来)经验。

可以对您的 Miniräknare class 进行更改(添加注释以进行解释):

public class Miniräknare
{
  public Miniräknare()
  {
    // Have a default constructor that sets all the default properties
    First = 0;
    Second = 0;
    Op = "";
    Memory = 0;
    Change = false;
  }

  public Miniräknare(double first, double second, string op, double memory, bool change)
  {
    // If you have a constructor with parameters, use the parameters to set your properties
    First = first;
    Second = second;
    Op = op;
    Memory = memory;
    Change = change;
  }

  // Use automatic properties, this improves readability and less confusion (As per D Stanley in comments)
  public double First { get; set; }
  public double Second { get; set; }
  public string Op { get; set; }
  public double Memory { get; set; }
  public bool Change { get; set; }

  public string getOperand(string t, string textBox)
  {
    // Apply changes as per the accepted answer
    textBox = textBox + t;
    if (t.Equals(","))
    {
      Change = true;
      Second = double.Parse(textBox);
    }
    else if (Op.Equals(""))
    {
      if (!Change)
      {
        textBox = "";
        Change = true;
        textBox = textBox + t;
      }
      First = double.Parse(textBox);
    }
    else
    {
      if (!Change)
      {
        textBox = "";
        Change = true;
        textBox = textBox + t;
      }
      Second = double.Parse(textBox);
    }
    return textBox;
  }

  public string doEquals()
  {
    if (Op == "-") return (First - Second).ToString();
    else return null;
  }
}

您的 Form1 变化:

现在像这样实例化您的 miniräknare 变量,因为您使用原始输入参数将它们设置为默认值。

miniräknare = new Miniräknare();

用这个单一事件处理程序替换所有 btnNum1_ClickbtnNum9_Click 事件处理程序,以提高代码的可读性和体积(检查代码中的其他注释):

private void btnNumber_Click(object sender, EventArgs e)
{
  // !! Remember !! to set the Tag value of each of your buttons to their corresponding values
  // Then change btnNum1 to btnNum9's Click events to btnNumber_Click
  // Additionally you can also just use ((Button)sender).Text if their text values will never change
  // You could even do this with your operators, unless you have specific code for the button (like you have for btnNum0)
  tbxWindow.Text = miniräknare.getOperand(((Button)sender).Tag as String, tbxWindow.Text);
}