2015-08-16 1 views
-4

Я только что закончил программировать калькулятор, который выполняет четыре основные арифметические операции, плюс шесть тригонометрических операций, в интерфейсе настолько минималистичным, что он просто позволяет пользователю вводить выражение и отображать результат, без необходимости отдельного ввода операндов и оператора ,Как отлаживать мой нетрадиционный калькулятор Java?

Я думаю, что это экономит время для пользователя и будет выглядеть более законченным из-за отсутствия лучшего слова, если оно будет работать только.

import java.util.*; 

public class Calculator 
{ 
public static String getOperator(String expression)   
{ 
    int counter=0;           

    for (int i=0; i<3; i++)         
    { 
     if (Character.isLetter(expression.charAt(i)))  
      counter++;           
    }              

    if (counter==3)          
     return expression.substring(0, 3); 
    else 
    { 
     for (int j=0; j<expression.length(); j++) 
     { 
      if (Character.isDigit(expression.charAt(j))==false) 
      { 
       if (expression.charAt(j)!='.') 
       return Character.toString(expression.charAt(j)); 
      } 
     } 
    } 

    return "false"; 
} 

public static double getFirstOperand(String operator, String expression) 
{ 
    return Double.parseDouble(expression.substring(expression.indexOf(operator)+1)); 
} 

public static String getOperatorType(String expression) 
{ 
    int counter=0; 

    for (int i=0; i<3; i++) 
    { 
     if (Character.isLetter(expression.charAt(i))) 
      counter++; 
    } 

    if (counter==3) 
     return "Trigonometrical"; 
    else 
     return "Arithemtic"; 
} 

public static double getResult(String operator, double operand) 
{ 
    if (operator.equals("sin")) 
     return Math.sin(operand); 
    if (operator.equals("cos")) 
     return Math.cos(operand); 
    if (operator.equals("tan")) 
     return Math.tan(operand); 
    if (operator.equals("cot")) 
     return 1/Math.tan(operand); 
    if (operator.equals("cosec")) 
     return 1/Math.sin(operand); 
    else 
     return 1/Math.cos(operand);  
} 

public static double getSecondOperand(String expression) 
{ 
    return Double.parseDouble(expression.substring(0, expression.indexOf(expression))); 
} 

public static double getResult(String operator, double operand1, double operand2) 
{ 
    if (operator.equals("*")) 
     return operand1*operand2; 
    if (operator.equals("+")) 
     return operand1+operand2; 
    if (operator.equals("/")) 
     return operand2/operand1; 
    else 
     return operand2-operand1; 
} 

public static void main(String[] args) 
{ 
    Scanner sc = new Scanner(System.in); 
    String command="", operator="", operatorType=""; 
    double operand1=0.0, operand2=0.0, result=0.0; 

    while (command.equals("EXIT")=false) 
    { 
     System.out.println("Enter command: "); 
     command = sc.next(); 

     operator = getOperator(command); 
     operand1 = getFirstOperand(operator, command); 
     operatorType = getOperatorType(command); 

     if (operatorType.equals("Trigonometrical")) 
      result=getResult(operator, operand1); 
     if (operatorType.equals("Arithmetic")) 
     { 
      operand2 = getSecondOperand(command); 
      result=getResult(operator, operand1, operand2); 
     } 

     System.out.println("Result="+result); 
    } 
} 
} 

Как бы то ни было, что бы я ни вводил, результат всегда равен 0.0.

Enter command: 
45*2 
Result=0.0 
Enter command: 
2+2 
Result=0.0 

Я не понимаю, где проблема. Я искал код десятки раз, но я просто этого не вижу.

ОБНОВЛЕНИЕ: Спасибо за вашу помощь, ребята. Калькулятор, наконец, работает так, как должен. Фактически, почти все проблемы были вызваны одной летальной ошибкой в ​​getSecondOperand. Я исправил код сейчас, и восстановленный код приведен ниже.

+0

Вы должны сделать некоторые отладки (а не просто глядя на ваш код). –

+0

Также рассмотрим разницу между '==' и 'equals()' ;-) – MattR

+0

В качестве начала используйте 'equals()' для сравнения строк, а не '=='. И в этом случае вы должны использовать перечисления вместо строк. – Sleafar

ответ

1

У вас есть опечатка в "Arithmetic" в getOperatorType():

public static String getOperatorType(String expression) 
{ 
    int counter=0; 

    for (int i=0; i<3; i++) 
    { 
     if (Character.isLetter(expression.charAt(i))) 
      counter++; 
    } 

    if (counter==3) 
     return "Trigonometrical"; 
    else 
     return "Arithemtic"; 
} 

Вот почему вы должны избегать Струны для таких случаев, и в пользу Enums вместо этого.

Кроме того, вы сравниваете строки, используя ==, что не будет работать. Вместо этого используйте equals(). Или используйте вместо этого Enums.

+0

В коде есть много ошибок. Я предлагаю вам использовать отладчик, чтобы узнать. – nhaarman

+0

Итак, я исправил это; Благодарю. – user3460322

+0

Но теперь я получаю еще одну ошибку (ы). – user3460322

0

Вот решение:

import java.util.*; 

public class Calculator 
{ 
public static String getOperator(String expression) 
{ 
    int counter=0; 

    for (int i=0; i<3; i++) 
    { 
     if (Character.isLetter(expression.charAt(i))) 
      counter++; 
    } 

    if (counter==3) 
     return expression.substring(0, 3); 
    else 
    { 
     for (int j=0; j<expression.length(); j++) 
     { 
      if (Character.isDigit(expression.charAt(j))==false) 
       return Character.toString(expression.charAt(j)); 
     } 
    } 

    return "false"; 
} 

public static double getFirstOperand(String operator, String expression) 
{ 
    return Double.parseDouble(expression.substring(expression.lastIndexOf(operator)+1)); 
} 

public static String getOperatorType(String expression) 
{ 
    int counter=0; 

    for (int i=0; i<3; i++) 
    { 
     if (Character.isLetter(expression.charAt(i))) 
      counter++; 
    } 

    if (counter==3) 
     return "Trigonometrical"; 
    else 
     return "Arithmetic"; 
} 

public static double getResult(String operator, double operand) 
{ 
    if (operator.equals("sin")) 
     return Math.sin(operand); 
    if (operator.equals("cos")) 
     return Math.cos(operand); 
    if (operator.equals("tan")) 
     return Math.tan(operand); 
    if (operator.equals("cot")) 
     return 1/Math.tan(operand); 
    if (operator.equals("cosec")) 
     return 1/Math.sin(operand); 
    else 
     return 1/Math.cos(operand);  
} 

public static double getSecondOperand(String expression, String operator) 
{ 
    return Double.parseDouble(expression.substring(0, expression.indexOf(operator))); 
} 

public static double getResult(String operator, double operand1, double operand2) 
{ 
    if (operator.equals("*")) 
     return operand1*operand2; 
    if (operator.equals("+")) 
     return operand1+operand2; 
    if (operator.equals("/")) 
     return operand2/operand1; 
    else 
     return operand2-operand1; 
} 

public static void main(String[] args) 
{ 
    Scanner sc = new Scanner(System.in); 
    String command="", operator="", operatorType=""; 
    double operand1=0.0, operand2=0.0, result=0.0; 
    char exitNow='0'; 

    while (exitNow=='0'||exitNow=='N') 
    { 
     System.out.println("Enter command: "); 
     command = sc.next(); 

     operator = getOperator(command); 
     operand1 = getFirstOperand(operator, command); 
     operatorType = getOperatorType(command); 

     if (operatorType.equals("Trigonometrical")) 
      result=getResult(operator, operand1); 
     if (operatorType.equals("Arithmetic")) 
     { 
      operand2 = getSecondOperand(command, operator); 
      result=getResult(operator, operand1, operand2); 
     } 

     System.out.println("Result="+result+"\nExit now(1/0)(Y/N)"); 
     exitNow=sc.next().charAt(0);    
    } 
} 
} 
Смежные вопросы