我想编写一个程序,要求用户以任意顺序输入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; }}}}
答案 0 :(得分:0)
因为这是一个赋值,所以只给你代码是错误的,但让我们来看看它。 像这样的大多数作业可以有明确定义的步骤'输入' - > '处理' - > '输出'
使用hasNext()/ hasNextInt()。 首先在尽可能低的范围内声明变量(这将立即在ifs之外):
int int1;
int int2;
char op;
输入实际上有三个选项
int int char
int char int
char int int
所以你需要嵌套的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();
}
使用正则表达式。一旦你了解正则表达式就是你的朋友,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解释说:
保持原样但开关与用于输入的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;
}