2016-01-12 92 views
2

如何用一個更新變量「str」來匹配運算符「+ -/*」和「ADD,SUB,DIV或MULT」的方法?當它通過case語句運行時,我試圖弄清楚如何讓case語句識別通過掃描儀輸入選擇的操作符,並將其與其各自的描述符字符串進行匹配。將四種方法合併爲一個

import java.util.Scanner; 

    public class Testor4 { 
    public static void main(String[] args) { 
    String s1 = getInput("Enter a number: "); 
    String s2 = getInput("Enter second number"); 
    String op = getInput("Enter operator: + -/* "); 
    double result = 0; 
    String str = " You chose to"; 
    try{ 
     switch(op){ 
     case "+": str += getOpNameAdd(str); result = getSum(s1,s2); break; 
     case "-": str += getOpNameSub(str); result = getSub(s1,s2); break; 
     case "/": str += getOpNameDiv(str); result = getDiv(s1,s2); break; 
     case "*": str += getOpNameMult(str); result = getMult(s1,s2); break; 
     default: System.out.println("not an operator."); return; 
     } 
    }catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 
    System.out.printf("%s%s%.2f","Result is: ",str,result); 
    } 
    private static double getSum(String s1, String s2){ 
    double d1 = Double.parseDouble(s1); 
    double d2 = Double.parseDouble(s2); 
    return d1 + d2; 
    } 
    private static double getSub(String s1, String s2){ 
    double d1 = Double.parseDouble(s1); 
    double d2 = Double.parseDouble(s2); 
    return d1 - d2; 
    } 
    private static double getDiv(String s1, String s2){ 
    double d1 = Double.parseDouble(s1); 
    double d2 = Double.parseDouble(s2); 
    return d1/d2; 
    } 
    private static double getMult(String s1, String s2){ 
    double d1 = Double.parseDouble(s1); 
    double d2 = Double.parseDouble(s2); 
    return d1 * d2; 
    } 
    public static String getOpNameAdd(String str){ 
    return str = " ADD!"; 
    } 
    public static String getOpNameSub(String str){ 
    return str = " Subtract!"; 
    } 
    public static String getOpNameDiv(String str){ 
    return str = " Divide!"; 
    } 
    public static String getOpNameMult(String str){ 
    return str = " Multiply!"; 
    } 
    public static String getInput(String prompt){ 
    System.out.println(prompt); 
    Scanner sc = new Scanner(System.in); 
    return sc.nextLine(); 
    } 
    } 
+0

你看到了什麼,當你通過一個調試器運行你的代碼? – shoover

+0

什麼?它工作正常。沒有問題需要調試。你是否嘗試過運行並失敗?問題是如何組合底部的四個方法來完成一件特定的事情,並返回單詞「ADD

+0

不,我沒有,但你說:「我正在設法弄清楚如何讓案件陳述識別操作員」,這聽起來就像你在那部分有問題。 – shoover

回答

1
public class Testor4 { 
public static void main(String[] args) { 
    String s1 = getInput("Enter a number: "); 
    String s2 = getInput("Enter second number"); 
    String op = getInput("Enter operator: + -/* "); 
    double result = 0; 
    String str = " You chose to"; 
    try { 
     switch (op) { 
     case "+": 
      str += getOpName(op); 
      result = getSum(s1, s2); 
      break; 
     case "-": 
      str += getOpName(op); 
      result = getSub(s1, s2); 
      break; 
     case "/": 
      str += getOpName(op); 
      result = getDiv(s1, s2); 
      break; 
     case "*": 
      str += getOpName(op); 
      result = getMult(s1, s2); 
      break; 
     default: 
      System.out.println("not an operator."); 
      return; 
     } 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
    System.out.printf("%s%s%.2f", "Result is: ", str, result); 
} 

private static double getSum(String s1, String s2) { 
    double d1 = Double.parseDouble(s1); 
    double d2 = Double.parseDouble(s2); 
    return d1 + d2; 
} 

private static double getSub(String s1, String s2) { 
    double d1 = Double.parseDouble(s1); 
    double d2 = Double.parseDouble(s2); 
    return d1 - d2; 
} 

private static double getDiv(String s1, String s2) { 
    double d1 = Double.parseDouble(s1); 
    double d2 = Double.parseDouble(s2); 
    return d1/d2; 
} 

private static double getMult(String s1, String s2) { 
    double d1 = Double.parseDouble(s1); 
    double d2 = Double.parseDouble(s2); 
    return d1 * d2; 
} 

public static String getOpName(String op) { 
    String opName = "not an operator."; 
    switch (op) { 
    case "+": 
     opName = " ADD!"; 
     break; 
    case "-": 
     opName = " Subtract!"; 
     break; 
    case "/": 
     opName = " Divide!"; 
     break; 
    case "*": 
     opName = " Multiply!"; 
     break; 
    } 
    return opName; 
} 

public static String getInput(String prompt) { 
    System.out.println(prompt); 
    Scanner sc = new Scanner(System.in); 
    return sc.nextLine(); 
} 

}

3

爲什麼不這樣做?

try{ 
    switch(op){ 
    case "+": str += " ADD!"; result = getSum(s1,s2); break; 
    case "-": str += " Subtract!"; result = getSub(s1,s2); break; 
    case "/": str += " Divide!"; result = getDiv(s1,s2); break; 
    case "*": str += " Multiply!"; result = getMult(s1,s2); break; 
    default: System.out.println("not an operator."); return; 
    } 
}catch(Exception e){ 
    System.out.println(e.getMessage()); 
} 

如果字符串將在其他地方重複使用,你也可以做一個字符串常量:

public static final String OpNameAdd = " ADD!"; 
1

我會先寫一個enum(如Operation這裏)來封裝行爲,名稱和符號。類似的,

enum Operation { 
    ADD("+", "Addition"), SUBTRACT("-", "Subtraction"), // 
    MULTIPLY("*", "Multiplication"), DIVIDE("/", "Division"); 
    String operSymbol; 
    String operName; 

    Operation(String operSymbol, String operName) { 
     this.operSymbol = operSymbol; 
     this.operName = operName; 
    } 

    String getName() { 
     return operName; 
    } 

    String getSymbol() { 
     return operSymbol; 
    } 

    public static Operation fromString(String str) { 
     if (str != null) { 
      str = str.trim(); 
      if (!str.isEmpty()) { 
       for (Operation o : Operation.values()) { 
        if (str.equals(o.getSymbol())) { 
         return o; 
        } 
       } 
      } 
     } 
     return null; 
    } 

    public double performOperation(String s1, String s2) { 
     Double d1 = Double.parseDouble(s1); 
     Double d2 = Double.parseDouble(s2); 
     switch (this) { 
     case SUBTRACT: 
      return d1 - d2; 
     case MULTIPLY: 
      return d1 * d2; 
     case DIVIDE: 
      return d1/d2; 
     case ADD: 
     default: 
      return d1 + d2; 
     } 
    } 
} 

請不要爲每個提示打開一個新的掃描儀。我會把它傳遞給方法。像,

public static String getInput(Scanner sc, String prompt) { 
    System.out.println(prompt); 
    return sc.nextLine(); 
} 

那麼你main方法很簡單,你需要的輸入和調用上的Operation

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    String s1 = getInput(sc, "Enter a number: "); 
    String s2 = getInput(sc, "Enter second number"); 
    String op = getInput(sc, "Enter operator: + -/* "); 
    try { 
     Operation oper = Operation.fromString(op); 
     if (op != null) { 
      double result = oper.performOperation(s1, s2); 
      System.out.printf("%s %s %s = %.2f (%s)%n", s1, // 
        oper.getSymbol(), s2, result, oper.getName()); 
     } else { 
      System.out.println("not an operator."); 
      return; 
     } 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
} 
1

這是我怎麼會做它的方法。啓動與接口:

加法
package cruft.arithmetic; 

/** 
* BinaryOperation is the interface for binary arithmetic operations +, -, *,/
* Created by Michael 
* Creation date 1/11/2016. 
* @link https://stackoverflow.com/questions/34734228/combining-four-methods-into-one 
*/ 
public interface BinaryOperation<T> { 

    T execute(T argument1, T argument2); 
} 

實現:

package cruft.arithmetic; 

/** 
* Addition implementation for BinaryOperation 
* Created by Michael 
* Creation date 1/11/2016. 
* @link https://stackoverflow.com/questions/34734228/combining-four-methods-into-one 
*/ 
public class AddOperation implements BinaryOperation<Double> { 

    @Override 
    public Double execute(Double argument1, Double argument2) { 
     return argument1 + argument2; 
    } 
} 

這裏的測試儀:

package cruft.arithmetic; 

/** 
* I think the class name is misspelled: "Tester". 
* Created by Michael 
* Creation date 1/11/2016. 
* @link https://stackoverflow.com/questions/34734228/combining-four-methods-into-one 
*/ 

import java.util.HashMap; 
import java.util.Map; 
import java.util.Scanner; 

public class Tester { 

    private static final Map<String, BinaryOperation<Double>> OPERATIONS = new HashMap<String, BinaryOperation<Double>>() {{ 
     put("+", new AddOperation()); 
    }}; 
    private static Scanner sc = new Scanner(System.in); 


    public static void main(String[] args) { 
     BinaryOperation<Double> operator = null; 
     do { 
      try { 
       String arg1 = getInput("1st argument : "); 
       String arg2 = getInput("2nd argument : "); 
       String oper = getInput("operator + - * /: "); 
       operator = OPERATIONS.get(oper); 
       if (operator != null) { 
        double x = Double.parseDouble(arg1); 
        double y = Double.parseDouble(arg2); 
        double z = operator.execute(x, y); 
        System.out.println(String.format("%-10.4f %s %-10.4f = %-10.4f", x, oper, y, z)); 
       } else { 
        System.out.println(String.format("No such operator '%s'", oper)); 
       } 
      } catch (NumberFormatException e) { 
       e.printStackTrace(); 
      } 
     } while (operator != null); 
    } 

    public static String getInput(String prompt) { 
     System.out.print(prompt); 
     return sc.nextLine(); 
    } 
}