- 要求:
- 具有加、减、乘、除功能
- 能够循环接收新的数据
- 通过用户交互实现(Scanner)
- 思路推荐:
- 写4个方法:加、减、乘、除
- 利用循环+switch进行用户交互
- 传递需要操作的两个数
- 输出结果
- 疑问:
- 要求不太明确,“循环接收新数据”是指要求“能重复进行两个数的四则运算”,还是“实现连续四则运算”?我姑且以后者为目标好了。
- 一些非法输入检查,要不要写出来?
- 先上手试试:
public class Homework1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数:");
if(scanner.hasNextDouble()) {
double num1 = scanner.nextDouble();
System.out.println("请输入算符(+,-,*,/):");
String operator = scanner.next();
switch(operator) {
case "+","-","*","/":
System.out.println("请输入第二个数:");
if(scanner.hasNextDouble()) {
double num2 = scanner.nextDouble();
switch(operator) {
case "+":
System.out.println("="+add(num1,num2));
break;
case "-":
System.out.println("="+minus(num1,num2));
break;
case "*":
System.out.println("="+by(num1,num2));
break;
case "/":
if (num2 == 0) {
System.out.println("除数不得为0!");
} else {
System.out.println("=" + divide(num1, num2));
}
break;
}
} else {
System.out.println("无效数字!");
}
break;
default:
System.out.println("无效算符!");
break;
}
} else {
System.out.println("无效数字!");
}
scanner.close();
}
public static double add(double a,double b) {
return a+b;
}
public static double minus(double a,double b) {
return a-b;
}
public static double by(double a,double b) {
return a*b;
}
public static double divide(double a,double b) {
return a/b;
}
}
- 分析:
- 没能循环起来,每次都要重新跑。那么采用什么循环结构呢?
- if和switch的嵌套太难看了!
- 第二次尝试:
public class Homework2 {
public static void main(String[] args) {
//最外层循环,是个无限循环,但会等待Scanner输入
while (true) {
//声明变量,启用Scanner
Scanner scanner = new Scanner(System.in);
double num1;
double num2;
//检查num1
System.out.println("请输入数字:");
if(scanner.hasNextDouble()) {
num1 = scanner.nextDouble();
} else {
System.out.println("无效数字!");
continue;
}
//检查operator
System.out.println("请输入算符(+,-,*,/):");
String operator = scanner.next();
switch(operator) {
case "+","-","*","/":
break;
default:
System.out.println("无效算符!");
continue;
}
//检查num2
System.out.println("请输入数字:");
if(scanner.hasNextDouble()) {
num2 = scanner.nextDouble();
} else {
System.out.println("无效数字!");
continue;
}
//switch语句,根据operator进行四则运算运算
switch (operator) {
case "+":
System.out.println("="+add(num1,num2));
continue;
case "-":
System.out.println("="+minus(num1,num2));
continue;
case "*":
System.out.println("="+by(num1,num2));
continue;
case "/":
if (num2 == 0) {
System.out.println("除数不得为0!");
} else {
System.out.println("=" + divide(num1, num2));
}
continue;
}
scanner.close();
}
}
//四则运算方法
public static double add(double a,double b) {
return a + b;
}
public static double minus(double a,double b) {
return a - b;
}
public static double by(double a,double b) {
return a * b;
}
public static double divide(double a,double b) {
return a / b;
}
}
- 分析:
- 使用
while
让程序循环起来了。 - 可以连续进行单次四则运算,但是没法实现多次四则运算。
- 我应该能让这串代码更精简,并且实现多次四则运算。
- 使用
- 第三次尝试:
public class Homework3 {
//声明变量
static double num1;
static double num2;
static double result;
static String operator = "";
static boolean checker = true; //默认true,若为连续计算则变为false。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //声明变量,启用Scanner
//大循环,是个无限循环,但会等待Scanner输入
while (true) {
//步骤1,输入第一个数字
//检查checker,是否为循环
if (checker){ //若checker为false,证明不是连续计算,输入第一个数
System.out.println("请输入数字:");
if (scanner.hasNextDouble()) { //检查num1输入是否为double
num1 = scanner.nextDouble();
result = num1; //这一步时将输入的num1值赋予result,用于步骤三
} else {
System.out.println("无效数字!");
scanner = new Scanner(System.in);
continue;
}
} else {
num1 = result; //若checker为true,则将result的值赋予num1
}
//步骤2,输入算符
System.out.println("请输入算符:");
operator = scanner.next();
switch(operator) { //检查operator
case "+","-","*","/","=":
break;
default:
System.out.println("无效算符!");
operator = "";
continue;
}
//步骤3,输入第二个数字
if (!operator.equals("=")) { //如果算符是“=”,就不用输入第二个数字了
System.out.println("目前的数据为:"+result+",请输入数字:");
num2 = scanner.nextDouble();
if (operator.equals("/") && num2 == 0) { //检查除数
System.out.println("除数不得为0!");
continue;
}
}
//步骤4,计算结果
switch (operator){
case "=":
System.out.println("计算结果为:"+result+",计算结束。");
scanner = new Scanner(System.in); //重置scanner
checker = true;
continue;
case "+","-","*","/":
result = calculator(num1,num2);
checker = false;
}
}
}
//四则运算方法
public static double calculator(double a,double b) {
switch (operator) {
case "+":
result = add(a,b);
break;
case "-":
result = minus(a, b);
break;
case "*":
result = by(a, b);
break;
case "/":
result = divide(a, b);
break;
}
return result;
}
public static double add(double a,double b) {
return a + b;
}
public static double minus(double a,double b) {
return a - b;
}
public static double by(double a,double b) {
return a * b;
}
public static double divide(double a,double b) {
return a / b;
}
}
- 分析:
- 这应该是以目前所学能做到的最佳结果了,能够循环计算,能够连续计算,交互逻辑通顺。能够检查出我能想到的一切非法输入,并且非法输入不会中断循环。
- 加入了一个result值用于存储每个单次运算的结果。我尝试过只用两个double类来实现连续运算,但是太容易出错。
- 加入了一个布尔值checker,来确定是否为连续计算,这样就能在连续计算的情况下跳过第一个数的输入。
- 将之前switch语句根据算符选择四则运算的过程,另写成了一个calculator方法,精简了主程序。
- 当然,如果不像我这样给自己找那么多麻烦,搞这么多检查,这些计算器肯定会少很多代码。但这只是个作业,我只是想玩玩。