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

时间:2017-02-18 06:36:19

标签: java oop math java.util.scanner calculator

我是一名学习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();
}
}

谢谢!

2 个答案:

答案 0 :(得分:1)

import java.lang.System;

这是不必要的。导入java.lang时不会这样说,因此您只需在代码中编写System即可。你可以安全地删除它。

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

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

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

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

loopCount2loopCount3作为单独的变量,当他们总是只有一个远离彼此时,这有点奇怪。看起来你可以摆脱其中一个。

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

我注意到你没有任何代码评论。评论通常可以帮助您(和其他人)理解您的代码。特别是当变量被命名为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以了解如何处理输入。