先看看效果吧
话不多说,先上源码
import java.util.Scanner;
public class Calculator02 {
public static void main(String[] args) {
double firstNum;
double secondNum;
String operator;
double outcome;
Scanner scanner = new Scanner(System.in);
while (true) {
//判断是否退出计算器
System.out.println("这里是小谙计算器,回车进入计算器,输入其他退出计算器");
System.out.println("================================================");
if (!scanner.nextLine().equals("")) {
break;
}
//输入,算式中,数字和运算符用空格隔开
while (true) {
System.out.println("================================================");
System.out.println("请输入算式,空格分隔数字和运算符");
System.out.println("================================================");
//输入第一个数字
if (scanner.hasNextDouble()) {
firstNum = scanner.nextDouble();
} else {
String s = scanner.nextLine();
System.out.println("================================================");
System.out.println("输错了,重来");
continue;
}
//输入运算符
String next = scanner.next();
if (next.equals("+")||next.equals("-")||next.equals("*")
||next.equals("/")){
operator = next;
}else{
scanner.nextLine();
System.out.println("================================================");
System.out.println("输错了,重来");
continue;
}
//输入第二个数字
if (scanner.hasNextDouble()) {
secondNum = scanner.nextDouble();
} else {
String s = scanner.nextLine();
System.out.println("================================================");
System.out.println("输错了,重来");
continue;
}
scanner.nextLine();
break;
}
//计算输出
switch (operator) {
case "+":
outcome = add(firstNum,secondNum);
break;
case "-":
outcome = subtract(firstNum,secondNum);
break;
case "*":
outcome = multiply(firstNum,secondNum);
break;
case "/":
outcome = divide(firstNum,secondNum);
break;
default:
outcome = 0;
}
//输出结果
System.out.println("================================================");
System.out.println(firstNum + operator + secondNum + "=" + outcome);
System.out.println("================================================");
}
scanner.close();
}
//下面是加减乘除的方法
public static double add(double a, double b) {
return a + b;
}
public static double subtract(double a, double b) {
return a - b;
}
public static double multiply(double a, double b) {
return a * b;
}
public static double divide(double a, double b) {
return a / b;
}
}
这个计算器的优点是:
1. 可以循环使用,根据提示,敲回车键就进入计算器,敲其他就退出。
2. 输入方便,输入:1 + 2,再敲回车就会显示结果。
3. 容错性强,如果输入的是不符合要求的内容,那么会提示重新输入。
4. 样式美观。
调试中的经验
1. 字符串不能用==进行比较,而应该用equal方法进行比较 。比如
scanner.next()=="a"
是不对的,而应该写成
scanner.next().equals("a")
不等于的话也不能这么写:
scanner.next()!="a"
应该写成
!scanner.next().equals("a")
2. 同一个方法中只能new一次Scanner对象。反复new和close scanner是会报错的。
3. 使用hasNextDouble一类的方法后要将输入流中的所有字符提取出来以清空缓冲区,否则后续输入会直接取上一次输入的字符!
4. 不要用next或者nextInt等一类方法清空剩余字符,因为它们不会提取最后的回车号。
5. 用nextLine就没问题,因为它会提取包括回车号在内的所有的字符(虽然它的返回值不包括最后一个回车号)。 但是,如果输入流是:回车、回车、字符串、回车,那么nextline只能提取第一个回车,并输出空字符,所以,用nextLine清空缓冲区也不是绝对可靠的。