接受两个整数和操作数的计算器

时间:2016-08-05 22:58:47

标签: java java.util.scanner

我想编写一个程序,要求用户以任意顺序输入2个整数和一个标记(运算符)。

之后,假设数据转到switch语句,该语句在输入的整数之间执行算术运算。 我需要提示如何使用hasNext()和hasNextInt()来解决这个问题。

我尝试用hasNext()编写嵌套的if..else来查找3个令牌,然后找到2个整数,但数据似乎没有达到switch语句。

Scanner scan = new Scanner(System.in); 
int operand1 = scan.nextInt();
int operand2 = scan.nextInt(); 
char operator = scan.nextLine().charAt(0);

if(hasNext()) {   //Doesn't this take in any token? 

if(hasNext()) {

if(hasNext()) {

switch(operator){

case '+': int addition = operand1 + operand2; 
         System.out.println(addition); 

 break; 

 case '-': int subtraction = operand1 - operand2; 
        System.out.println(subtraction); 

  break; 

 case '*': int multiplication = operand1 * operand2; 
        System.out.println(multiplication); 

  break;   

  case '/': int division = operand1/ operand2; 
        System.out.println(division); 

 case '%': int modulus = operand1 % operand2; 
        System.out.println(modulus); 

 break;   

case '^': int exponentiation = operand1 ^ operand2; 
        System.out.println(exponentiation); 

 break; }}}} 

1 个答案:

答案 0 :(得分:0)

因为这是一个赋值,所以只给你代码是错误的,但让我们来看看它。 像这样的大多数作业可以有明确定义的步骤'输入' - > '处理' - > '输出'

输入

选项1

使用hasNext()/ hasNextInt()。 首先在尽可能低的范围内声明变量(这将立即在ifs之外):

int int1;
int int2;
char op;

输入实际上有三个选项

  1. int int char
  2. int char int
  3. char int int
  4. 所以你需要嵌套的ifs来确定哪种情况。

    Scanner scan = new Scanner(System.in);
    if (scan.hasNextInt()) {
        // Consume int1 or the following if will always be true!
        if (scan.hasNextInt()) {
            // Inside case 1
        } else {
            // Inside case 2
        }
    } else {
        // Inside case 3
    }
    

    问题是知道何时将nextInt()存储到int1或int2中。 这可以通过两种方式解决

    • 有一个额外的布尔值,表明是否找到了int1

      boolean storedInt1 = false;
      // ...
      if (!storedInt1) {
          int1 = scan.nextInt();
          storedInt1 = true;
      } else {
          int2 = scan.nextInt();
      }
      
    • 使用整数(自动装箱/取消装箱将为您处理int< - >整数转换)

      Integer int1 = null;
      Integer int2 = null;
      // ...
      if (int1 == null) {
          int1 = scan.nextInt();
      } else {
          int2 = scan.nextInt();
      }
      

    选项2

    使用正则表达式。一旦你了解正则表达式就是你的朋友,Java有nice support

    有很多方法可以完成同样的事情,但这是一种方式:

    // First get all input at once
    Scanner scan = new Scanner(System.in);
    String input = scan.nextLine();
    

    您可以使用多个正则表达式find(不匹配)输入

    Matcher twoInts = Pattern.compile("(\\d+)\\D*(\\d+)").matcher(input);
    if (twoInts.find()) {
        int1 = Integer.parseInt(twoInts.group(1));
        int2 = Integer.parseInt(twoInts.group(2));
    } // else uh oh?
    
    Matcher anyNonDigit = Pattern.compile("([^\\d\\s]+)").matcher(input);
    if (anyNonDigit.find()) {
        op = anyNonDigit.group(1).charAt(0);
    } // else uh oh?
    

    请注意,这些正则表达式不适用于负数。

    Regexes解释说:

    • “(\\ d +)\\ d *(\\ d +)”
      • “(\\ d +)”匹配并捕获任何数字“\\ d”一次或多次“+”
      • “\\ D *”与任何非数字“\\ D”匹配任何次数“*”
    • “([^ \\ d \\ S] +)”
      • “[\\ d \\ s]”匹配任何数字“\\ d”或空格“\\ s”
        • “[^ ...]”匹配逆,即匹配任何不是数字且不是空格的字符
      • 一次或多次“+”
      • 并抓住它“(...)”

    加工&输出

    保持原样但开关与用于输入的ifs处于同一水平。 在这里进行一些错误检查可能是一个好主意。

    Integer int1 = null;
    // ...
    
    // All the input ...
    
    // Check for errors, e.g.
    if (int1 == null || int2 == null || op == 0) {
        // Input failed, print some message and exit
    }
    
    switch (op) {
        // Any possible operators
    
    default:
        // Operator unknown, print some message and exit
        break;
    }