2016-10-17 4 views
1

私はできることをテストするために電卓を作っていますが、私は小さな問題があります。私は私の "入力"メソッドで入力パラメータを取って、文字列として数字を入力させ、シンボルの両側に倍精度を解析させようとしています。しかし、私はこれを行う方法がわかりません。私はif文を使用することを考えていました。if(symbol)メソッドを実行するようなものでした。複数のシンボルで分割してシンボルに基づいてメソッドを呼び出す方法

public class Calculation_Controls extends JPanel implements ActionListener, KeyListener{ 

public double A, B; 

public String input(String nums){ 
    String[] split = nums.split("[-.+,/,*,^]"); 
    int left = Integer.parseInt(split[0]); 
    int right = Integer.parseInt(split[1]); 

} 

//What I am trying to invoke for the "if (symbol)" 
public double add(double a, double b){ 
    this.a = A; 
    this.b = B; 
    return (a + b); 
} 

public double subtract(double a, double b){ 
    this.a = A; 
    this.b = B; 
    return a - b; 
} 

public double multiply(double a, double b){ 
    this.a = A; 
    this.b = B; 
    return a * b; 
} 

public double divide(double a, double b){ 
    this.a = A; 
    this.b = B; 
    return a/b; 
} 

public double pwr(double a, double b){ 
    this.A = a; 
    this.B = b; 
    return (Math.pow(a, b)); 
} 
+1

それで 'if else'や' switch'文を使ってシンボルに基づいてメソッドを呼び出すとどうなりますか? –

+0

'split'よりも正規表現を使うほうがいいです。区切り文字が何であるか気にしない場合、 'split'は最も便利です。これは、ここでは当てはまりません。また、 '.'を演算子として扱わないでください。あなたが書いたように、ユーザが '2.03'を置くと' split'は演算子のように '.'を扱い、両側の整数を解析して2と3を与えます。これはあなたが望むものではありません。 '.'を演算子のリストの外に残して、' Double.parseDouble'を使用します。 – ajb

+0

@ajb 'split'は正規表現をとり、Jarredが使用する奇妙な正規表現を使用すると、すでに2.03で2にジャンプします。 – Robert

答えて

0

あなたが期待する入力フォーマットは、「5 * 6」のための一般的な文字列であると仮定すると::

public class Calculation_Controls { 

    private String[] operators = new String[] {"-","+","/","*","^"}; 

    public void input(String nums){ 

     //add: check input is valid 

     String operator = findSymbol(nums); 
     if(operator == null) { 
      System.out.println("Invalid input"); 
      return; 
     } 
     String[] split = nums.split(operator); 
     int left = Integer.parseInt(split[0]); 
     int right = Integer.parseInt(split[1]); 
     double result = 0; 

     switch (operator) { 

     case "-": 
      result = subtract(left, right); 
      break; 
     case "+": 
      result = add(left, right); 
      break; 
     case "/": 
      result = divide(left, right); 
     case "*": 
      result = multiply(left, right); 
      break; 
     case "^": 
      result = pwr(left, right); 
      break; 
     default: System.out.println("Invalid operator");  
     } 

    } 

    private String findSymbol(String nums) { 

     for(String operator : operators) { 
      if(nums.contains(operator)) 
       return operator; 
     } 

     return null; 
    } 

    public double add(double a, double b){ 
     return (a + b); 
    } 

    public double subtract(double a, double b){ 

     return a - b; 
    } 

    public double multiply(double a, double b){ 

     return a * b; 
    } 

    public double divide(double a, double b){ 

     return a/b; 
    } 

    public double pwr(double a, double b){ 

     return (Math.pow(a, b)); 
    } 
} 

注:私はそれをテストしていない、次のようにコードがあります。

0

あなたは

以下のようなインターフェースを使用することにより、スイッチケースOR場合を使用することができます。

interface Operation { 
     public double resultFor(double left, double right); 
    } 

class Calculation_Controls extends JPanel implements ActionListener, KeyListener{ 
    public double a, b; 
    Map<Character, Operation> operations = new HashMap<Character, Operation>(); 

    public Calculation_Controls() { 
     operations.put('*', new multiply()); 
     operations.put('-', new subtract()); 
     operations.put('+', new Add()); 
     operations.put('/', new divide()); 
     operations.put('^', new pwr()); 
    } 

    public String input(String nums) { 
     String[] split = nums.split("[-.+,/,*,^]"); 
     for (int i = 0; i < split.length; i++) { 
      System.out.println("" + split[i].length()); 
     } 
     char operation = nums.charAt(split[0].length()); 
     int left = Integer.parseInt(split[0]); 
     int right = Integer.parseInt(split[1]); 
     double result = 0; 
     Operation op = operations.get(Character.valueOf(operation)); 
     if (op != null) { 
      result = op.resultFor(left, right); 
      System.out.println("Result :" + result); 
     } else { 
      System.out.println("Error: Unknown operator"); 
     } 
     return String.valueOf(result); 
    } 

    class Add implements Operation { 
     @Override 
     public double resultFor(double left, double right) { 
      return (left + right); 
     } 

    } 

    class subtract implements Operation { 
     @Override 
     public double resultFor(double left, double right) { 
      return left - right; 
     } 

    } 

    class divide implements Operation { 
     @Override 
     public double resultFor(double left, double right) { 
      return left/right; 
     } 

    } 

    class multiply implements Operation { 
     @Override 
     public double resultFor(double left, double right) { 
      return left * right; 
     } 

    } 

    class pwr implements Operation { 
     @Override 
     public double resultFor(double left, double right) { 
      return (Math.pow(left, right)); 
     } 

    } 
} 

それを使用するには、次の

Calculation_Controls研=新しいCalculation_Controlsを(); inst.input( "2^4");

関連する問題