在基于命令行的计算器程序中处理输入的最佳做法是什么?

时间:2012-10-04 14:31:45

标签: java string parsing command-line-interface

哟 - 试图回到java,所以决定创建一个计算器。

假设这样工作:

1)以字符串的形式从用户那里获取输入 - >此输入存储为字符串,例如: 12 + 89

2)根据操作员位置拆分字符串,并确保在此操作之前的任何内容都转换为整数并存储

3)一旦通过字符串,计算值

我非常确定我让它比实际更复杂:到目前为止这里是代码:

// Split String, count digits in string
public static void spitStrg() {
    int numDigits = 0;
    int numOperators = 0;
    for (int i = 0; i < input.length(); i++) {
        if (Character.isDigit(input.charAt(i))) {
            numDigits++;
        }
        else if (input.charAt(i) == '+') {
            System.out.println( "Position of operator: "+i);
            numOperators++;
        }
    }
    System.out.println("Number of Digits: "+numDigits);
    System.out.println("Number of Operators: "+numOperators);
}

// Create a number from cut off point
public static void createNum(int startPoint, int operatorPosition) {
    String tempNum = "";

    for (int j = startPoint; j < operatorPosition; j++) {
        tempNum = tempNum + input.charAt(startPoint);
    }
}

有没有人对如何处理此问题有任何其他建议?即一次要求一个号码然后运营商或将所有内容存储在一个向量中以反映越来越多的数字和运算符?

5 个答案:

答案 0 :(得分:1)

为什么不查看一些现有计算器的源代码? 或许你会收集一些关于什么是好方法的想法。

我在sourceforge上找到的一个例子,我之前看过的是:

http://sourceforge.net/projects/jcalcadvance/

答案 1 :(得分:1)

不确定这对你是否合适。 (或作弊?)

你只需让用户输入整个表达式作为字符串。 23+33-34*2^2

然后你可以:

try {
        final ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
        final Object result = engine.eval("23+33-34*2^2");
        System.out.println(result);
    } catch (final ScriptException e) {

        e.printStackTrace();
    }

运行上面的代码,会给你:

-10

答案 2 :(得分:1)

查看有效Java中的Enum类,预约Joshua Bloch自己管理运营商

如果您的操作有限,可以使用

String[] readInput = inputString.split("+|-|*|/|%").trim();

然后操作员在数字之间 - numberOne从零到大小readInput [0]
- numberTwo开头由inputString.index(readInput[1]) + readInput[1].length

完成

运营商可在inputString.subtring(endOfReadInput[0],indexOfReadInput[1]).trim();

中找到

本练习很有趣,了解split,substring和其他String工具是如何强大的,并了解新的Enum.class可能性,然后您可以阅读其他链接以了解如何使用Pattern Design

答案 3 :(得分:0)

如果您不想使用库来解析数学表达式(这是迄今为止最简单的方法,我的答案将假设您不希望这样)您需要实际解析,而不仅仅是字符串拆分。 / p>

在开始之前,我建议你阅读语言解析的基础知识,特别是解析基本算法。首先,您可以阅读this pdf。

答案 4 :(得分:0)

我不会强迫用户输入整个字符串,这是一种糟糕的体验。为什么不像普通计算器那样做?当输入进入时,动态计算结果。因此,输入新操作符将完成当前操作。

因此逐个字符地读取 - 在无限循环中这样的东西。

while(Character.isDigit(input.charAt(0)) {
    operand += digitPosition*input.charAt(0);
    digitPosition*=10;
}

digitPosition = 1;

//broke out of loop - operator received
if (isValidOperator(input.charAt(0))) {
    //store operator and await another operand (if first operation only), compute result, or throw invalid operator exception
}