Java实现简易计算器

1 篇文章 0 订阅
1 篇文章 0 订阅


2020.6.11完成

1 内容提要

  1. 《Java程序设计基础》这门课程是数据科学与大数据技术专业的重要的专业实践课。Java期末大作业通过实践环节可以巩固所学的理论知识、提高程序设计能力。
  2. Java期末大作业需要综合应用Java基础知识和基础方法,编写出高效率的应用程序,体会软件设计全过程,提高软件设计能力,为今后进行系统软件和应用软件的开发研究打下坚实的基础,培养刻苦专研和严谨的编程精神,为今后从事项目开发和撰写毕业论文积累经验。
  3. 本项目选择题目类型中得一类型,介绍了本人完成简单的计算机程序这一基于Java语言项目的主要思路以及相关的源代码。完成Java语言项目制作的目的是增强我们对Java语言程序相关内容的熟练掌握,也为了加强同学们的动手实践能力,增加对使用程序解决实际问题的分析能力,以及加深Java语言的基本知识内容的进一步理解。

2 项目设计内容

本次项目要求设计一个程序,能够在图形界面,实现计算器加、减、乘、除等运算。
基本要求:

  1. 图形计算器界面
  2. 在图形界面中,实现加、减、乘、除等运算
  3. 通过点击计算器按键,将运算显示在图形界面
  4. 等于号得出结果,C清除运算
    满足基本要求,本人在该项目中附加额外功能设计,运算增加求幂次方、开根、求阶乘、百分号运算,并进行异常处理。

3 整体流程

在这里插入图片描述

4 本设计所使用的Java基础知识

  • 所用组件及事件处理:JFrame容器,面板组件JPanel,本文JTextField,按钮JButtion()
  • 事件监听:button.addActionListener按钮的事件监听

5 功能模块详细设计

5.1 图形用户界面绘制

  • 图形用户界面绘制:使用JFrame()创建一个500X400尺寸窗口,窗口标题是Calculator,在该窗体中,添加了1个长30的文本框,20个按钮,分别是"","!","(1/2)","/",“7”,“8”,“9”,"*",“4”,“5”,“6”,"-",“1”,“2”,“3”,"+","%",“0”,“C”,"=",五行4列按钮间距15,文本框用于显示输入运算公式和显示运算结果且文本内容靠右,按钮用于输入数字和运算符,界面如图5.1所示:
    图5.1计算器界面
  • 在5.1中在界面文本框中,通过点击按钮可在文本框显示,该内容是字符串格式,点击”=”按钮后,文本内容将进行运算得出结果,点击”C”按钮后,文本内容清除,重新进行运算。如图5.2运算图所示:
    图5.2运算图
public class MyCalculator extends JFrame{
    private JTextField textField;
    private String input;
    private String operator;
    public MyCalculator() {
        input = "";
        operator = "";
        JPanel panel = new JPanel();
        textField = new JTextField(30);
        textField.setEditable(false);
        textField.setHorizontalAlignment(JTextField.RIGHT);
        textField.setPreferredSize(new Dimension(200,80));
        this.add(textField, BorderLayout.NORTH);
        String[] name= {"^","!","^(1/2)","/","7","8","9","*","4","5","6","-","1","2","3","+","%","0","C","="};
        panel.setLayout(new GridLayout(5,4,15,15));
        for(int i=0;i<name.length;i++) {
            JButton button = new JButton(name[i]);
            button.addActionListener(new MyActionListener());
            panel.add(button);
        }
        this.add(panel,BorderLayout.CENTER);
    }
}

5.2 按钮处理

  • 内部类实现按钮响应,获取按钮上的字符串,进行判断,如果字符串是"","!","(1/2)","/","*","-","+","%",将数字和运算符号组合成字符串input通过空格将数字和运算符号隔开,如果按钮上字符串为"C"时,input为空清零,如果按钮上字符串为”=”时,出现异常抛出异常,当cnt=1进行计算。
class MyActionListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            int cnt=0;
            String actionCommand = e.getActionCommand();
            if(actionCommand.equals("+") || actionCommand.equals("-") || actionCommand.equals("*")
                || actionCommand.equals("/") || actionCommand.equals("^") || actionCommand.equals("!") 
                || actionCommand.equals("%") || actionCommand.equals("^(1/2)")) {
                input += " " + actionCommand + " ";
            }
            else if(actionCommand.equals("C")) {
                input = "";
            }
            else if(actionCommand.equals("=")) {
                try {
                    input+= "="+calculate(input);
                } 
                catch (MyException e1) {
                    if(e1.getMessage().equals("被除数不能为0"))
                        input = e1.getMessage();
                    else
                        input = e1.getMessage();
                }
                textField.setText(input);
                input="";
                cnt = 1;
            }
            else
                input += actionCommand;
            if(cnt == 0)
                textField.setText(input);
        }
    }

5.3 运算处理

  • 运算有+ - * / ! % ^ sqrt分为三层,通过" “将数字与运算符分开,同理,通过” "也可以将整个运算字符串切分成字符型数组comput和count,第一层为! % ^ sqrt,如果count字符数组中存在! % ^ sqrt则与count[k-1](k为字符数组中出现某字符的索引)进行运算并更新count字符数组;第二层为+ - * /,用到了栈,count字符数组中存在+ -,则count[i+1](或者 -count[i+1])进栈,count字符数组中存在* /,则栈顶元素出栈与count[i+1]进行运算完进栈;第三层,将栈中元素求和即为运算结果。

5.4 主函数

  • 主函数先创建一个窗口,并设置窗口标题,设定关闭窗口。
public static void main(String[] args) {
    JFrame f = new MyCalculator();
    f.setTitle("Calculator");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setBounds(400, 200, 500, 400);
    f.setVisible(true);
}

6 收获与感想

  • 在编写此次课程设计时,复习了Java的基础内容和GUI编程,学习了栈的使用。
  • 借助栈来完成表达式的计算,将字符串分割成字符串数组,由中缀的定义知数组奇数位为运算符(从第0位开始),偶数位为操作数,因此可将偶数为操作数进栈,遇见+(-)运算符,则将下一个数以正(负)的形式压人栈中,遇见*(/)运算符,则将栈顶元素出栈与数组后一元素进行计算,并将其结果重新压入栈中,直至遍历至数组最后一个元素。
  • 还遇到一点小问题,用" “分割字符串数组,原本代码是String[] count = input.split(” “);在遇到 25%^(1/2)时遇到了问题,因为两个运算符挨着,中间多了一个” “,而 String[] count = input.split(”\s+");解决了这个问题。String的split方法支持正则表达式;正则表达式\s表示匹配任何空白字符,+表示匹配一次或多次。

如有疑问请联系(私信或者vx15935848048)

  • 6
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值