1

Ok so I am going to try this again. I have a very basic calculator application. I am currently having trouble figuring out how to get my plus() and minus() methods to work. Whenever I run the code, the plus() method is adding currentValue + currentValue. I want it to act like a calculator and add two different integers together. Any suggestions?

digitButton(buttons, 0);
JButton plus = new JButton("+");
plus.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e)
  {
    myAccumulator.plus();
    updateDisplay();
  }
});
buttons.add(plus);
return buttons;

this is where it is getting called.

And this is my class that I wrote with my plus () method.

public class BasicAccumulator implements Accumulator {

    private int digit;
    private int currentValue;

    public void BasicAccumulator(int digit, int currentValue)
    {
        this.digit = digit;
        this.currentValue = currentValue;
    }

    public void addDigit(int digit)
    {
        currentValue = currentValue * 10 + digit;
    }

    public void plus()
    {
        if (currentValue != 0)
            digit = currentValue;
            currentValue = currentValue + digit;

    }

    public void minus()
    {
        currentValue = currentValue - digit;
    }

    public void clear()
    {
        currentValue = 0;
    }

    public int displayValue()
    {
        return currentValue;
    }

}
4

5 回答 5

7

想想看。在您按 + 时,您可能还没有输入第二个数字。也就是说,如果您的计算器旨在像大多数计算器一样工作......

大概你有以下事件序列..

  1. 输入数字:数字进入当前累加器以创建一个数字
  2. 按+:数字被存储起来
  3. 输入数字,数字累加为1
  4. 按=:当前累积的数字加到上一个。

为此,我从概念上将 3 件东西存储在累加器中:

  • 'left' 值(等式的左侧) - 即按下 + 后存储的数字
  • 当前操作 - 最初没有,但将设置为指示是 + 还是 - 的值。
  • 当前的累积值(我称之为“正确”)

所以......最初,left是零并且operation什么都不是(即“清除”)。

State: left(0), operation(empty), right(0)

输入一些数字......这些是在“正确”中建立的。

State: left(0), operation(empty), right(22)

按 +。现在,您将任何挂起的操作应用于left. 在这种情况下,操作为空,因此您只需复制该值并清除“正确”。然后将操作设置为“+”

State: left(22), operation(+), right(0)

您输入更多数字,再次建立right.

State: left(22), operation(+), right(20)

你再次点击+。现在应用该操作。您添加rightleft清除right.

State: left(42), operation(+), right(0)

等等等等……

于 2012-09-13T23:45:24.177 回答
1

至少看起来像是混乱的根源:

public void plus()
{
    if (currentValue != 0)
        digit = currentValue;
        currentValue = currentValue + digit;

}

当您添加支撑并修复缩进时,该代码实际上是:

public void plus()
{
    if (currentValue != 0)
    {
        digit = currentValue;
    }
    currentValue = currentValue + digit;
}

这真的是你的意图吗?似乎不太可能。如果您希望缩进会影响行为,则应将代码重写为:

public void plus()
{
    if (currentValue != 0)
    {
        digit = currentValue;
        currentValue = currentValue + digit;
    }
}

也不清楚为什么你首先想要这种行为。正如您上一个问题所要求的那样,如果您编写一个简短但完整的控制台应用程序来练习您的课程,以及预期行为与实际行为的陈述,那将非常有帮助。

于 2012-09-13T23:34:47.333 回答
1

digit在两个位置使用:作为成员和作为addDigit. 前者对我来说似乎没有多大意义。

大多数基本操作plus都需要两个数字才能处理。您要么必须将其中一个提供给函数调用,要么将它们都存储在您的类中。您可以将现有digit成员用于后者,但除非您只想添加个位数,否则我建议您不要使用该名称。

相反,请考虑您的操作顺序是什么。你输入两个数字,然后按操作按钮?如果是这样,您需要存储两个数字,例如valuecurrent。在重置为零之前,将附加数字current并且任何类似的操作plus都会添加。显示可能应该在每次操作之后反映,但在每个数字之后,因此您需要一些布尔标志来区分这两种情况。currentvaluecurrentvaluecurrent

如果输入一个数字,然后按操作按钮,然后输入另一个数字(中缀运算符),上面的大多数建议仍然适用,但除此之外,在读取第二个数字时,您需要一些方法来存储操作。您可以使用一些字符、字符串、数字或枚举常量来执行此操作。我个人会使用已经包含计算该操作的指令的枚举常量来执行此操作,但这是非常高级的语法。每次按下操作按钮都会评估先前存储的操作,然后存储新的操作,可能除了“=”。

于 2012-09-13T23:33:01.890 回答
0

在你的plus()你正在做

digit = currentValue;
currentValue = currentValue + digit;

对我来说看起来像

currentValue = currentValue + currentValue

你应该使用

currentValue = currentValue + digit;

只要

于 2012-09-13T23:33:14.677 回答
0

我建议做这样的事情。

int plus(int first, int second)
{
   return first + second;
}

这就是这里的问题:

digit = currentValue;
currentValue = currentValue + digit;

你设置数字等于 currentValue 所以它变成

currentValue = currentValue + currentValue;
于 2012-09-13T23:29:25.137 回答