无法确定如何让我的计算器正确计算

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.

这样,你得到这样的序列:

  1. 5, + // ==> 等于调用 ==> 5(因为标志都是假的) ==> 标志 + 到真

  2. 10, + // ==> 等于调用 ==> 15 因为内存中有 5 且 + 标志已打开。 + 标志关闭,然后再次打开(因为您再次按下 +

  3. 4, = // ==> 等于调用 ==> 19