2016-02-06 4 views
2

В настоящее время я создаю игру для математики, которая выдает случайные арифметические вопросы пользователю. У меня есть функция, в которой он создает вопросы и сохраняет их в массиве строк. Вопросы могут различаться в количестве целых чисел, присутствующих в вопросе; например вопрос может быть 3 + 4-9/3 = или 4 * 2/9 =, но минимальное количество целых чисел, которое должно присутствовать, равно 2. например. 3 + 4 = и т. Д.Как вычислить выражение слева направо

То, что я пытаюсь сделать, - это оценить вопрос, прочитав его слева направо, игнорируя порядок операций. Например. 4 + 2 * 5 = должна быть равна 30 вместо 14.

Мое мышление к этой проблеме заключается в следующем:

Получить вопрос, зацикливание через строку и извлекать отдельные символы и хранить их в ArrayList. Преобразуйте эти символы в int и сначала оцените первые три элемента в arraylist, сохраните ответ во временной переменной int. Получите следующие 2 элемента и проверьте, не содержит ли они знак равенства, если он не оценивает временное значение int этими двумя элементами. Продолжайте делать это, пока он не найдет знак равенства. Если он найдет знак равенства, остановите итерацию и произведите результат.

Какова моя проблема в том, что я не могу преобразовать операции +, -, *,/в значения int. Я думал, что могу, поскольку каждый символ может быть преобразован в int.

public void initAnswers(){ 
    for(int i =0; i < questions.length; i++){ 
     ArrayList<Integer> indivialIntegers = new ArrayList<>(); 
     String questionToGetIndividual = questions[0]; 
     //extracting individual chars 
     for(int j = 0; j < questionToGetIndividual.length(); j++){ 
      indivialIntegers.add(Character.getNumericValue(questionToGetIndividual.charAt(j))); 
     } 
    } 

EDIT = Это мой обновленный код. Я получаю ошибку исключения формата в формате. Вызвано: java.lang.NumberFormatException: Недействительно int

Может ли кто-нибудь понять, почему? Кстати, я написал метод генерации вопросов (количество сумм в вопросах генерируется случайным образом). Они хранятся в массиве. Я просто просто повторяю каждый вопрос в этом массиве и оцениваю ответ: Моя стартовая функция - initAnswers().

public int computeAnswerThreeTerms(int numberOne, int numberTwo, String operation){ 
    if(operation.equals("+")){ 
     Log.d("onc","in addition"); 
     return numberOne + numberTwo; 
    }else if(operation.equals("-")){ 
     Log.d("onc","in subtraction"); 
     return numberOne - numberTwo; 
    }else if(operation.equals("/")){ 
     Log.d("onc","in division"); 
     return numberOne/numberTwo; 
    }else if(operation.equals("*")){ 
     Log.d("onc","in multiplication"); 
     return numberOne * numberTwo; 
    }else{ 
     return 0; 
    } 
} 

public int computeAnswer(int numberOne, String operation, int runningTotal){ 

    if(operation.equals("+")){ 
     Log.d("onc","in addition"); 
     return numberOne + runningTotal; 
    }else if(operation.equals("-")){ 
     Log.d("onc","in subtraction"); 
     return numberOne - runningTotal; 
    }else if(operation.equals("/")){ 
     Log.d("onc","in division"); 
     return numberOne/runningTotal; 
    }else if(operation.equals("*")){ 
     Log.d("onc","in multiplication"); 
     return numberOne * runningTotal; 
    }else{ 
     return 0; 
    } 
} 

public void getAnswer(ArrayList<String> toBeExamined){ 
    //get numbers and put them in an array 
    //get operations and put them in an array 
    for(int i =0; i < toBeExamined.size(); i++){ 
     String extractingIntegers = toBeExamined.get(i); 
     // /d matches digits /D matches non digits 
     String[] numbersInStringformat = extractingIntegers.split("/d"); 
     ArrayList<Integer> numbersInNumberformat = new ArrayList<>(); 
     for(int counter = 0; counter < numbersInStringformat.length; counter++){ 
      numbersInNumberformat.add(Integer.parseInt(numbersInStringformat[counter])); 
     } 
     String[] operationsInStringformat = extractingIntegers.split("/D"); 

     int tempAnswer; 
     int tempIntCounter =0; 
     int stringCounter =0; 
     tempAnswer = computeAnswerThreeTerms(numbersInNumberformat.get(tempIntCounter), numbersInNumberformat.get(tempIntCounter+1), operationsInStringformat[stringCounter]); 
     tempIntCounter = 1; 
     while(!operationsInStringformat[1].equals("=")){ 
      if(operationsInStringformat[stringCounter].equals("=")){ 
       break; 
      } 
      tempAnswer = computeAnswer(numbersInNumberformat.get(tempIntCounter++),operationsInStringformat[stringCounter],tempAnswer); 
     } 
     answers[i] = tempAnswer; 

    } 
} 

public void initAnswers(){ 
    ArrayList<String> individualCharacters = new ArrayList<>(); 

    for(int i =0; i < questions.length; i++){ 
     //change i to 0 for testing purposes 
     String questionToGetIndividual = questions[i]; 
     //extracting individual chars 
     individualCharacters.add(questionToGetIndividual); 
    } 
    getAnswer(individualCharacters); 
} 
+1

если Youre игнорируя порядок операций, то почему бы не просто прочитать строку из не слева направо полукокса-на-гольца, пока вы достигните символа без цифр, и это ваш первый номер и т. д. и т. д. – Infested

+0

@Infested, но как узнать, нужно ли мне добавлять, умножать, вычитать это число и т. д.? –

+0

вы можете читать и проверять каждый символ, и если это не номер, это одна из четырех операций с полем –

ответ

0

То, что вы в основном нужно сделать, это:

  • Parse int[] операнды из вашего вопроса (скажем n пунктов);
  • Анализ Operator[] операторов (+ -/*). Это будет n-1 элементов. Operator - это простой enum с преобразователем от char до значения & функция для применения Operator до 2 операндов;
  • Идите в цикл через массив операторов, применяя их к текущему значению & operand;

АОЛО, проверить этот вопрос: What's a good library for parsing mathematical expressions in java?

+0

Что делать, если int int является двойной цифрой, например, 33? Это приведет к заполнению двух индексов, а не одного индекса –

+0

@TarikhChouhan - просто напишите для него правильный парсер. Например, вы можете разделить строку на символы «+ -/*» и преобразовать все подстроки в целые числа –

0

Здесь вы идете

String question = "11+2*3="; 
     int first = Integer.MAX_VALUE; 
     int second = 0; 
     int result = 0; 
     boolean firstNumber = true; 
     String operator = ""; 
     String number = ""; 

    for(char c : question.toCharArray()) { 
     if(c != '+' && c != '-' && c != '*' && c != '/' && c != '=') { 
      number += c; 
     } else { 
      if(firstNumber) { 
       first = Integer.parseInt(number); 
       firstNumber = false; 
       operator += c; 
       number = ""; 
       result = first; 
      } else { 
       second = Integer.parseInt(number); 
       //firstNumber = true; 
       switch(operator) { 
       case "+": 
        result = result + second; 
        break; 
       case "-": 
        result = result - second; 
        break; 
       case "*": 
        result = result * second; 
        break; 
       case "/": 
        result = result/second; 
        break; 
       } 
       number = ""; 
       operator = ""; 
       operator += c; 
       if(operator.equals("=")) { 
        System.out.println(result); 
        return; 
       } 
      } 
     } 
    } 
Смежные вопросы