如何获得多个用户输入并执行计算基本计算器

时间:2014-02-08 19:23:54

标签: java

我正在尝试创建一个基本的计算器(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;
            }

        }   

    }

}

2 个答案:

答案 0 :(得分: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

在运营商之间有空格

答案 1 :(得分:0)

哦,计算器 - 真正的经典!

您可以通过调用ScannernextDouble()课程给您完整的句子,而不只是下一个数字。 您已经在表达式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中提取信息。 然而,虽然这是常见的事情,但请注意,正则表达式在所有情况下都不能取代Parser(遗憾的是它经常尝试)。

根据您需要使用计算器,它可能符合要求。

这个解决方案还远远不够完美,但它支持一系列输入,并且可以在某种程度上进行调整。您可以轻松添加负值或小数值。但是,如果您尝试使用()添加更复杂的表达式,则会达到其限制。祝你好运!