【问题标题】:Need Help Making a Calculator That Can Perform Multiple Operations需要帮助制作可以执行多种运算的计算器
【发布时间】:2016-11-01 19:50:21
【问题描述】:

我已经注意到这个问题之前提出了一些时间,但是我似乎找不到任何真正帮助我的问题。我目前正在尝试让我的计算器执行加法、减法、乘法和除法,但无法弄清楚如何执行不同的操作。

编辑:我已经弄清楚如何为每个操作执行此操作,除了添加操作。出于某种原因,我收到一条错误消息,显示为“无法从 Add 转换为 BinaryOperator”。 add 的代码和其他操作符一样,我不明白为什么只有这个操作符会触发错误。

package part2.code;

import part1.operations.Add;
import part2.user_interface.CalculatorUI;
import part2.operations.Sub;
import part2.operations.Multiply;
import part2.operations.Divide;
import part2.operations.BinaryOperation;

public class Calculator {


// The current value of the calculator
    private int _value;
    private int _left;
    private int _right;
    private BinaryOperation _op;
    private Add _aop;
    private Sub _sop;
    private Multiply _mop;
    private Divide _dop;


// The user interface via which a user interacts 
    private CalculatorUI _ui;

public Calculator(CalculatorUI calculatorUI) {
        _ui = calculatorUI;
        _value = 0;
        _left = 0;
        _right = 0;
        _aop = new Add();
        _sop = new Sub();
        _mop = new Multiply();
        _dop = new Divide();
    }

public void digitKeyPressed(int d) {
        _value = _value * 10 + d;
        _ui.updateDisplay();
    }

 public void clearKeyPressed() {
            _value = 0;
            _ui.updateDisplay();
        }

public void addKeyPressed() {
        _left = _value;
        _value = 0;
        _op = _aop;
    }

public void subtractKeyPressed() {
        _left = _value;
        _value = 0;
        _op = _sop;
    }

public void multiplyKeyPressed() {
        _left = _value;
        _value = 0;
        _op = _mop;
    }

public void divideKeyPressed() {
        _left = _value;
        _value = 0;
        _op = _dop;
    }

public void equalKeyPressed() {
        _right = _value;
        _value = _op.perform(_left,_right);
        _ui.updateDisplay();
    }

public int getValue() {
        return _value;
    }
}

这是计算器的代码,伴随着我的每个操作的文件看起来像这样:

package part2.operations;

public class Sub implements BinaryOperation {
    public Sub() {}

    @Override
    public int perform(int left, int right) {
            return left - right;
    }
}

将“Sub”替换为任一操作,并将返回语句替换为该操作的相应符号。还有一个 BinaryOperation 的文件:

package part2.operations;

public interface BinaryOperation {
    public int perform(int left, int arg);
}

【问题讨论】:

  • 将每个操作符映射到它对应的字符串表示并简单地进行相应的检索
  • 示例:在subtractKeyPressed 中,将_operation 设置为等于Sub 对象。然后当等于按下时,它使用Sub作为操作。
  • 我已经更新了我的代码并进行了更改。正如我在下面所说,我收到“无法从 Add 转换为 BinaryOperator”的错误。

标签: java calculator


【解决方案1】:

在您的fooKeyPressed() 中执行以下操作:

public void divideKeyPressed() {
    _left = _value;
    _value = 0;
    _op = _dop;
}

_op 的类型当然是`BinaryOperation。

查看Command 设计模式以进行泛化。

【讨论】:

  • 这样做给我留下了一个错误,我无法从 Divide 转换为 Sub?
  • 请在问题中编辑您的代码以显示这一点?你分配的成员变量不应该是Sub类型,它应该是BinaryOperation类型。
  • 我更新了问题中的代码,在您的示例中编辑了 addKeyPressed 而不是 Divide。
  • ` _aop = _op;` :你在倒退。您的代码需要记住按下的操作 (_op) 是“添加”(_aop)。然后,当您按“等于”时,代码将应用当前操作。
  • 我把它翻过来了,我得到了同样的错误。编辑:同样的错误我的意思是它告诉我我无法从 Add 转换为 BinaryOperation。
【解决方案2】:

我的错误源于我从 part1 导入 Add 操作和从 part2 导入 BinaryOperation。通过从第 2 部分导入,我修复了错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多