C#计算器类

C#计算器类,c#,class,C#,Class,我被分配了这项家庭作业,这让我很难接受。表格已经写好了,我们必须写这堂课。当前,当我运行程序时,我的equals按钮似乎不起作用。我不知道为什么,我想知道是否有人能帮助我理解我所缺少的东西。我相信我写的课是正确的。在我的头脑中,计算器正在调用“currentValue”,所以我不断地用我在运算符中使用的方法更新 我的方向对吗 为什么我的equals按钮不调用当前值。上次我运行这个程序时,如果我键入9+3+,那么我的显示器将填充12,并等待我输入下一个数字。那么在理论上为什么我的equals按钮不

我被分配了这项家庭作业,这让我很难接受。表格已经写好了,我们必须写这堂课。当前,当我运行程序时,我的equals按钮似乎不起作用。我不知道为什么,我想知道是否有人能帮助我理解我所缺少的东西。我相信我写的课是正确的。在我的头脑中,计算器正在调用“currentValue”,所以我不断地用我在运算符中使用的方法更新

我的方向对吗

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

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

}

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


}

displayValue
既是类字段又是方法参数。这是你的意图吗?为字段参数赋值时,需要将
this.displayValue=…
设置为,以明确您正在执行的操作。当前正在覆盖参数的本地副本,字段值始终为0

只需删除
十进制显示值声明(以及从
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
    }
}

在主代码中,您调用了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问题,这仅仅是因为在代码中,只需按一下click event Add_按钮一次。在
Add()
方法处创建一个断点。然后试着这样做:

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

9-->按“添加”按钮-->9-->按“添加”按钮-->检查当前值

我看到您的代码存在的主要问题是您只添加了一个操作数,因此例如,8+8将始终等于8。您必须执行类似操作(仅包括“添加”和“倒数”函数):


尚未测试过代码,但这应该适用于表单类。

让我们看看需求:

“多重运算的结果显示的小数位数不应超过第一个数字的结果和第二个数字的结果。示例55.5*89.68=4977.240”

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

因此,格式化很容易——如果您需要显式格式化,那么将其格式化为num.ToString(“#.############”),这允许使用一组数字

你还没有对部门提出任何要求,所以我不能发表评论


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

使用ol“调试器进行此操作。”calc.Equals(displayValue);'我在您的类中没有看到任何
Equal()
方法包含此内容。你能编译它吗?@jhyap你是说要包含另一个equals方法吗?一个返回currentValue,一个返回displayValue?在类代码中,只有一个相等的方法。但在主代码中,您使用了“calc.Equals(displayValue)”。因此,我想您需要另一个相等的方法来接受“displayValue”参数。@jhyap-当我试图编写代码时,我得到一个错误,表示找不到类型或命名空间。这是因为我从页面顶部删除了声明吗?(根据下面的用户?)我试过了。。当我点击equals时,我仍然得到我的原始条目。。。9 + 3 = 9... 我的方法正确吗?这是一个windows窗体,因此OP不会在主方法中进行任何计算。@KillaKem我知道这一点。我刚刚演示了原始的
Calculate
类是如何错误的,以及如何修复它。@JeremyB如果您知道您的计算工作正常,那么您可以缩小按钮事件的问题范围。感谢您指出这一点。我仍在挣扎,但我认为它的意思是,如果用户没有输入一个新的号码,那么答案将是显示器。例如,如果你点击9=那么它应该只显示9。谢谢您捕捉到这个方法。@jhyap这就是为什么有一个公共void Equal(displayValue)方法。按“9”+“9”=”时,等号必须知道最后一个操作数操作,以便它可以再次执行该操作。因此,在操作数方法中,需要设置一个变量来跟踪最后一个操作。然后在equal(displayValue)方法中,需要执行一个开关(或链接if语句)来确定要再次执行哪个操作数方法。。所以我已经指出了无意中导致9+9=9的真正问题……是的……现在我仔细看,实际上还有更多的问题。add方法不能只接受currentValue+传递的参数。减法,例如,“9”-将按当前写入的方式将currentValue设置为-9。因此,减法方法应该检查前面调用的操作数方法(第一次为null),并基于此执行操作。并将调用的当前操作数设置为减法。教师创建了表单类。不需要编辑它。计算器类,如果设计正确,可以完全实现您在使用表单时的预期。您不应该太快否定帖子,声誉对于我们这些很少使用它的人来说很重要!我现在编辑了calculator类以使用原始表单。
//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
}
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;
          }

     }
}