2013-10-09 3 views
3

이 간단한 계산기 프로그램에서 switch/case 문을 점프 테이블로 만들려면 어떻게해야합니까? Java에서 점프 테이블 구현

import java.lang.*; 
import java.util.*; 

public class Calculator 
{ 
    private int solution; 
    private static int x, y, ops; 
    private char operators; 

    public Calculator() 
    { 
     solution = 0; 
    } 

    public int addition(int x, int y) 
    { 
     return x + y; 
    } 
    public int subtraction(int x, int y) 
    { 
     return x - y; 
    } 
    public int multiplication(int x, int y) 
    { 
     return x * y; 
    } 
    public int division(int x, int y) 
    { 
     solution = x/y; 
     return solution; 
    } 

    public void calc(int ops){ 
     Scanner operands = new Scanner(System.in); 

     System.out.println("operand 1: "); 
     x = operands.nextInt(); 
     System.out.println("operand 2: "); 
     y = operands.nextInt(); 

     System.out.println("Solution: "); 

     switch(ops) 
     { 
      case(1): 
       System.out.println(addition(x, y)); 
       break; 
      case(2): 
       System.out.println(subtraction(x, y)); 
       break; 
      case(3): 
       System.out.println(multiplication(x, y)); 
       break; 
      case(4): 
       System.out.println(division(x, y)); 
       break; 
      } 
    } 
    public static void main (String[] args) 
    { 
     System.out.println("What operation? ('+', '-', '*', '/')"); 
     System.out.println(" Enter 1 for Addition"); 
     System.out.println(" Enter 2 for Subtraction"); 
     System.out.println(" Enter 3 for Multiplication"); 
     System.out.println(" Enter 4 for Division"); 

     Scanner operation = new Scanner(System.in); 
     ops = operation.nextInt(); 

     Calculator calc = new Calculator(); 
     calc.calc(ops); 


    } 
} 

내가 점프 테이블은 (온라인 어떤 설명을 찾을 수 없습니다) 그래서 나는 그것이 스위치/case 문에서 다른 방법을 모르는 정확히 모르는, 완전히 정직합니다.

사이드 노트 :이 코드는 정수만을 처리하므로 5/3을 나눈다면 1이됩니다. 어떻게 float/double을 취하도록 쉽게 변경할 수 있습니까?

+0

점프 테이블 : http://stackoverflow.com/questions/48017/what-is-a-jump-table. 함수에 대한 포인터가 전부입니다. 자바에서 할 일이 아닙니다. 나는 물어야한다, 왜 이것을하고 싶니? – tom

+0

교수님이 자바에서 포인터를 사용하려고했는데 포인터로 작업하기위한 좋은 연습으로 switch/case 문을 사용하여 점프 테이블로 전환하는 연습을 해보도록 권했습니다. 문제는 그가 무엇인지 설명하지 못했고 무엇을해야할지 모른다. –

+0

"자바의 포인터"란 무엇입니까? 당신은 참조로 전달할 수 있습니다. 비슷한 개념이지만 포인터가 아닙니다. Java에는 포인터가 없습니다. 교수님은 혼란스러워합니다. – tom

답변

0

글쎄, 난 점프 테이블 뭔지 모르겠지만, 당신은 숫자의 다른 유형을 제어 싶다면, 당신은 예를 들어 매개 변수 당신 방법을 변경할 수 있습니다 : 당신이 Double--을 싶다면

public int addition(int x, int y) 
    { 
     return x + y; 
    } 

을 >

public int addition(Double x, Double y) 

하지만 다른 모든 클래스가 번호에서 확장되는 유형을 사용자에게 강력히 권고합니다.

Number.class

예는 :

바와 같이
public static String numeroToLetra(Number num) 
    { 
    Integer numero = Integer.valueOf(num.intValue()); //int value 
    Double numero = Double.valueOf(num.doubleValue());........ 
}//so you can pass whatever type of number. 
+0

답변 끝나면 귀하의 추천을 조금 더 설명 할 수 있습니까? 나는 당신이 의미하는 것을 이해하지 못합니다. –

+0

프로그램에서 거의 모든 'int'를 'double'로 변경하고 거기에서부터 시도해보십시오. (작업을 읽는 비트를 변경하지 마십시오!) – tom

+0

감사합니다.이 점프 테이블 문제를 파악하기 위해이 작업이 필요합니다. –

2

, 점프 테이블은 함수 오프셋/포인터 배열이다. C/C++과 달리 Java는 실제로 함수 포인터를 가지고 있지 않다. (Function Pointers in Java)

그러나 당신은 가장 할 수 있고 그것을 객체 지향적으로 할 수있다. 하나의 메소드 (f)로 기본 클래스 (Funky)를 정의하십시오. 함수 연산 (+, -, *,/등)마다 하나씩 mutiple 자식을 파생시키고 각 자식에 대한 단일 객체를 만듭니다 (결국 인터페이스 일뿐입니다). 유형 (펑키).

예 귀하의 인수에

조회 테이블에서 작동하고, 메소드를 호출 (? 또는 당신이 행복하게 만드는 인터페이스)

는 기본 클래스를 정의합니다. 당신이 클래스를 확장하는 경우, 당신은 기본적으로 기본 클래스 메서드를 사용합니다 (오류 메시지를 생성하거나 예외를 던질) 수

public class X 
//or, public interface X 
{ 
    //method 
    Z fun(Z z1, Z z2) 
    { 
     //nothing to see here 
    } 
} 

class X1 extends X //or, implements X 
{ 
    public Z fun(Z z1, Z z2) 
    { 
     //variant1 stuff here 
    } 
} 
... 
public class Xn extends X //or, implements X 
{ 
    public Z fun(Z z1, Z z2) 
    { 
     //variantn stuff here 
    } 
} 

아를 참고하면 인스턴스를 필요로하고,로로드됩니다 배열 (jumptable).

특정 언어에 대해 관용적 인 특정 기술이 있으며 jumptables는 시스템 일뿐 아니라 Java 관례보다는 Java 관용구입니다.

+0

좋지만 시작하기가 정말 어렵습니다 ... + 1. – ZaoTaoBao