【问题标题】:Java calculator (order of operations)Java计算器(运算顺序)
【发布时间】:2023-01-11 17:31:02
【问题描述】:

你如何告诉 Java 操作数的顺序?

好吧,我对编码还很陌生,我的一个朋友在高级课程中被要求制作一个计算器,我对它的工作原理很感兴趣。

我搜索了它,发现的解决方案几乎只是一个超级基本的计算器,是我可以自己编写的代码(我很感激,因为还有很多我还不明白);但我正在寻找更复杂的东西。

这些建议是这样的:

Double result = 0;

System.out.println ("First opperand:");
Num1 = scan.next double();

System.out.println ("Choose operation (+,-,*,/):");
Ope = scan.next();

System.out.println ("Second opperand:");
Num2 = scan.next double();

Switch (ope) {
 Case '+':
  Result = num1 + num2;
  break;

 Case '-':
  Result = num1 + num2;
  break;

//and so on for each different operand that you want to add
}

System.out.println (result);

问题是,我猜计算器的想法是用户将操作作为字符串输入,然后计算器解释操作数和运算符。我想你可以使用字符串类轻松地做到这一点,告诉它搜索完整的字符串以查找连续的数字作为要创建的新操作数变量,以及作为运算符的任何其他内容并检查它们是否有效(不知道如何正确编程,因为正如我之前所说,我对此仍然很陌生)。

但真正的问题是,我如何告诉程序“20/((10+5)*2)”之类的操作顺序?

我想我可以处理基本的运算符,但我该如何处理括号?

我不知道这是否更高级,我什至不明白答案,或者它实际上有点简单,我只需要一些观点,但我对此很感兴趣,这就是我问的原因

【问题讨论】:

    标签: java operators calculator operands


    【解决方案1】:

    你要找的是一个合适的解析器,这会将您的字符串转换为所谓的解析树, 这样您就可以执行解析树描述的操作。

    因此,数值表达式的解析器会将字符串“20/((10+5)*2)”转换为以下解析树:

                   [/]
                  /   
                 20   [*]
                     /   
                   [+]    2
                  /   
                 10    5
    

    然后计算将递归执行如下:

    • 计算当前节点的值:
      • 如果节点是叶子节点,(一个数字,)则使用数字的值作为结果,完成;否则,
      • 如果节点是非叶节点,(带子节点的操作数)则:
        • 计算左孩子的值(递归)
        • 计算右孩子的值(递归)
        • 对两个计算值执行操作数指示的操作。

    解析器是信息论科学(也称为“计算机科学”)中的一个完整子主题,它们无法在 stackoverflow 答案中进行解释。但至少你现在有了一个名字,你可以用它来谷歌。

    【讨论】:

    • 请注意,信息论!=计算机科学。这是两个截然不同的研究领域。 (解析器不是信息论的研究课题。)
    • @KonradRudolph 你是对的。什么是正确的术语?信息科学?我不想只称它为“计算机科学”,因为它用词不当,正如您从关于天文学和望远镜的著名 Dijkstra 名言中了解到的那样。
    • 有人称之为信息学。信息科学听起来是对的。
    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 2023-03-26
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多