0

我被分配了这个家庭作业,我一直很难做到。表格已经写好了,我们必须写课程。目前,当我运行程序时,我的等号按钮似乎不起作用。我不确定为什么,我想知道是否有人可以帮助我了解我所缺少的。我相信我已经正确地写了我的课。在我的脑海中,计算器正在调用“currentValue”,所以我不断更新我在运算符中使用的方法。

我在正确的方向吗?

为什么我的等号按钮不调用当前值。上次我运行这个时,如果我输入 9 + 3 +,那么我的显示屏将填充 12 并等待我输入下一个数字。所以理论上为什么我的等号按钮不能加载答案?我相信我正在调用正确的项目,但我不断收到我的初始条目。例如,如果我输入 9 + 9 并点击 =,我会一直得到 9。

这是计算器代码(提供的部分):

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

namespace Calculator
{
public partial class frmCalculator : Form
{
    public frmCalculator()
    {
        InitializeComponent();
    }

    // The following fields are used to store the value that's currently
    // displayed by the calculator. displayString is a string value that's
    // constructed as the user clicks numeric keys and the decimal and +/-
    // key. The Convert.ToDecimal method is then used to convert this to a decimal
    // field that's stored in displayValue.
    private string displayString;
    private decimal displayValue;

    // The following bool fields are used to control numeric entry.
    // newValue indicates whether the calculator is ready to receive a
    // new numeric value. Once the user clicks a digit button, newValue is
    // set to false. When the user clicks a button that "enters" the value, 
    // such as Add or Equals, newValue is set to true so the user can enter 
    // another value.
    // decimalEntered is used to restrict the entry to a single decimal point.
    // It is set to true whenever newValue is set to true, and it is set to 
    // false whenever the user clicks the decimal point button.
    private bool newValue;
    private bool decimalEntered;

    private Calculator calc = new Calculator();

    private void Form1_Load(object sender, System.EventArgs e)
    {
        displayValue = 0;
        displayString = displayValue.ToString();
        newValue = true;
        decimalEntered = false;
    }

    // This method handles the 0 through 9 keys, appending the digit clicked
    // to the displayString field. 
    private void btnNumber_Click(object sender, System.EventArgs e)
    {
        if (newValue)
        {
            displayString = "";
            newValue = false;
        }
        displayString += ((Button)sender).Tag.ToString();
        displayValue = Convert.ToDecimal(displayString);
        txtDisplay.Text = displayValue.ToString();
    }

    // This method removes the last character from the displayString field.
    private void btnBackSpace_Click(object sender, System.EventArgs e)
    {
        if (displayString.Length > 1)
        {
            displayString = displayString.Substring(0, displayString.Length - 1);
            displayValue = Convert.ToDecimal(displayString);
            txtDisplay.Text = displayValue.ToString();
        }
        else
        {
            displayString = "";
            displayValue = 0;
            txtDisplay.Text = displayValue.ToString();
        }

    }

    private void btnClear_Click(object sender, System.EventArgs e)
    {
        calc.Clear();
        displayString = "";
        displayValue = 0;
        txtDisplay.Text = displayValue.ToString();
        newValue = true;
        decimalEntered = false;
    }

    // This method appends a decimal point to the displayString field if the
    // user has not already entered a decimal point.
    private void btnDecimal_Click(object sender, System.EventArgs e)
    {
        if (newValue)
        {
            displayString = "0";
            newValue = false;
        }
        if (!decimalEntered)
        {
            displayString += ".";
            displayValue = Convert.ToDecimal(displayString);
            txtDisplay.Text = displayValue.ToString();
            decimalEntered = true;
        }
    }

    private void btnSign_Click(object sender, System.EventArgs e)
    {
        displayValue = -displayValue;
        txtDisplay.Text = displayValue.ToString();
    }

    private void btnAdd_Click(object sender, System.EventArgs e)
    {
        calc.Add(displayValue);
        newValue = true;
        decimalEntered = false;
        displayValue = calc.CurrentValue;
        txtDisplay.Text = displayValue.ToString();
    }

    private void btnSubtract_Click(object sender, System.EventArgs e)
    {
        calc.Subtract(displayValue);
        newValue = true;
        decimalEntered = false;
        displayValue = calc.CurrentValue;
        txtDisplay.Text = displayValue.ToString();
    }

    private void btnMultiply_Click(object sender, System.EventArgs e)
    {
        calc.Multiply(displayValue);
        newValue = true;
        decimalEntered = false;
        displayValue = calc.CurrentValue;
        txtDisplay.Text = displayValue.ToString();
    }

    private void btnDivide_Click(object sender, System.EventArgs e)
    {
        calc.Divide(displayValue);
        newValue = true;
        decimalEntered = false;
        displayValue = calc.CurrentValue;
        txtDisplay.Text = displayValue.ToString();
    }

    private void btnSqrt_Click(object sender, System.EventArgs e)
    {
        calc.SquareRoot(displayValue);
        displayValue = calc.CurrentValue;
        txtDisplay.Text = displayValue.ToString();
    }

    private void btnReciprocal_Click(object sender, System.EventArgs e)
    {
        try
        {
            calc.Reciprocal(displayValue);
            displayValue = calc.CurrentValue;
            txtDisplay.Text = displayValue.ToString();
        }
        catch (DivideByZeroException)
        {
            displayValue = 0;
            txtDisplay.Text = "Cannot divide by zero.";
            newValue = true;
            decimalEntered = false;
        }
    }

    private void btnEquals_Click(object sender, System.EventArgs e)
    {
        try
        {
            if (newValue)
                calc.Equals();
            else
                calc.Equals(displayValue);
            displayValue = calc.CurrentValue;
            txtDisplay.Text = displayValue.ToString();
            newValue = true;
            decimalEntered = false;
        }
        catch (DivideByZeroException)
        {
            displayValue = 0;
            txtDisplay.Text = "Cannot divide by zero.";
            newValue = true;
            decimalEntered = false;
        }
    }

}

}

这是我的课(我写的部分):

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

namespace Calculator
{
public class Calculator
{

    public Decimal displayValue;
    public Decimal currentValue;

     public void Add(Decimal displayValue)
    {

        currentValue += displayValue;

    }

     public void Subtract(Decimal displayValue)
     {
         currentValue -= displayValue;
     }

     public void Multiply(Decimal displayValue)
     {
         currentValue *= displayValue;
     }


     public void Divide(Decimal displayValue)
     {
         currentValue /= displayValue;
     }

     public void SquareRoot(Decimal displayValue)
     {
         currentValue = (decimal)Math.Sqrt(Convert.ToDouble(displayValue));
     }

     public void Reciprocal(Decimal displayValue)
     {
         currentValue = 1 / displayValue;
     }

     public decimal Equals()
     {
         return currentValue;
     }


     public void Clear()
     {
         currentValue = 0;
         displayValue = 0;
     }

     public decimal CurrentValue
     {
       get
          {
           return currentValue;
          }

     }
}

}

4

4 回答 4

1

在主代码中,您调用了 Equal() 方法,如下所示:

if (newValue)
    calc.Equals();
else
    calc.Equals(displayValue); //Your class do not have this.

所以,你应该先这样做

//I am not sure why you need to pass in the displayValue parameter, so I presume it would not return anything.
public void Equal(Decimal displayValue)
{
        //Do the things you suppose to do
}

对于您的 9 + 9 = 9 问题,这仅仅是因为在您的代码中,您只需按一次单击事件 Add_Button 。Add()在你的方法上做一个断点。然后尝试这样做:

9 --> 按您的 Add_Button --> 9 --> 按您的 Add_Button --> 检查您的 currentValue

于 2013-11-14T01:47:45.073 回答
0

The main problem I see with your code is that you are only adding one of your operands, So for example 8 + 8 will always equal 8 for example.You have to do something like this ( included Add and reciprocal functions only):

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

namespace Calculator
{
public class Calculator
{

    public Decimal displayValue;
    public Decimal currentValue;

    private Decimal Operand_1;
    private Decimal Operand_2;

    private bool Operand_1_Added = false;
    private bool Operand_2_Added = false;

    private string Operation = "";

   private void AddOperand(Decimal Operand)
    {
            if(Operand_1_Added) 
                {
                  Operand_2 = Operand;
                  Operand_2_Added = true;
                }
            else {
                  Operand_1 = Operand;
                  Operand_1_Added = true;
                  currentValue = Operand_1;
                 }
     }



   public void Add(Decimal Arg1)
    {  
        this.AddOperand(Arg1);
        Operation = "Addition";
    }

   public void Reciprocal(Decimal Arg)
    {
     this.AddOperand(Arg);
     Operation = "Reciprocal";
    }


     public void Clear()
     {
         currentValue = 0;
         displayValue = 0;
         Operand_1 = 0;
         Operand_2 = 0;
     }

     public void Equals()
      {
         switch(Operation)
             {
                 case "Addition": 
                          currentValue = Operand_1 + Operand_2;
                          break;
                 case "Reciprocal":
                          currentValue = 1/Operand_1;
                          break;
                 default: break; 
              }
      }

   public void Equal(Decimal displayValue)
   {
    currentValue = displayValue;
   }
     public decimal CurrentValue
     {
       get
          {
           return currentValue;
          }

     }
}

Haven't tested code but this should work with the form class.

于 2013-11-14T02:31:53.853 回答
0

displayValue既是类字段又是方法参数。这是你的意图吗?当您分配给 field 参数时,您需要 makethis.displayValue = ...以明确您在做什么。当前,您正在覆盖参数的本地副本,并且字段值始终为 0。

只需删除decimal displayValue;声明(并从Clear()函数中删除),然后将 displayValue 存储在表单中的类之外。

public class Calculator
{

    //public Decimal displayValue;
    public Decimal currentValue;

    public void Add(Decimal displayValue)
    {

        currentValue+=displayValue;

    }
    ...
    public void Clear()
    {
        currentValue=0;
        //displayValue=0;
    }

    public decimal CurrentValue
    {
        get { return currentValue; }

    }
}

class Program
{
    static void Main(string[] args)
    {
        Calculator calc=new Calculator();
        calc.Add(1000m);
        calc.Divide(25m);
        calc.Subtract(8m);

        Console.WriteLine(calc.CurrentValue);
        // (1000/25)-8 = 32
    }
}
于 2013-11-14T01:01:08.303 回答
0

我们来看看需求:

“乘法结果的小数位数不应比第一个数字的结果多于第二个数字的结果。示例 55.5*89.68 = 4977.240”

基本算术中的乘法自然意味着无论如何默认情况下都会发生这种情况。例如。你永远不会将 XX 乘以 X.XX 并得到结果 X.XXXXXXX ...... - 这不可能发生。

因此格式化很容易 - 如果您需要明确格式化,则格式化为 num.ToString("#.#############") 允许一段时间的数字。

你还没有概述部门的任何要求,所以我无法发表评论。

顺便说一句 - 如果你说 x = 1 / 3 和 y = z * x,那么你会得到很多小数点后的数字,因为 x 是 .333333333... 开始。这在 AFAICT 的要求范围内。

于 2013-11-15T02:39:18.683 回答