2014-02-08 34 views
1

我正在嘗試創建一個基本計算器(Java新手)。此時用戶必須輸入一個號碼,然後輸入一個運營商,然後輸入一個號碼。我怎樣才能在一條線上獲得所有三個輸入?如何獲取多個用戶輸入並執行計算基本計算器

import java.util.Scanner; 
import java.io.*; 

public class Calculator 

{ 
    public static void main(String[] args) 
    { 
     Scanner in = new Scanner (System.in); 
     double numb1, numb2, add, subtract, multiply, divide; 
     char operation; 

     while (true) 
     {   
      System.out.println("Calculate: "); 
      numb1 = in.nextDouble(); 
      operation = in.next().charAt(0); 
      numb2 = in.nextDouble(); 

      switch(operation) 
      { 
       case '+':  
        add = numb1 + numb2; 
        System.out.println(add); 
        break; 

       case '-': 
        subtract = numb1 - numb2; 
        System.out.println(subtract); 
        break; 
       case '*': 
        multiply = numb1 * numb2; 
        System.out.println(multiply); 
        break; 
       case '/': 
        divide = numb1/numb2; 
        System.out.println(divide); 
        break; 
      } 

     } 

    } 

} 
+0

如何掃描命令行上輸入的整個方程?如果您只查找3個項目(例如1 + 1),那麼您的代碼不是很便攜。如果有人輸入「1 + 2 + 3 * 4」會怎麼樣?解析整個字符串會更好,只需搜索整數和+, - ,/,*等...... –

+0

爲什麼不創建帶有文本字段和按鈕的簡單JFrame? – MGorgon

回答

0

您可以嘗試使用nextLine()(返回String),然後用空格分開它,並最終將其轉化爲相應的類型:

public static void main(String[] args) 
{ 
    Scanner scanner = new Scanner(System.in); 
    double numb1, numb2; 
    char operation; 

    // Split string by space 
    String[] parts = scanner.nextLine().split(" "); 

    // Convert to corresponding types 
    numb1 = Integer.parseInt(parts[0]); 
    operation = parts[1].charAt(0); 
    numb2 = Integer.parseInt(parts[2]); 

    ... 
} 

所以輸入將需要爲:

1 + 2 

與運營商

+0

這可能聽起來很愚蠢,但我會如何使用這種方法打印出答案? ^^^ – user2993831

+0

使用你已經使用過的。我的意思是,'switch'將會是一樣的,你必須看到你需要改變什麼,什麼不需要改變。 – Christian

0

呵呵,CA之間的間隔lculator - 一個真正的經典!

可以通過調用nextDouble()要求Scanner類給你整個句子,而不只是下一個數字。 您已在表達式in.next().charAt(0)中執行此操作。

但是,由此產生的問題是,現在你有一整句話的文字,其實是一個數學術語。如何將這個句子分解成反映數學術語的結構是Parser的工作。

一般來說,這是一件不平凡的事情,但根據您需要做的任務,您可能不需要在這裏完整的解析器。如果您堅持使用兩個數字的單個操作的示例,則可以使用正則表達式來提取信息。 對於非負數無小數,您可以使用此:

Pattern termPattern = Pattern.compile("\\s*(\\d*)\\s*([+-*/])\\s*(\\d*)\\s*"); 
final String sentence = in.next(); 
Matcher matcher = termPattern.matcher(sentence); 
if (!matcher.matches()) { 
    throw new IllegalArgumentException("Not a supported mathematical expression: " + sentence); 
} 
Integer firstNum = Integer.valueOf(matcher.group(1)); 
Integer secondNum = Integer.valueOf(matcher.group(3)); 
String operation = matcher.group(2); 
switch (operation) { 
    ... 
} 

我用正則表達式來提取使用Java Pattern ClassString的信息。 然而,儘管這是一件常見的事情,但請注意,在任何情況下,Regular Expression都不能代替解析器(並且很遺憾,它經常被試用)。

取決於你需要做什麼計算器,它可能適合賬單。

這個解決方案仍然遠非完美,但它支持一系列輸入並且可以在一定程度上進行調整。您可以輕鬆添加負值或十進制值。但是,如果您嘗試使用()添加更復雜的表達式,您將達到極限。祝您探索愉快!