2012-03-10 1 views
0

Я пытаюсь создать простой калькулятор, который вычисляет в соответствии с приоритетом. Метод передается строка (выражение), которая должна быть решена. То, как я это делаю, - это сначала разбор строки на два вектора, один из которых содержит числа, а другой - операнды. После того, как я успешно проанализировал строку, я затем вычислил и вернул ответ. Я получаю java.util.InputMismatchException из класса сканера, который я использую. Вот мой код:Простой калькулятор с использованием Java-сканера и векторных классов

public static int performCalc(String problem) 
{ 
    // 3 * 2 + 4/1 + 2 + 4 
    Pattern op = Pattern.compile("[*/+-]"); 
    String prob; 
    Vector<Integer> nums = new Vector(); 
    Vector<String> operands = new Vector(); 
    int answer = 0, index = 0, numOne, numTwo; 
    Scanner scNums = new Scanner(problem); 
    Scanner scOperands = new Scanner(problem); 
    while(scNums.hasNext()) 
    { 
     nums.add(scNums.nextInt()); 
    } 
    while(scNums.hasNext()) 
    { 
     operands.add(scNums.next(op)); 
    } 
    for(int i = 0; i<operands.size(); i++) 
    { 
     if(operands.get(i) == "*" || operands.get(i) == "/") 
     { 
      nums.set(i, calc(nums.get(i), operands.get(i), nums.get(i+1))); 
      nums.remove(i+1); 
     } 
    } 
    for(int i = 0; i<operands.size(); i++) 
    { 
     if(operands.get(i) == "+" || operands.get(i) == "-") 
     { 
      nums.set(i, calc(nums.get(i), operands.get(i), nums.get(i+1))); 
      nums.remove(i+1); 
     } 
    } 
    return nums.firstElement(); 
} 
public static int calc(int numOne, String operand, int numTwo) 
{ 
    if(operand == "*") 
     return numOne*numTwo; 
    if(operand == "/") 
     return numOne/numTwo; 
    if(operand == "+") 
     return numOne+numTwo; 
    if(operand == "-") 
     return numOne-numTwo; 
    return 0; 
} 

Есть ли лучше и более элегантный способ разбора строки (или подойти к проблеме)? Что я делаю не так? Отладчик не дает много информации об ошибке.

ответ

0

им не уверен, если это проблема, но не следует код второй в то время как петля будет

while(scOperands.hasNext()) 
0

В первом цикле

while(scNums.hasNext()) 

вы читаете данные из входного параметра (проблема), где, я полагаю, вы передали строку с целыми числами и операндами (что-то вроде «3 * 2 +»). Поэтому, когда вы вызываете nextInt на знак «*», вы получаете InputMismatchException.

Возможно, вы хотите написать что-то вроде этого (будьте осторожны - то, что может произойти, если есть нечетное число знаков входного параметра):

Scanner scanner = new Scanner(problem); 
while(scanner.hasNext()) 
{ 
    nums.add(scanner.nextInt()); 
    operands.add(scanner.next(op)); 
} 
0

лично я хотел бы использовать Reverse Polish Notation (RPN). Сначала это может сбивать с толку, но как только вы понимаете синтаксис, его очень легко реализовать со стеком. Вместо того, чтобы иметь дело со сканером, ваш ввод может быть таким же простым, как строка с разделителями. Here - пример реализации, который я нашел в Интернете. Удачи!