我需要创建一个java程序来评估输入文件中的表达式,并将结果返回到输出文件中。它需要考虑运算符优先级,一元和二元运算符,括号匹配,并且必须仅依赖递归(没有堆栈或队列)。
我整晚都在考虑这件事,这让我感到沮丧。我不是要求为我编写的整个java程序。我只需要一些指导。我从编写一些伪代码开始,但我认为它没有任何好处:
输入:从中读取每个表达式的文本文件。 输出:重复每个表达式的文本文件,以及打印结果。
Algorithm SecondCalc()
{
input = “expressions.txt”;
output = “out.txt”;
if (input.currentLine has something)
{
line = input.currentLine;
output.write(line);
line = line.replace(“-space-”, “”);
evaluate(line);
//...to be continued
}
}
Algorithm evaluate(line)
{
for(i = 0 to line.length)
{
if(i == “(” or “)” ) exit loop;
if(i == “!”) exit loop;
if(i == “^”) exit loop;
if(i == “*” or “/” ) exit loop;
if(i == “+” or “-” ) exit loop;
if(i == “>” or “>=” or “<” or “<=” ) exit loop;
if(i == “==” or “!=” ) exit loop;
if(i == “$”) exit loop;
}
temp1 = line from index 0 to i;
temp2 = line from index i + 1 to line.length;
if(i == “!”) then evaulate(temp1!);
//...to be continued
}
任何提示将不胜感激。感谢。
答案 0 :(得分:0)
我建议阅读波兰表示法。它是存储数学函数的好方法。例如+ cos a b - &gt; cos(a)+ b而cos + a b - &gt; COS(A + B)。没有含糊之处。此外,右边的术语优先于左边的术语。
我很久以前就写过一个符号逻辑操纵器,读取字符串肯定很难。以下是我建议的流程:
答案 1 :(得分:0)
我注意到的第一件事就是你说想要运算符优先级,但是在你的evaluate
中你忽略了运算符优先级,实际上先执行先到先服务,它们使用相同的优先级来处理它们。如果您的目标确实是模拟运算符优先级(我假设输入看起来像java的表达式)那么我建议您在处理其他运算符之前先正确处理某些运算符,或者正确地重新排列输入匹配其他样式,如波兰表示法。
对于这两种情况,我会做一个类似的过程:而不是像你现在那样在for循环中的if语句后面的if语句,尝试for循环后循环,其中每个for循环查找特定的运算符和&#34;做某事&#34;。
for(i = 0 to line.length)
{
if(i == “(” or “)” ) doSomething;
}
for(i = 0 to line.length)
{
if(i == “!” ) doSomething;
}
for(i = 0 to line.length)
{
if(i == “^”) doSomething;
}
for(i = 0 to line.length)
{
if(i == “*” or “/” ) doSomething;
}
for(i = 0 to line.length)
{
if(i == “+” or “-” ) doSomething;
}
for(i = 0 to line.length)
{
if(i == “>” or “>=” or “<” or “<=” ) doSomething;
}
for(i = 0 to line.length)
{
if(i == “==” or “!=” )doSomething;
}
for(i = 0 to line.length)
{
if(i == “$”)doSomething;
}
}
有很多需要改进的地方,但希望这能指出你正确的方向。