gpt4 book ai didi

java - 第一个Java程序(计算器)问题

转载 作者:行者123 更新时间:2023-12-01 07:43:08 24 4
gpt4 key购买 nike

我正在学习 Java,我的第一个项目是一个计算器,但是我遇到了障碍。我试图让我的计算器让我输入一个数字,然后单击一个运算符(+、-、x、/),输入另一个数字,然后再次单击一个运算符,让显示更新并能够继续下去。

例如,我希望能够点击以下内容,并在每次点击第一个操作符后显示总数:

a + b / c - d =

我的代码(对我来说)似乎应该可以工作,但事实并非如此。我做错了什么?

以下是当您按下运算符时我使用的代码。默认情况下 wait 设置为 false。运行完该类一次后,value1 被存储,并且 wait 设置为 true,效果很好。从那里开始,它似乎不太正常:

class OperatorListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
String input = event.getActionCommand();

// Set display as string
String s = display.getText();

if (!wait) {
// Convert first input string to double
try {
value1 = Double.valueOf(s.trim()).doubleValue();
} catch (NumberFormatException nfe) {
System.out.println("NumberFormatException: " + nfe.getMessage());
}

dec = false;
} else {
// Convert second input string to double
try {
value2 = Double.valueOf(s.trim()).doubleValue();
} catch (NumberFormatException nfe) {
System.out.println("NumberFormatException: " + nfe.getMessage());
}

// Determine operation to be performed
if (operator == "add") {
value1 = Operators.add(value1, value2);
} else if (operator == "subtract") {
value1 = Operators.subtract(value1, value2);
} else if (operator == "multiply") {
value1 = Operators.multiply(value1, value2);
} else if (operator == "divide") {
value1 = Operators.divide(value1, value2);
}

// Convert final value to string and display
display.setText(Double.toString(value1));

dec = false;
}

// Determine operator hit
if (input.equals("+")) {
operator = "add";
} else if (input.equals("-")) {
operator = "subtract";
} else if (input.equals("x")) {
operator = "multiply";
} else if (input.equals("/")) {
operator = "divide";
}

// Set wait
wait = true;

}
}

编辑:更新了代码以修复一些困惑并更新 if 语句。即使在此之后,同样的问题仍然存在。此外,完整的源代码可用 here

最佳答案

一些建议。

首先,我建议在使用 boolean 作为 if 语句的条件时,避免与 truefalse 进行比较——无论如何, boolean 值只有两种状态。另外,由于只有两种状态,因此不必使用 else if (false),而是使用 else 就足够了:

if (condition == true)
{
// when condition is true
}
else if (condition == false)
{
// when condition is false
}

可以重写为:

if (condition)
{
// when condition is true
}
else
{
// when condition is false
}

其次,不要比较字符串文字 "add""subtract" 等,而是尝试使用常量(final 变量) ,或enum s。进行 String 比较,例如 (operator == "add") 正在执行检查以查看字符串文字 "add"operator 变量都引用同一个对象,而不是是否相同。因此,在某些情况下,您可能会将 operator 设置为 "add",但比较结果可能不是 true,因为字符串文字引用的是一个单独的对象。一个简单的解决方法是:

final String operatorAdd = "add";
// ...

if (input.equals("+"))
operator = operatorAdd;
// ...

if (operator == operatorAdd)
// ...

现在,operator的赋值和operator的比较都引用常量operatorAdd,因此比较可以使用== 而不是 equals() 方法。

第三,因为这似乎是一种计算器,实际上并不需要两个操作数(即 operand1 + operand2),而是需要一个作用于存储值的操作数(即 operand + currentValue),如果有一个保存当前值的变量,另一个保存运算符的变量,以及一个根据当前运算符和操作数执行操作的方法,可能会更容易。 (或多或少是 accumulator machine 或 1 操作数计算机的想法。)

基本操作方法是:

  1. 设置currentValue
  2. 设置运算符。
  3. 设置操作数
  4. 执行计算。
  5. currentValue 设置为计算结果。
  6. 将运算符设置为空白状态。

每个步骤都应检查上一步是否已发生 - 确保指定了操作(operator 设置为有效的运算符),然后输入的下一个值将成为操作数。计算器就像 state machine ,从一个步骤到另一个步骤必须按照一定的顺序执行,否则不会进行下一步。

所以,计算器可能是这样的(伪代码!):

// Initialize calculator (Step 1)
currentValue = 0;
operand = 0;
operator = operatorNone;

loop
{
operand = getOperand(); // Step 2
operator = getOperator(); // Step 3

// Step 4 and 5
if (operator == operatorAdd)
currentValue += operand;
if (operator == operatorSubtract)
currentValue -= operand;
// ...

// Step 6
operator = operatorNone;
}

虽然上面的代码使用单个循环并且不像基于事件的 GUI 模型那样工作,但它应该概述运行计算器所需的步骤。

关于java - 第一个Java程序(计算器)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/475584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com