我是一名学习Java的人,除了高中任务外,我还是作为个人项目,我决定为实践制定一些数学解决方案。
为了热身,我决定写一个基本的计算器程序......它有效......有点儿。所以......请帮助我!
- >要有一个计算器,使用扫描仪输入,可以使用运算符[+, - ,/,^(Math.pow),*]计算任何数字序列。 (例如:1 + 2 + 4 + 2等)
- >它可以计算总和,乘积,幂,差值,并除以两个数字(整数或双数,但答案是双数)。
- >它不能输入任何空格,或者它会得到一个超出范围的'第一个数组上的错误(求和一个)等等
- >它无法计算任何复合问题(例如:1 + 2 + 3,3 * 4 ^ 6等)。
我计划在此添加许多其他东西(触发功能,额外功能等),但是现在,这需要工作。有人能告诉我如何解决这些问题吗?
我应该注意哪些最大的编程错误(除了不工作之外)(根据您看到的代码)?我通常按顺序和逻辑编程,但我觉得我(和我的代码)可以更有效率。
import java.util.*;
import java.io.*;
import java.lang.System;
import java.util.stream.*;
public class basicCalculator {
public static void main(String args[])throws IOException{
System.out.println("What would you like to calculate?");
Scanner inputNum = new Scanner(System.in);
String inputI = inputNum.nextLine();
Scanner inputScan = new Scanner(inputI);
Scanner inputScan2 = inputScan.useDelimiter("\\+|\\-|\\/|\\*|\\^|\\s");
Scanner inputScan3 = new Scanner(inputI);
double textContent[] = new double[1000];
int loopCount = -1;
int loopCount2 = 1;
int loopCount3 = 0;
double[] partOfResult = new double[1000];
while(inputScan.hasNextDouble()){
loopCount++;
textContent[loopCount] = inputScan.nextDouble();
}
while(inputScan3.hasNext()){
if(inputI.contains("+")){
partOfResult[loopCount3] = (textContent[loopCount2 - 1] + textContent[loopCount2]);
loopCount3++;
loopCount2++;
}else if(inputI.contains("-")){
partOfResult[loopCount3] = (textContent[loopCount2 - 1] - textContent[loopCount2]);
loopCount3++;
loopCount2++;
}
else if(inputI.contains("/")){
partOfResult[loopCount3] = (textContent[loopCount2 - 1] / textContent[loopCount2]);
loopCount3++;
loopCount2++;
}
else if(inputI.contains("*")){
partOfResult[loopCount3] = (textContent[loopCount2 - 1] * textContent[loopCount2]);
loopCount3++;
loopCount2++;
}
else if(inputI.contains("^")){
partOfResult[loopCount3] = (Math.pow(textContent[loopCount - 1], textContent[loopCount]));
loopCount3++;
loopCount2++;
}
if(inputScan.hasNext() == false){
double[] answer = new double[1000];
for(int i = 0; i <= loopCount3;){
answer[i] = partOfResult[i] + partOfResult[i+1];
i++;
}
double sum = DoubleStream.of(answer).sum();
System.out.println("The answer is " + sum);
break;
}
}
inputScan3.close();
inputScan2.close();
inputScan.close();
inputNum.close();
}
}
谢谢!
答案 0 :(得分:1)
import java.lang.System;
这是不必要的。导入java.lang
时不会这样说,因此您只需在代码中编写System
即可。你可以安全地删除它。
Scanner inputScan2 = inputScan.useDelimiter("\\+|\\-|\\/|\\*|\\^|\\s");
仅仅因为useDelimiter
返回Scanner
并不意味着您需要将其放入变量中。你永远不会再使用inputScan2
,除非关闭它(在任何情况下,inputScan2
在此行之后等于inputScan
,这使它变得多余。)所以我会缩短这一行:
inputScan.useDelimiter("\\+|\\-|\\/|\\*|\\^|\\s");
并删除关闭此未使用扫描程序的相应行。
将loopCount2
和loopCount3
作为单独的变量,当他们总是只有一个远离彼此时,这有点奇怪。看起来你可以摆脱其中一个。
我注意到除了主要方法之外你没有任何方法。这对于一个相对较小的程序来说并不是那么糟糕,但最好养成将代码分解为方法的习惯。
我注意到你没有任何代码评论。评论通常可以帮助您(和其他人)理解您的代码。特别是当变量被命名为inputScan3
之类的东西时 - 该名称给出了变量的一般概念,但它并没有真正说明它与inputScan
的不同之处,例如。评论会对此有所帮助。
像if(inputI.contains("+")){
这样的行对于复合语句来说永远不会有太大的好处 - 你要检查整个字符串是否包含+
,如果你是&#39则不是那么相关;重新处理4+2*3
,因为它并不能告诉您当前是否正在进行加法或乘法。如果你想处理复合语句,你几乎必须重做检查你正在做的操作的方式。
我注意到你将answer
数组设置为大小为1000.这可能是您可以理解的,因为您在创建它们时并不知道它们的大小,但对于这个,您已经知道大小 - 它是loopCount3 + 1
。所以你可以写double[] answer = new double[loopCount3+1];
并节省一些内存。
答案 1 :(得分:0)
我会拆分代码。我看到一个类与输入一起工作并返回一个带有操作数和操作的对象,某种智能Stack可以理解输入语法。我看到一个类可以处理堆栈对象,并可以调用所需操作的方法。
你的主要将是这样的
1
编辑:请参阅polish notation以了解如何处理输入。