0

所以我有这个项目要做,我需要读取一个名为 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 不同。然后我必须做第一行所说的多少个方程,我将如何继续这样做?谢谢!

4

5 回答 5

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)
}  
于 2013-07-19T17:54:51.087 回答
1

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

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

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

编辑:

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

在 Post fix 表示法中如下所示: 3 5 + 1 -

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

调车场算法告诉你如何在中缀和后缀之间转换。

祝你好运!

于 2013-07-19T17:51:49.170 回答
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();
    }
}

感谢大家的帮助!

于 2013-07-20T20:34:29.680 回答
0

一个选项是使用 ANTLR 生成解析器,本教程几乎涵盖了您正在尝试做的事情

于 2013-07-19T17:57:13.600 回答
0

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

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

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

要首先进行算术运算,您需要有一个由 4 个字符组成的数组 '+','-','*','%'

根据 char 数组拆分字符串。这你可以把它作为一个单独的功能来做。因为每次都需要调用它。我说的是性能。

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

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

这就是你所需要的。

于 2013-07-19T18:00:07.550 回答