- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 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
语句的条件时,避免与 true
和 false 进行比较
——无论如何, 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 操作数计算机的想法。)
基本操作方法是:
currentValue
。操作数
。currentValue
设置为计算结果。每个步骤都应检查上一步是否已发生 - 确保指定了操作(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/
我目前正在尝试使用 ParaView Calculator-Filter 将给定的笛卡尔坐标 (x,y,z) 转换为球坐标 (r, theta, phi),其中 theta 是极角,phi 是方位角。
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有这个问题,我想显示如果0/0,输出是:“不能将0除以自身”。如何调整我的代码以便可以显示该输出?如果是这样,我应该使用什么代码才能实现我的目标? 下面是我的代码: #include using
我正在尝试创建一个也支持负数的计算器,并最终创建一个 lisp 风格的树。 我像这样定义词法分析器规则: INT :'-'? [0-9]+ ; LBRACKET : '('; RBRACKET :
我正在开发一个基本的 JavaScript 计算器,我也希望能够开始计算负数。现在,如果我在输入数字之前单击“-”,“-”将不会显示,因此我只能从正数开始。有人可以告诉我如何将其包含在我的代码中吗?
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
这是我第一次尝试 Java。该项目是一个计算器,它需要一个数字、一个运算符(operator)信号(+、-、*、/)和另一个数字来创建方程并给出其最终值,然后询问用户是否要重新启动程序另一个方程或不是
所以我写了这个脚本;它有点像我找到并拼凑起来的计算器的大杂烩。 KeyListener 来自 Java - oracle - .com 网站。顺便说一句,我对此非常陌生,不知道我在做什么。 我正在尝试
我正在尝试创建一个也支持负数的计算器,并最终创建一个 lisp 风格的树。 我像这样定义词法分析器规则: INT :'-'? [0-9]+ ; LBRACKET : '('; RBRACKET :
我正在开发一个基本的 JavaScript 计算器,我也希望能够开始计算负数。现在,如果我在输入数字之前单击“-”,“-”将不会显示,因此我只能从正数开始。有人可以告诉我如何将其包含在我的代码中吗?
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我开始在java中创建一个计算器,我试图循环遍历字符串输入,如果输入中有任何整数,则将它们添加到ArrayList calcOperands中。在 parseInput() 方法中,我使用 charA
我正忙着制作计算器,但不知怎的,整数没有被使用,我不知道为什么。我尝试修复它,但我不知道该怎么做。我使用带有事件的按钮来计算答案,也许有问题。这是我的代码:顺便说一句,我使用 Eclipse
我的主类中有这段代码。我的问题是,GPA 是用总分除以类(class)来计算的。它没有给我完整的号码。 EX,如果总数为 14,类(class)为 4,则为 3.5,我的代码只给我 3.0。有谁知道为
我需要创建一个可以加、减、乘、除、绝对值和舍入的计算器。这是我到目前为止所拥有的 import java.util.Scanner; public class Calculator { pub
我是一名 Java Noob,正在研究 GUI 计算器,但我刚刚来到这里..我已经有了按钮,我需要绑定(bind)这些数字并存储在运算符 ( + - */) 之间的某个位置以显示在我的 JTextAr
这是我的作业。但是,我无法让结果发挥作用。我希望它打印出来为: > 2*7*6 2 * 7 ---- 14 * 6 ---- 84 等等。我希望无论我输入多少个数字,代码都能正常工作
这个问题已经有答案了: What does a "Cannot find symbol" or "Cannot resolve symbol" error mean? (18 个回答) 已关闭 6 年
大家好,感谢您帮助我。 我用 C# 制作了这个计算器,但遇到了一个问题。 当我添加像 5+5+5 这样的东西时,它给了我正确的结果,但是当我想减去两个以上的数字并且还想除或乘以两个以上的数字时,我没有
我一直在开发计算器作为自己的学习项目。它工作正常,只是我无法弄清楚如何阻止人们添加应用程序破坏输入,例如 1++-*/4。我尝试了各种方法,例如将当前显示拆分为一个数组,并将其与具有所有运算符的另一个
我是一名优秀的程序员,十分优秀!