无法确定如何让我的计算器正确计算
Trouble determining how to make my calculator calculate properly
这大概是你第n次收到关于计算器的菜鸟问题了,我就是想不通,搞了两三天。目前我构建计算器的方法还不够,我知道我必须在按下“=”按钮时开始计算,但我就是不知道该怎么做。由于这个原因,我已经恢复到我原来的计算器代码,当我按下一个不起作用的操作按钮(如“+”)时,它会计算,但我希望这能让我正确地构建它.这是代码:
package rekenmachine;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.*;
public class Rekenmachine extends JFrame
{
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setSize(300,500);
frame.setLocation(800,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Rekenmachine");
RekenPaneel rekenpaneel = new RekenPaneel();
frame.setContentPane(rekenpaneel);
frame.setVisible(true);
}
private static int getal, totaalGetal;
private boolean optellen, aftrekken, vermenigvuldigen, delen;
public int Optellen(int getal)
{
reset();
optellen = true;
totaalGetal += getal;
getal = 0;
return totaalGetal;
}
public int Aftrekken(int getal)
{
reset();
aftrekken = true;
totaalGetal -= getal;
getal = 0;
return totaalGetal;
}
public int Delen(int getal)
{
reset();
delen = true;
totaalGetal /= getal;
getal = 0;
return totaalGetal;
}
public int Vermenigvuldigen(int getal)
{
reset();
vermenigvuldigen = true;
totaalGetal *= getal;
getal = 0;
return totaalGetal;
}
public int getGetal()
{
return getal;
}
public int getTotaalGetal()
{
return totaalGetal;
}
public void reset()
{
optellen = false;
aftrekken = false;
delen = false;
vermenigvuldigen = false;
getal = 0;
totaalGetal = 0;
}
}
class RekenPaneel extends JPanel
{
JButton knop0, knop1, knop2, knop3, knop4, knop5, knop6, knop7, knop8, knop9,
knopOptel, knopAftrek, knopVermenigvuldigen, knopDelen, knopUitkomst,
knopWissen;
JTextField invoerVak;
JPanel textPaneel, knopPaneel, logoPaneel;
Rekenmachine rekenmachine;
public RekenPaneel()
{
rekenmachine = new Rekenmachine();
setLayout(new BorderLayout());
textPaneel = new JPanel();
knopPaneel = new JPanel();
logoPaneel = new JPanel();
textPaneel.setLayout(new FlowLayout());
knopPaneel.setLayout(new GridLayout(4,4));
logoPaneel.setLayout(new FlowLayout());
Border rand = BorderFactory.createEmptyBorder(10, 10, 10, 10);
knop0 = new JButton("0");
knop0.addActionListener(new knop0Handler());
knop1 = new JButton("1");
knop1.addActionListener(new knop1Handler());
knop2 = new JButton("2");
knop2.addActionListener(new knop2Handler());
knop3 = new JButton("3");
knop3.addActionListener(new knop3Handler());
knop4 = new JButton("4");
knop4.addActionListener(new knop4Handler());
knop5 = new JButton("5");
knop5.addActionListener(new knop5Handler());
knop6 = new JButton("6");
knop6.addActionListener(new knop6Handler());
knop7 = new JButton("7");
knop7.addActionListener(new knop7Handler());
knop8 = new JButton("8");
knop8.addActionListener(new knop8Handler());
knop9 = new JButton("9");
knop9.addActionListener(new knop9Handler());
knopOptel = new JButton("+");
knopOptel.addActionListener(new knopOptelHandler());
knopAftrek = new JButton("-");
knopAftrek.addActionListener(new knopAftrekHandler());
knopVermenigvuldigen = new JButton("*");
knopVermenigvuldigen.addActionListener(new knopVermenigvuldigenHandler());
knopDelen = new JButton("/");
knopDelen.addActionListener(new knopDelenHandler());
knopUitkomst = new JButton("=");
knopUitkomst.addActionListener(new knopUitkomstHandler());
knopWissen = new JButton("C");
knopWissen.addActionListener(new knopWissenHandler());
invoerVak = new JTextField(25);
invoerVak.setHorizontalAlignment(invoerVak.RIGHT);
invoerVak.setEditable(false);
invoerVak.setBackground(Color.WHITE);
textPaneel.add(invoerVak);
knopPaneel.add(knop7);
knopPaneel.add(knop8);
knopPaneel.add(knop9);
knopPaneel.add(knopDelen);
knopPaneel.add(knop4);
knopPaneel.add(knop5);
knopPaneel.add(knop6);
knopPaneel.add(knopVermenigvuldigen);
knopPaneel.add(knop1);
knopPaneel.add(knop2);
knopPaneel.add(knop3);
knopPaneel.add(knopOptel);
knopPaneel.add(knop0);
knopPaneel.add(knopWissen);
knopPaneel.add(knopUitkomst);
knopPaneel.add(knopAftrek);
add(textPaneel, BorderLayout.NORTH);
add(knopPaneel, BorderLayout.CENTER);
add(logoPaneel, BorderLayout.SOUTH);
}
class knop0Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "0");
}
}
class knop1Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "1");
}
}
class knop2Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "2");
}
}
class knop3Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "3");
}
}
class knop4Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "4");
}
}
class knop5Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "5");
}
}
class knop6Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "6");
}
}
class knop7Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "7");
}
}
class knop8Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "8");
}
}
class knop9Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "9");
}
}
class knopOptelHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Optellen(invoerGetal);
invoerVak.setText("");
}
}
class knopAftrekHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Aftrekken(invoerGetal);
invoerVak.setText("");
}
}
class knopVermenigvuldigenHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Vermenigvuldigen(invoerGetal);
invoerVak.setText("");
}
}
class knopDelenHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Delen(invoerGetal);
invoerVak.setText("");
}
}
class knopUitkomstHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText("" + rekenmachine.getTotaalGetal());
rekenmachine.reset();
}
}
class knopWissenHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
rekenmachine.reset();
invoerVak.setText("");
}
}
}
它基本上做的是看起来像一个计算器,所有按钮都可以工作,但它的计算方式却很不一样,如果有的话。我想我需要做的是保存一个数字,当我按 + 它应该加上下一个数字,如果我按 - 它应该减去下一个数字,如果我按 * 它应该乘以下一个数字,如果我按 /它应该除以下一个数字,然后当我按 = 它应该显示结果,但我不知道该怎么做。
应该用arraylist来完成吗?如果是这样,我怎样才能正确保存结果?我的意思是,将它与两个数字一起使用并不难,您只需保存两个数字并用它们做一些事情,然后显示结果,但一个人并不总是只使用两个数字。
为了更清楚地解释我遇到的问题:例如,当我输入“50”然后按“+”时,它应该将“50”转换为 getal = 50 并启动 Optellen 方法,然后 totaalGetal 应该变为 50,然后清空文本字段。如果我然后添加'3',当我按'='时它应该说53但如果我幸运的话它仍然显示50。为了解决这个问题,我假设我必须在按下“=”时进行计算,但我不知道如何在计算之前 save/calculate 数字。
谁能告诉我在头发全部掉光之前该怎么做? :P
开发东西的时候,首先要考虑如何解决问题。通过设计解决方案从那里开始工作。如果您有可编程解决方案,请实施它。 UI 可能稍后出现。这是开发人员应该具备的核心技能。
1) 你想要一个支持+、-、/和*的计算器。如果单击“=”,则应显示输出。
2) 用 classes 思考。这个概念对你来说可能是新的,但你稍后会发现。进行计算的主要 class 是 Rekenmachine
。 (从设计的角度来说,应该是独立的class,不过现在不重要了)。您需要将它与 UI 层分开。
您的 class 支持您使用 UI 执行的操作。那挺好的。但是我也看到了不该出现的东西
public int Vermenigvuldigen(int getal)
{
reset(); // reset the calculator ?
vermenigvuldigen = true; // purpose ?
totaalGetal *= getal;
getal = 0; // resetting argument getal ?
return totaalGetal;
}
在这里,我不确定你为什么要调用 reset()
因为它的作用是
public void reset()
{
optellen = false;
aftrekken = false;
delen = false;
vermenigvuldigen = false;
getal = 0;
totaalGetal = 0;
}
阅读上述方法时,您会看到它重置了您尝试添加的值。当然,您的计算会出错,因为您正在删除以前的数据……将所有内容重置为初始状态。我也不明白操作上 "true" 或 "false" 的设置。也许是为了UI?这不是必需的。
简单点:
创建Rekenmachine
时,默认设置变量totaalGetal
为0。该变量保存到目前为止执行的计算值。那是开始。当你有加法时,使用
public void add(int getal) {
totaalGetal+= getal; // means totaalGetal = totaalGetal + getal.
}
在调用 add()
之前,您必须将字符串解析为整数。这可以在按钮操作中完成:
class knop1Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
// get input
String input = invoerVak.getText();
// convert
int converted = convertToInt(input);
// instruct myRekenmachine to add the value
myRekenmachine.add(converted);
}
}
重要说明...使用简洁的命名..."knop1handler"难以阅读。使用 "addButtonHandler" 表示此 class 处理添加按钮。
convertToInt
是一种读入 String 和 returns 的方法,其中包含一个整数。你必须自己实施。 myRekenmachine
是您的 Rekenmachine class.
的一个实例
以上为补充。对其他操作数实施相同的操作。如果您想调整 UI,请在处理程序中进行调整。
现在,当您按 =
时,只需 return totaalGetal
值。
PS:不清楚,请问是否可以用英文写名字。我的母语是荷兰语,但在我的 CS 课程中,我可以完全用英语编程。如果您打算从事 IT 职业,请尝试提问,因为英语是 IT 世界的主要语言。
Wesley,在开始编码之前,您是否考虑过您希望计算器做什么?例如它会支持括号,sin/cos,内存吗?您是否考虑过这些功能在逻辑上如何工作,然后考虑如何在 Java 中实现它们?当您开始使用一种新语言时,如果只是为了帮助您理解您正在尝试做的事情,一些流程图和一些伪代码可能会有很长的路要走。
顺便说一句,我知道从 GUI 代码开始并进入应用程序的逻辑很诱人,但通常最好从逻辑开始,然后再进入 GUI。您可以对输入值进行硬编码并查看功能是否按预期运行,然后引入具有从其他位置传入的值的参数。
编辑
我想我知道为什么你的 + 键不起作用了。 reset() 方法在添加它们之前将 getal 和 totalGetal 设置为 0。 0 + 0 是 0.
knopOptel = new JButton("+");
knopOptel.addActionListener(new knopOptelHandler());
class knopOptelHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Optellen(invoerGetal);
invoerVak.setText("");
}
}
public int Optellen(int getal)
{
reset();
public void reset()
{
optellen = false;
aftrekken = false;
delen = false;
vermenigvuldigen = false;
getal = 0;
totaalGetal = 0;
}
optellen = true;
totaalGetal += getal;
getal = 0;
return totaalGetal;
}
当您点击 +
时,您调用的是:
knopOptel.addActionListener((ActionEvent e) ->
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.addition(invoerGetal);
invoerVak.setText("");
});
但是当您点击 +
时,您还没有进行计算!你应该做的是:
- 用户输入了一个数字
- 用户点击
+
(例如)
- 在您的
ActionListener
中,您读取屏幕上的数字,将其存储在 getal
中,清除屏幕, 并设置您的布尔值 optel
为真
- 用户输入了另一个号码
- 用户点击等于
- 在你的等式
Listener
中,你读了你在屏幕上读到的数字,然后根据标志(例子中的optel
),你计算出结果
- 你显示结果
确实如此,当您按下等于时,计算就完成了。
一个小代码示例:
knopOptel.addActionListener((ActionEvent e) ->
{
int invoerGetal = Integer.parseInt(invoerVak.getText()); // get the number
calculate(invoerGetal); //sets totalNumber to what it should be by looking at the flags
invoerVak.setText(totalNumber); // we write the temporary result
additionFlag = true; // next number must be added
});
你的 calculate
函数应该是这样的:
private void calculate(int aInvoerGetal) {
if (addition)
totalNumber += aInvoerGetal;
else if (substract)
totalNumber -= aInvoerGetal;
else if (divide)
totalNumber /= aInvoerGetal;
else if (multiply)
totalNumber *= aInvoerGetal;
resetFlags();
}
更进一步:
现在,如果你想支持多重计算(5+5+5+3),很简单。当您点击 +
、-
、*
、/
时,您首先调用 equalActionListener
.
这样,你得到这样的序列:
5
, +
// ==> 等于调用 ==> 5(因为标志都是假的) ==> 标志 +
到真
10
, +
// ==> 等于调用 ==> 15 因为内存中有 5 且 +
标志已打开。 +
标志关闭,然后再次打开(因为您再次按下 +
)
4
, =
// ==> 等于调用 ==> 19
这大概是你第n次收到关于计算器的菜鸟问题了,我就是想不通,搞了两三天。目前我构建计算器的方法还不够,我知道我必须在按下“=”按钮时开始计算,但我就是不知道该怎么做。由于这个原因,我已经恢复到我原来的计算器代码,当我按下一个不起作用的操作按钮(如“+”)时,它会计算,但我希望这能让我正确地构建它.这是代码:
package rekenmachine;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.*;
public class Rekenmachine extends JFrame
{
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setSize(300,500);
frame.setLocation(800,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Rekenmachine");
RekenPaneel rekenpaneel = new RekenPaneel();
frame.setContentPane(rekenpaneel);
frame.setVisible(true);
}
private static int getal, totaalGetal;
private boolean optellen, aftrekken, vermenigvuldigen, delen;
public int Optellen(int getal)
{
reset();
optellen = true;
totaalGetal += getal;
getal = 0;
return totaalGetal;
}
public int Aftrekken(int getal)
{
reset();
aftrekken = true;
totaalGetal -= getal;
getal = 0;
return totaalGetal;
}
public int Delen(int getal)
{
reset();
delen = true;
totaalGetal /= getal;
getal = 0;
return totaalGetal;
}
public int Vermenigvuldigen(int getal)
{
reset();
vermenigvuldigen = true;
totaalGetal *= getal;
getal = 0;
return totaalGetal;
}
public int getGetal()
{
return getal;
}
public int getTotaalGetal()
{
return totaalGetal;
}
public void reset()
{
optellen = false;
aftrekken = false;
delen = false;
vermenigvuldigen = false;
getal = 0;
totaalGetal = 0;
}
}
class RekenPaneel extends JPanel
{
JButton knop0, knop1, knop2, knop3, knop4, knop5, knop6, knop7, knop8, knop9,
knopOptel, knopAftrek, knopVermenigvuldigen, knopDelen, knopUitkomst,
knopWissen;
JTextField invoerVak;
JPanel textPaneel, knopPaneel, logoPaneel;
Rekenmachine rekenmachine;
public RekenPaneel()
{
rekenmachine = new Rekenmachine();
setLayout(new BorderLayout());
textPaneel = new JPanel();
knopPaneel = new JPanel();
logoPaneel = new JPanel();
textPaneel.setLayout(new FlowLayout());
knopPaneel.setLayout(new GridLayout(4,4));
logoPaneel.setLayout(new FlowLayout());
Border rand = BorderFactory.createEmptyBorder(10, 10, 10, 10);
knop0 = new JButton("0");
knop0.addActionListener(new knop0Handler());
knop1 = new JButton("1");
knop1.addActionListener(new knop1Handler());
knop2 = new JButton("2");
knop2.addActionListener(new knop2Handler());
knop3 = new JButton("3");
knop3.addActionListener(new knop3Handler());
knop4 = new JButton("4");
knop4.addActionListener(new knop4Handler());
knop5 = new JButton("5");
knop5.addActionListener(new knop5Handler());
knop6 = new JButton("6");
knop6.addActionListener(new knop6Handler());
knop7 = new JButton("7");
knop7.addActionListener(new knop7Handler());
knop8 = new JButton("8");
knop8.addActionListener(new knop8Handler());
knop9 = new JButton("9");
knop9.addActionListener(new knop9Handler());
knopOptel = new JButton("+");
knopOptel.addActionListener(new knopOptelHandler());
knopAftrek = new JButton("-");
knopAftrek.addActionListener(new knopAftrekHandler());
knopVermenigvuldigen = new JButton("*");
knopVermenigvuldigen.addActionListener(new knopVermenigvuldigenHandler());
knopDelen = new JButton("/");
knopDelen.addActionListener(new knopDelenHandler());
knopUitkomst = new JButton("=");
knopUitkomst.addActionListener(new knopUitkomstHandler());
knopWissen = new JButton("C");
knopWissen.addActionListener(new knopWissenHandler());
invoerVak = new JTextField(25);
invoerVak.setHorizontalAlignment(invoerVak.RIGHT);
invoerVak.setEditable(false);
invoerVak.setBackground(Color.WHITE);
textPaneel.add(invoerVak);
knopPaneel.add(knop7);
knopPaneel.add(knop8);
knopPaneel.add(knop9);
knopPaneel.add(knopDelen);
knopPaneel.add(knop4);
knopPaneel.add(knop5);
knopPaneel.add(knop6);
knopPaneel.add(knopVermenigvuldigen);
knopPaneel.add(knop1);
knopPaneel.add(knop2);
knopPaneel.add(knop3);
knopPaneel.add(knopOptel);
knopPaneel.add(knop0);
knopPaneel.add(knopWissen);
knopPaneel.add(knopUitkomst);
knopPaneel.add(knopAftrek);
add(textPaneel, BorderLayout.NORTH);
add(knopPaneel, BorderLayout.CENTER);
add(logoPaneel, BorderLayout.SOUTH);
}
class knop0Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "0");
}
}
class knop1Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "1");
}
}
class knop2Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "2");
}
}
class knop3Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "3");
}
}
class knop4Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "4");
}
}
class knop5Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "5");
}
}
class knop6Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "6");
}
}
class knop7Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "7");
}
}
class knop8Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "8");
}
}
class knop9Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText(invoerVak.getText() + "9");
}
}
class knopOptelHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Optellen(invoerGetal);
invoerVak.setText("");
}
}
class knopAftrekHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Aftrekken(invoerGetal);
invoerVak.setText("");
}
}
class knopVermenigvuldigenHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Vermenigvuldigen(invoerGetal);
invoerVak.setText("");
}
}
class knopDelenHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Delen(invoerGetal);
invoerVak.setText("");
}
}
class knopUitkomstHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
invoerVak.setText("" + rekenmachine.getTotaalGetal());
rekenmachine.reset();
}
}
class knopWissenHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
rekenmachine.reset();
invoerVak.setText("");
}
}
}
它基本上做的是看起来像一个计算器,所有按钮都可以工作,但它的计算方式却很不一样,如果有的话。我想我需要做的是保存一个数字,当我按 + 它应该加上下一个数字,如果我按 - 它应该减去下一个数字,如果我按 * 它应该乘以下一个数字,如果我按 /它应该除以下一个数字,然后当我按 = 它应该显示结果,但我不知道该怎么做。
应该用arraylist来完成吗?如果是这样,我怎样才能正确保存结果?我的意思是,将它与两个数字一起使用并不难,您只需保存两个数字并用它们做一些事情,然后显示结果,但一个人并不总是只使用两个数字。
为了更清楚地解释我遇到的问题:例如,当我输入“50”然后按“+”时,它应该将“50”转换为 getal = 50 并启动 Optellen 方法,然后 totaalGetal 应该变为 50,然后清空文本字段。如果我然后添加'3',当我按'='时它应该说53但如果我幸运的话它仍然显示50。为了解决这个问题,我假设我必须在按下“=”时进行计算,但我不知道如何在计算之前 save/calculate 数字。
谁能告诉我在头发全部掉光之前该怎么做? :P
开发东西的时候,首先要考虑如何解决问题。通过设计解决方案从那里开始工作。如果您有可编程解决方案,请实施它。 UI 可能稍后出现。这是开发人员应该具备的核心技能。
1) 你想要一个支持+、-、/和*的计算器。如果单击“=”,则应显示输出。
2) 用 classes 思考。这个概念对你来说可能是新的,但你稍后会发现。进行计算的主要 class 是 Rekenmachine
。 (从设计的角度来说,应该是独立的class,不过现在不重要了)。您需要将它与 UI 层分开。
您的 class 支持您使用 UI 执行的操作。那挺好的。但是我也看到了不该出现的东西
public int Vermenigvuldigen(int getal)
{
reset(); // reset the calculator ?
vermenigvuldigen = true; // purpose ?
totaalGetal *= getal;
getal = 0; // resetting argument getal ?
return totaalGetal;
}
在这里,我不确定你为什么要调用 reset()
因为它的作用是
public void reset()
{
optellen = false;
aftrekken = false;
delen = false;
vermenigvuldigen = false;
getal = 0;
totaalGetal = 0;
}
阅读上述方法时,您会看到它重置了您尝试添加的值。当然,您的计算会出错,因为您正在删除以前的数据……将所有内容重置为初始状态。我也不明白操作上 "true" 或 "false" 的设置。也许是为了UI?这不是必需的。
简单点:
创建Rekenmachine
时,默认设置变量totaalGetal
为0。该变量保存到目前为止执行的计算值。那是开始。当你有加法时,使用
public void add(int getal) {
totaalGetal+= getal; // means totaalGetal = totaalGetal + getal.
}
在调用 add()
之前,您必须将字符串解析为整数。这可以在按钮操作中完成:
class knop1Handler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
// get input
String input = invoerVak.getText();
// convert
int converted = convertToInt(input);
// instruct myRekenmachine to add the value
myRekenmachine.add(converted);
}
}
重要说明...使用简洁的命名..."knop1handler"难以阅读。使用 "addButtonHandler" 表示此 class 处理添加按钮。
convertToInt
是一种读入 String 和 returns 的方法,其中包含一个整数。你必须自己实施。 myRekenmachine
是您的 Rekenmachine class.
以上为补充。对其他操作数实施相同的操作。如果您想调整 UI,请在处理程序中进行调整。
现在,当您按 =
时,只需 return totaalGetal
值。
PS:不清楚,请问是否可以用英文写名字。我的母语是荷兰语,但在我的 CS 课程中,我可以完全用英语编程。如果您打算从事 IT 职业,请尝试提问,因为英语是 IT 世界的主要语言。
Wesley,在开始编码之前,您是否考虑过您希望计算器做什么?例如它会支持括号,sin/cos,内存吗?您是否考虑过这些功能在逻辑上如何工作,然后考虑如何在 Java 中实现它们?当您开始使用一种新语言时,如果只是为了帮助您理解您正在尝试做的事情,一些流程图和一些伪代码可能会有很长的路要走。
顺便说一句,我知道从 GUI 代码开始并进入应用程序的逻辑很诱人,但通常最好从逻辑开始,然后再进入 GUI。您可以对输入值进行硬编码并查看功能是否按预期运行,然后引入具有从其他位置传入的值的参数。
编辑
我想我知道为什么你的 + 键不起作用了。 reset() 方法在添加它们之前将 getal 和 totalGetal 设置为 0。 0 + 0 是 0.
knopOptel = new JButton("+");
knopOptel.addActionListener(new knopOptelHandler());
class knopOptelHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.Optellen(invoerGetal);
invoerVak.setText("");
}
}
public int Optellen(int getal)
{
reset();
public void reset()
{
optellen = false;
aftrekken = false;
delen = false;
vermenigvuldigen = false;
getal = 0;
totaalGetal = 0;
}
optellen = true;
totaalGetal += getal;
getal = 0;
return totaalGetal;
}
当您点击 +
时,您调用的是:
knopOptel.addActionListener((ActionEvent e) ->
{
String invoer = invoerVak.getText();
int invoerGetal = Integer.parseInt(invoer);
rekenmachine.addition(invoerGetal);
invoerVak.setText("");
});
但是当您点击 +
时,您还没有进行计算!你应该做的是:
- 用户输入了一个数字
- 用户点击
+
(例如) - 在您的
ActionListener
中,您读取屏幕上的数字,将其存储在getal
中,清除屏幕, 并设置您的布尔值optel
为真 - 用户输入了另一个号码
- 用户点击等于
- 在你的等式
Listener
中,你读了你在屏幕上读到的数字,然后根据标志(例子中的optel
),你计算出结果 - 你显示结果
确实如此,当您按下等于时,计算就完成了。
一个小代码示例:
knopOptel.addActionListener((ActionEvent e) ->
{
int invoerGetal = Integer.parseInt(invoerVak.getText()); // get the number
calculate(invoerGetal); //sets totalNumber to what it should be by looking at the flags
invoerVak.setText(totalNumber); // we write the temporary result
additionFlag = true; // next number must be added
});
你的 calculate
函数应该是这样的:
private void calculate(int aInvoerGetal) {
if (addition)
totalNumber += aInvoerGetal;
else if (substract)
totalNumber -= aInvoerGetal;
else if (divide)
totalNumber /= aInvoerGetal;
else if (multiply)
totalNumber *= aInvoerGetal;
resetFlags();
}
更进一步:
现在,如果你想支持多重计算(5+5+5+3),很简单。当您点击 +
、-
、*
、/
时,您首先调用 equalActionListener
.
这样,你得到这样的序列:
5
,+
// ==> 等于调用 ==> 5(因为标志都是假的) ==> 标志+
到真10
,+
// ==> 等于调用 ==> 15 因为内存中有 5 且+
标志已打开。+
标志关闭,然后再次打开(因为您再次按下+
)4
,=
// ==> 等于调用 ==> 19