2014-02-08 72 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都不能代替解析器(并且很遗憾,它经常被试用)。

取决于你需要做什么计算器,它可能适合账单。

这个解决方案仍然远非完美,但它支持一系列输入并且可以在一定程度上进行调整。您可以轻松添加负值或十进制值。但是,如果您尝试使用()添加更复杂的表达式,您将达到极限。祝您探索愉快!