0

我是 java 编程的新手,我刚刚创建了一个计算器程序,它似乎工作正常,但其他程序员似乎在他们的计算器程序中使用“解析很多”。只是想问一下我是否采取了错误的方法,并且将来使用这种逻辑可能会遇到问题。谢谢。

class Refresh {

private final String a;
private final String b;
private final String c;
private final String d;
private double x, y;

public Refresh() {
    a = "Enter the first number: ";
    b = "Enter the function; ";
    c = "Enter the second number: ";
    d = "The result is: ";
}

public void types() {
    Scanner typ = new Scanner(System.in);

    try {
        System.out.println(a);
        x = typ.nextDouble();
    } catch (InputMismatchException e) {
        System.out.println("Please use only numbers!");
        System.exit(1);
    }
    System.out.println(b);
    String func = typ.next();

    try {
        System.out.println(c);
        y = typ.nextDouble();
    } catch (InputMismatchException e) {
        System.out.println("Please use only numbers!");
        System.exit(1);
    }

    switch (func) {

        case "+":
            System.out.println(d + (x + y));
            break;

        case "-":
            System.out.println(d + (x - y));
            break;
        case "/":
            if (y == 0) {

                System.out.println("Cannot divide by zero!");
            } else {
                System.out.println(d + (x / y));
            }
            break;
        case "*":
            System.out.println(d + (x * y));
            break;

        default:
            System.out.println(func + " is not valid function");
    }
}

    public static void main(String[] args) {
        Refresh fin = new Refresh();
        fin.types();
    }
}
4

4 回答 4

0

解析只是意味着扫描一组字符,然后将它们分成自己的结构(标记它们)。

String aStr = "10";

变量aStr的类型为String。然后,您可以解析字符串。

int aInt = Integer.parseInt(aStr);

于 2017-03-08T16:19:50.787 回答
0

仅供参考,Java 有一个内置的计算器库。

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
String result = "100/10";
System.out.println(scriptEngine.eval(result));
于 2017-03-08T16:21:29.810 回答
0

好吧,这实际上是一个非常基本的例子。老实说,你做得很好。在这个时候甚至更好地提出这个问题。通常人们在学习过程中忽略了效率并且为时已晚。

他们为什么要解析?

如果您不了解以下内容,那么您可能应该尝试阅读更多内容。

扫描仪读取用户的所有关键输入。举个例子

输入一个数字>12

扫描仪将持有12\n

现在你看到了吗?扫描仪只保留数字它实际上保留了一个字符串。其中包含12\n

当您询问扫描仪nextDouble时,它只会给您12

但是它仍然坚持下去,\n所以下一个字符串输入,字符串\n将被分配。

通过解析,您将忽略此问题。而且您将更好地控制用户输入。

于 2017-03-08T16:26:35.440 回答
0

您的程序可以作为演示或学习 Java 的一个步骤,但您可能不会将其用作生产程序。原因是您的代码采用命令行界面(静态 void main()、Scanner、System.out.println())。

如今,用户习惯于图形解决方案。他们希望在图形前端给出输入和输出,并且计算应该在单独的逻辑中完成。

在这种情况下,我将把你的程序重组为 3 个部分:

  • 执行计算的后端类(以下示例代码中的 Calculator 类)
  • 一个前端类(下面称为 SimpleFrontEnd),它建立在您的代码之上,但以后可以替换为例如 Web 界面
  • 后端和前端之间通信的数据对象(下面的计算类将信息从前端发送到后端)

拥有这 3 个部分,您可以相互独立地修改它们。您可以决定在前端只输入一个字符串,然后在发送到后端之前对其进行解析。

我可能不会在前端使用需要解析的单个字符串,而是直接映射到下面的 Calculation 类的 JSON 对象,原因如下:前端可以轻松修改 JSON 对象的操作数和运算符彼此独立,而修改必须解析的字符串更复杂。

这是将前端与后端分开的示例代码:

public class Calculation {
    private double leftOperand;
    private String operator;
    private double rightOperand;

    public double getLeftOperand() {
        return leftOperand;
    }

    public void setLeftOperand(double leftOperand) {
        this.leftOperand = leftOperand;
    }

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator;
    }

    public double getRightOperand() {
        return rightOperand;
    }

    public void setRightOperand(double rightOperand) {
        this.rightOperand = rightOperand;
    }
}

public class Calculator {
    public double calculate(Calculation calculation) {
        switch (calculation.getOperator()) {
            case "+":
                return calculation.getLeftOperand() + calculation.getRightOperand();
            case "-":
                return calculation.getLeftOperand() - calculation.getRightOperand();
            case "/":
                if (calculation.getRightOperand() == 0) {
                    throw new IllegalArgumentException("Cannot divide by zero!");
                }
                return calculation.getLeftOperand() / calculation.getRightOperand();
            case "*":
                return calculation.getLeftOperand() * calculation.getRightOperand();
            default:
                throw new IllegalArgumentException(String.format("%s is not valid function", calculation.getOperator()));
        }
    }
}

public class SimpleFrontEnd {
    public static void main(String[] args) {
        try {
            //1. input, could be later replaced with a front end
            Scanner typ = new Scanner(System.in);
            System.out.println("Enter the first number: ");
            double x = typ.nextDouble();
            System.out.println("Enter the function: ");
            String func = typ.next();
            System.out.println("Enter the second number: ");
            double y = typ.nextDouble();

            //2. store input in an data object that will be sent to the back end (later on, a web interface could send this as a JSON)
            Calculation calculation = new Calculation();
            calculation.setLeftOperand(x);
            calculation.setOperator(func);
            calculation.setRightOperand(y);

            //3. retrieve the result from the back end
            Calculator calculator = new Calculator();
            try {
                double result = calculator.calculate(calculation);
                System.out.println(String.format("The result is: %f", result));
            } catch (IllegalArgumentException e) {
                System.out.println(e.getMessage());
            }
        } catch (InputMismatchException e) {
            System.out.println("Please use only numbers!");
        }
    }
}
于 2017-03-08T17:17:15.797 回答