所以我有这个项目要做,我需要读取一个名为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。 然后我必须做第一行所说的方程式,我将如何继续这样做?谢谢!
答案 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();
}
}
感谢大家的帮助!