2013-07-22 44 views
1

我正在制作一个简单的程序,它将测试儿童的问题解决技能,本质上是一个测验,其中程序从文本文件中提取问题,然后打印出问题并检查用户输入正确的答案。从文本文件导入公式

到目前为止,我有这个作为我的文本文件:

David collects 2 comics each month for 3 months. For the next 2 months, he only collects one each month. How many comics does David collect altogether?,8 
Sally gives out 4 party bags at the end of her party. Inside each party bag are 5 balloons. How many balloons does Sally give out?,20 

然后,我将它放入一个二维数组,[0] [0]是第一个问题,[0] [1]是第一个答案。 这是有效的,但我想使用随机数字,这意味着程序必须自己计算答案。这将意味着我的文本文件看起来像这样:

David collects X comics each month for Y months. For the next Z months, he only collects one each month. How many comics does David collect altogether?,((X*Y)+Z) 
Sally gives out X party bags at the end of her party. Inside each party bag are Y balloons. How many balloons does Sally give out?,(X*Y) 

其中X,Y和Z是随机数和逗号之后的部分是计算答案的公式。要打印出这个问题,我可以使用if (Question.contains("X")){Question = Question.replace("X", A);}其中A是一个随机int。但是我怎样才能让Java计算出答案呢?如果我在字符串中有int answer=((X*Y)+Z),我该如何将此字符串转换为代码?我读过Java Compiler API可以将字符串更改为可用的代码,但这是如何工作的?

感谢

回答

1
import javax.script.*; 
import java.util.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 
    Map<String, Object> vars = new HashMap<String, Object>(); 
    vars.put("X", 2); 
    vars.put("Y", 1); 
    vars.put("Z", 3); 
    System.out.println("result = "+engine.eval("((X*Y)+Z)", new SimpleBindings(vars))); 
} 
} 

使用javax.script中,你可以分析和解决简单的公式,并生成随机数

(int) (Math.random()*20))应该这样做

+0

这是完美的,谢谢。为了创建随机数,我通常使用'int a = random.nextInt(10)',这和你提到的'(int)(Math.random()* 20))有什么区别? –

+0

它基本上是一样的,除非你对线程安全感兴趣,并且分配的不一致性,任何给你随机的方法都应该这样做。主要区别在于math.random是线程安全的,两者的用法还有其他差异,但只有当您生成非常大的数字集并且希望分布均匀时才是重要的。 – user1820801