我是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();
}
}
答案 0 :(得分:0)
解析只是意味着扫描一组字符然后将它们分成它们自己的结构(将它们标记化)。
String aStr = "10";
变量aStr
的类型为String
。然后你可以解析字符串。
int aInt = Integer.parseInt(aStr);
答案 1 :(得分:0)
只是为了您的信息,Java有一个内置的计算器库。
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
String result = "100/10";
System.out.println(scriptEngine.eval(result));
答案 2 :(得分:0)
好吧,这实际上是非常基本的例子。老实说,你做得很好。甚至在此时提出这个问题更好。通常人们会在学习过程中忽视效率并且为时已晚。
他们为什么要解析?
如果你不知道下面的内容,那么你应该再试一次reading。
扫描仪读取用户的所有关键输入。让我们举个例子
输入数字> 12
扫描仪将保留12\n
现在你看到了吗?扫描仪坚持只是数字它实际上是保持一个字符串。其中包含12
和\n
当您询问扫描仪nextDouble
时,它会给您12
。
但是它仍然坚持\n
所以下一个字符串输入,字符串\n
将被分配。
通过解析,您将忽略此问题。并且您可以更好地控制用户输入。
答案 3 :(得分:0)
您的程序可以作为演示或学习Java的一步,但您可能不会将其用作生产程序。原因是您的代码假定命令行界面(static void main(),Scanner,System.out.println())。
用户现在习惯于使用图形解决方案。他们希望输入和输出在图形前端给出,计算应该在单独的逻辑中完成。
在这个视图中,我将分三部分重构您的程序:
拥有这三个部分,您可以相互独立地修改它们。您可以决定在前端只输入一个String,然后在发送到后端之前对其进行解析。
我可能不会在前端使用需要解析的单个String,而是直接映射到下面的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!");
}
}
}