首页 > 其他分享 >编写简易scanner计算器

编写简易scanner计算器

时间:2023-12-04 12:44:49浏览次数:28  
标签:scanner double System 简易 static 计算器 println out

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

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

标签:scanner,double,System,简易,static,计算器,println,out
From: https://www.cnblogs.com/Acolyte/p/17874675.html

相关文章

  • 基于 visual studio 2022 环境下的“MFC”计算器登录使用
    一、前言1、系统环境:Window10,visualstudio2022,MYSQLClient(MariaDB5.5(X64))。2、界面:这是一个MFC界面,通过连接创建的数据库,实现计算器登录、运算以及查看历史记录的功能。二、设计过程1、流程图:2、数据库表格创建与连接(1)创建用户表“yunzhou”:(2)创建历史记录表“yu......
  • Scanner类的用法及原理
    System.in是一个很原始、很简陋的输入流对象,通常不直接使用它来读取用户的输入。Scanner类可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器,importjava.util.Scanner;publicclassDemon{......
  • 三角函数计算器
    一个简单的三角函数计算器#include<iostream>#include<cstdlib>#include<iomanip>#include<cmath>constexprautoPI=M_PI;intmenu_select(){intselect;std::cout<<"-------WelcometoSnowCalculator-------"<......
  • 计算器登录页面的设计与实现
     【实验内容】1.设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。【实验环境及开发工具】1.使用visors绘制流程图。2.使用eclipse编写软件。【流程图设计】(1)软件总体流程图 (2)登录界面流......
  • Java开发者的Python快速进修指南:实战之简易跳表
    前言之前我已经将Python的基本语法与Java进行了比较,相信大家对Python也有了一定的了解。我不会选择去写一些无用的业务逻辑来加强对Python的理解。相反,我更喜欢通过编写一些数据结构和算法来加深自己对Python编程的理解。学习任何语言都一样。通过编写数据结构和算法,不仅可以加......
  • JavaSE练习,JDBC驱动,基于swing库的带登录功能计算器
    一、前言本次作业是基于上次的计算器功能所做的改进,通过JDBC连接MySQL增加了登录与注册功能,并对计算器所作的运算进行了记录。虽然基于上次的作业所作,但是设计编写的模块大部分与之无关(登录注册自然与计算器无关)。所以本次作业属于再开发而不是运营维护。二、概要设计......
  • 使用QPainter制作一个简易的相册
    PlayImage记得一键三连哦一个使用简单的QPainter绘图事件实现图片播放器的简易demo支持图片切换支持多路更新,自己扩展即可支持幻灯片播放PlayImage自定义控件支持复用,对外提供updateImage和updatePixmap接口,对传入的image和pixmap进行图片更新PlayImage控件支持多线程调......
  • 简易电路
     ......
  • 用户交互scanner
    publicclassScannerDemo01{publicstaticvoidmain(String[]args){Scannera=newScanner(System.in);doublesum=0;//和intb=0;//输出了多少个数System.out.println("请输入:");while(a.hasNextDouble()){......
  • Java learning Day2 常量 变量 运算符 Scanner 方法 数组
    常量:字面值常量(直接写值的常量)+自定义常量变量:long型变量后必须加L;小数字面值常量默认double 若用float需加F;变量强转:小的会自动转成大的float虽然只有4个字节但是比所有整型的取值范围都大    浮点型有精度问题  表达式类型提升:如果表达式当中存在多种数......