2012-12-24 4 views
0

나는 운동량을 입력 할 수있는 계산기를 만들려고합니다.GUI가없는 간단한 자바 계산기

예 :

나는 이런 식으로 뭔가를 시도 ...

import java.util.*; 

public class Calc { 

String sum; 


    public static void main(String[]args){ 

      Scanner sum = new Scanner(System.in); 

      System.out.println("Please enter a sum: "); 

      double newsum = Integer.parseInt(sum); 

      sum.close();    

      System.out.println(newsum); 

    } 

} 
+3

지금까지 해보신 것은 무엇입니까? 일부 코드를 게시하면 어디서 잘못되었는지 알 수 있습니다. –

+0

자신 만의 제품을 만드는 것보다 이미 존재하는 제품을 사용해 보는 것이 어떻습니까? 예를 들어, parboiled는 그러한 계산기 예제를 가지고 있습니다. – fge

+0

* "내가 할 수있는 아이디어는?"* 어디서부터 시작해야할지 모르십니까? [이 도움말] (http://www.patriciashanahan.com/beginner.html)을 검토하십시오. –

답변

1

당신은 그것을 위해 ANTLR을 사용할 수 있습니다. 샘플 계산기 here을 찾을 수 있습니다.

편집

당신은 ANTLR을 사용하는 경우 매우 쉽게 미래 예를 들어, 더 많은 기능을 추가 할 수 있습니다 괄호 사용법, 일부 계산 방법 (예 : round, sin, cos).

+3

저는 ANTLR이 계산기를 쓰는 데 어려움을 겪고있는 누군가에게 적절하다고 생각하지 않습니다. –

+0

계산기에서 가장 큰 문제는 *가 +보다 우선 순위가 높다는 것입니다. 즉 1 + 2 * 3은 1+ (2 * 3)과 같습니다. 같은 것들에 대해 : 1 + 2 * 3-5 * 5 또는 전원 기호 (^) 등 추가. 반면에 나는 당신이 계산기의 모든 요구 사항을 모르겠다. 저는 개인적으로 시간을 보내고 ANTLR을 조사 할 것입니다. 정말 멋진 자습서 세트를 제공하므로 같은 시간에 Java를 마스터하는 것이 매우 유용합니다. – Tom

+0

우리는 그가 우선 순위를 시행하고 있는지 모른다. ANTRL은 훌륭한 도구입니다. 초보자가 그것을 믹스에 추가하는 것을 권장하지 않습니다. –

3

문자열 표현으로 모든 것을 얻은 후에는 내장 된 자바 스크립트 엔진을 사용하여 표현식을 평가할 수 있습니다. 당신이 재미를 위해 그것을 위해 노력 배우고 어쩌면 가치가 디자인 후두둑을 고려있어 최적의 솔루션에 대한 조사를하는 경우

import java.util.Scanner; 
import javax.script.ScriptEngineManager; 
import javax.script.ScriptEngine; 

public class Example { 
    public static void main(String[] args) throws Exception { 
     System.out.println("Please enter an expression: "); 
     String toEval = new Scanner(System.in).next(); 
     ScriptEngineManager mgr = new ScriptEngineManager(); 
     ScriptEngine jsEngine = mgr.getEngineByName("JavaScript"); 
     System.out.println(jsEngine.eval(toEval)); 
    } 
} 
+0

유일한 문제는 * 너무 많이 할 수도 있지만 거의 코딩하지 않는 것입니다. 멋진 코드입니다. –

+0

정말 대단한 감사입니다. 조금 놀아보고 사용해보십시오! – hunterge

0

다른 표정 평가 요령을 가진 this 좋은 기사를 보시기 바랍니다. 또한, 여기에 간단한 예제입니다 참조 수학 식에 충분 Jexel, 에 포함 브래킷

JexlEngine jexl = new JexlEngine(); 
Expression func = jexl.createExpression("x1*x2-x3"); 
MapContext mc = new MapContext(); 
mc.set("x1", 5); 
mc.set("x2", 3); 
mc.set("x3", 2); 
System.out.println(func.evaluate(mc)); 
0

이 늘 일, 나는 그것을 테스트하지 않은,하지만 같은 솔루션 이게 작동 할 수도 있습니다

for(int i = 0; i < equation.length; i++) { 
    char c = equation.charAt(i); 
    if(c == '*' || c == '/') {  // Operators with highest precedence 
     double op1 = getNumBeforeIndex(i); 
     double op2 = getNumAfterIndex(i, equation); 
     double answer; 

     switch(c) {     // Perform sum 
     case '*': 
      answer = op1 * op2; 
      break; 
     case '/': 
      answer = op1/op2; 
      break; 
     } 
    equation = replaceSumWithAnswer(i, equation, answer); 
    }   
} 

그런 다음 + 및 -와 동일하게 수행하십시오.

'getNumBeforeIndex'및 'getNumAfterIndex'의 경우 숫자가 아닌 문자를 찾을 때까지 지정된 인덱스에서 반복해야합니다. 또한 소수점과 음수를 허용해야한다는 것을 기억해야합니다.

'replaceSumWithAnswer'메서드는 첫 번째 피연산자의 시작에 대한 인덱스를 가져온 다음 두 번째 피연산자의 마지막 인덱스에 대한 인덱스를 가져온 다음 하위 문자열을 대답으로 바꿔야합니다.

올바른 방향으로 안내 할 수 있기를 바랍니다.

0

글쎄, 이것은 쉬운 질문이지만, 대답은 조금 복잡합니다. 식의 문법에 대한 가정없이이 식을 구문 분석 할 수 없습니다. 그것은 중위 어/후위/접두어입니까? 괄호를 사용합니까? 추가 commutatiove인가? 곱셈은 ​​왼쪽 또는 오른쪽 연관입니까? *와 + 기호의 실제 의미는 무엇입니까?

계산기를 구성하는 동안 수십 가지의 결정이 내려 지므로 Java 프로그래밍 언어에는 기본적으로 제공되는 평가 지원이 없습니다. 표준적인 의미의 작업을 원하면 라이브러리를 사용하십시오. 비표준 동작을 원한다면 자신 만의 문법을 작성하십시오.대괄호를 사용하려면 푸시 푸시 오토 마톤이 구현되어야합니다. LL1 문법과 함께 사용하는 것이 좋습니다.

하지만 이런 종류의 질문을 할 때 나는 당신이 자바와 프로그래밍에 익숙하지 않다고 생각한다. 나는 당신이 그것을 시도하도록 조언하지 않을 것이다, 당신은 automatons와 문법의 이론으로부터의 약간의 기초를 필요로한다.

자바를 배우고있을 때도이 문제가 발생하고 프로그램을 윈도우 계산기로 입력하여 해결했습니다. 프로그램에는 현재 결과를 집계 한 하나의 레지스터가 포함되어 있으며 각 작업 후에 프로그램에서 사용자에게 다음 쿼리를 쿼리했습니다 (매우 간단한 파서를 사용하여이를 수행 할 수도 있지만 계산기는 연산자의 우선 순위를 인식하지 못합니다).