1

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

它应该像这样工作:

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

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

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

我很确定我让这比实际情况更复杂:p 这是到目前为止的代码:

// 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);
    }
}

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

4

5 回答 5

1

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

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

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

于 2012-10-04T14:37:35.147 回答
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
于 2012-10-04T14:44:48.273 回答
1

看看 Effective Java 中的 Enum 类,书 bu Joshua Bloch to manage operator

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

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

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

运算符可以在 inputString.subtring(endOfReadInput[0],indexOfReadInput[1]).trim();

这个练习很有趣,可以了解拆分、子串和其他字符串工具的强大功能,并了解新的Enum.class可能性,然后您可以阅读其他链接以了解如何使用模式设计

于 2012-10-04T14:50:39.057 回答
0

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

在开始之前,我建议您阅读语言解析的基础知识,特别是解析基本算术。对于初学者,您可以阅读pdf。

于 2012-10-04T14:40:41.410 回答
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
}
于 2012-10-04T14:48:52.233 回答