Java阅读线和做数学方程

时间:2013-07-19 17:49:30

标签: java math equation

所以我有这个项目要做,我需要读取一个名为Input的文本文件,我这样做:

    public static void textParser() {
    File inputFile = new File("Input.txt");
    try {
        BufferedReader br = new BufferedReader(new FileReader(inputFile));
        String inputsText;
        while ((inputsText = br.readLine()) != null) {
            System.out.println(inputsText);
        }
        br.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

它有效。在Input.txt里面,它显示:

6
10 + 4
12 - 3
1000 / 50
9 * 64
2^5
90 % 8
1 + 1
6 * 4

第一行(6)将始终是待办事项的数量,可以不同于6。 然后我必须做第一行所说的方程式,我将如何继续这样做?谢谢!

5 个答案:

答案 0 :(得分:3)

您需要编写解析器。如果没有为你做功课,这就是伪代码应该足够了:

for line in ReadFile()  
{  
  for token in split(line,expression)  
  {  
      if token is digit  
         digits.enqueue(token) 
      if token is symbol  
         symbols.enqueue(token)    
  }  
     for element in digits,symbols:   
         applySymbol(firstDigit,secondDigit,symbol)
}  

答案 1 :(得分:1)

我用不同的语言几次解决了这个问题。查看Shunting-yard algorithm

基本上,您将操作符和操作数推送并弹出到优先级队列中。你基本上是将中缀转换为后期修复。一旦你的方程处于修复后的表示法中,它就更容易解决。

如果您没有优先顺序担心问题会更简单,但仍然可以通过相同的方法解决。

编辑:

我们人类使用修复符号: 3 + 5 - 1 运算符位于操作数之间。

在Post修复符号中如下所示: 3 5 + 1 -

操作符出现在操作数之后。以这种方式编写的方程很容易评估。您只需将操作数推入堆栈,然后使用下一个运算符评估最后2个。所以在这里,你将3和5推入堆栈。然后你遇到+运算符,所以你添加3和5,得到8.将8推入堆栈。现在你阅读1.将1推入堆栈。现在你读 - 。从1减去8.你得到7的答案。

分流场算法告诉您如何在中缀和后期修改之间进行转换。

祝你好运!

答案 2 :(得分:0)

一个选项是使用ANTLR生成一个解析器,这个tutorial几乎涵盖了你想要做的事情

答案 3 :(得分:0)

首先,您需要将它们存储在字符串数组中

然后获取数组中的第一个元素并将其转换为整数。

基于整数值,循环必须迭代。所以循环形成。现在你需要从下一个索引开始读取字符串数组。

首先进行算术运算需要有4个字符'+',' - ','*','%'

的数组

根据char数组拆分字符串。这可以作为一个单独的功能。因为每次都需要被召唤。我说的是表现。

然后,您将获得解析的两个值及其分割它们的运算符。

现在您可以执行算术运算。

多数民众赞成你得到了所需。

答案 4 :(得分:0)

我终于找到了一种不同的方式,这就是我在做的方式:

    public static void textParser() {
    File inputFile = new File("Input.txt");
    try {
        Scanner scanner = new Scanner(inputFile);
        int numberOfQuestions = Integer.parseInt(scanner.next());
        for (int i = 1; i <= numberOfQuestions; i++) {
            int firstInt = Integer.parseInt(scanner.next());
            String operationSign = scanner.next();
            int secondInt = Integer.parseInt(scanner.next());
            if (operationSign.contains("+")) {
                int answer = firstInt + secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " + " + secondInt + " = " + answer);
            } else if (operationSign.contains("-")) {
                int answer = firstInt - secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " - " + secondInt + " = " + answer);
            } else if (operationSign.contains("/")) {
                int answer = firstInt / secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " / " + secondInt + " = " + answer);
            } else if (operationSign.contains("*")) {
                int answer = firstInt * secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " * " + secondInt + " = " + answer);
            } else if (operationSign.contains("%")) {
                int answer = firstInt % secondInt;
                System.out.println("Equation " + i + " : " + firstInt
                        + " % " + secondInt + " = " + answer);
            }
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

感谢大家的帮助!