gpt4 book ai didi

java - (Noob Coder)基本计算器问题 + 代码建议

转载 作者:行者123 更新时间:2023-11-30 06:53:19 28 4
gpt4 key购买 nike

我正在学习 Java,作为高中作业之外的个人项目,我决定制作一些数学求解程序来练习。

为了热身,我决定编写一个基本的计算器程序......并且它有效......有点。所以...请帮助我!

目标:

-> 拥有一个计算器,通过扫描仪输入,可以使用运算符 [+、-、/、^(Math.pow)、*] 计算任何数字序列。 (例如:1+2+4+2 等)

什么有效:

-> 它可以计算总和、乘积、幂、差以及除两个数(int 或 double,但答案是 double)。

什么不起作用:

-> 输入中不能包含任何空格,否则会在第一个数组(求和数组)上出现“越界”错误,依此类推

-> 它无法计算任何复合问题(例如: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();
}
}

谢谢!

最佳答案

导入java.lang.System;

这是不必要的。 java.lang 是在您没有说明的情况下导入的,因此您可以在代码中编写 System 而无需此行。您可以安全地将其删除。

扫描仪 inputScan2 = inputScan.useDelimiter("\\+|\\-|\\/|\\*|\\^|\\s");

仅仅因为 useDelimiter 返回一个 Scanner 并不意味着您需要将其放入变量中。除了关闭它之外,您再也不会使用 inputScan2 (并且在任何情况下,inputScan2 都等于此行之后的 inputScan,使其变得多余。)所以我会将行缩短为:

inputScan.useDelimiter("\\+|\\-|\\/|\\*|\\^|\\s");

并删除关闭此未使用的扫描仪的相应行。

loopCount2loopCount3 作为单独的变量,因为它们总是彼此相距一远,这有点奇怪。看起来你可以摆脱其中一个。

我注意到除了 main 方法之外,你没有任何方法。对于相对较小的程序来说,这并不是那么糟糕,但最好养成将代码拆分为方法的习惯。

我注意到您没有任何代码注释。注释通常可以帮助您(和其他人)理解您的代码。特别是当变量被命名为诸如 inputScan3 之类的东西时 - 该名称给出了变量的一般概念,但它并没有真正说明为什么它与 inputScan 不同,例如。评论会对此有所帮助。

if(inputI.contains("+")){ 这样的行对于复合语句来说永远不会有多大好处 - 你要检查整个字符串是否包含 + ,如果您正在处理 4+2*3,这并不是那么相关,因为这并不能告诉您当前正在执行加法还是乘法。如果您想处理复合语句,您几乎必须重新检查正在执行的操作的方式。

我注意到您将 answer 数组的大小设置为 1000。这对于其他数组来说也许是可以理解的,因为您在创建它们时不知道它们的大小,但对于这个数组,您已经知道大小 - 它是loopCount3 + 1。因此,您可以编写 double[] answer = new double[loopCount3+1]; 并节省一些内存。

关于java - (Noob Coder)基本计算器问题 + 代码建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42311961/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com