2013-07-22 4 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 

Тогда я положил, что в 2D-массив, где [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

Смежные вопросы