编写简易scanner计算器

发布时间 2023-12-04 12:38:21作者: Acolyte_9527
  • 要求:
    • 具有加、减、乘、除功能
    • 能够循环接收新的数据
    • 通过用户交互实现(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方法,精简了主程序。

  • 当然,如果不像我这样给自己找那么多麻烦,搞这么多检查,这些计算器肯定会少很多代码。但这只是个作业,我只是想玩玩。