软件技术实习项目一 简单计算器的实现(四则混合运算及历史记录)

本文介绍了使用Java实现一个具有四则混合运算、历史记录功能的简单计算器的过程。涉及中缀表达式转后缀表达式、错误处理、GUI界面设计和Swing组件的使用。在开发中遇到的问题包括平方和开方运算历史记录显示异常、非法运算符处理以及按钮监听等。
摘要由CSDN通过智能技术生成

目录

项目准备

算法部分的代码

GUI界面的代码

软件功能展示

界面

功能概述

遇到的困难和BUG

1.进行平方和开方运算时其保存在历史记录中的表达式会出现两个等号及两个结果。

2.输入界面和历史记录栏皆可实现不断字自动换行功能以及滚动条功能

3.中缀表达式转后缀表达式以及后缀表达式的计算

4.按钮监听

5.java swing的使用


项目准备

需求分析

1. 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示;

2.保存和浏览历史运算记录;

3.能够检验算术表达式的合法性;

4.能够实现四则混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;

5.要求交互界面友好,程序健壮。

重点

1.算法部分:中缀表达式转为后缀表达式;后缀表达式的计算;判断表达式是否合法

2.GUI界面:JAVA swing 各组件的混合运用;按钮的监听;界面的设计

编程语言及开发工具

JAVA,IDEA

算法部分的代码

//将中缀表达式转换为后缀表达式
    private String[] houzhui(String str) {
        String s = "";// 用于承接多位数的字符串
        char opStack[] = new char[100];// 静态栈,对用户输入的操作符进行处理,用于存储运算符
        String postQueue[] = new String[100];// 后缀表达式字符串数组,为了将多位数存储为独立的字符串
        int top = -1, j = 0;// 静态指针top,控制变量j
        for (int i = 0; i < str.length(); i++)// 遍历中缀表达式
        // indexof函数,返回字串首次出现的位置;charAt函数返回index位置处的字符;
        {
            if ("0123456789.".indexOf(str.charAt(i)) >= 0) // 遇到数字字符的情况
            {
                s = "";// 作为承接字符,每次开始时都要清空
                for (; i < str.length() && "0123456789.".indexOf(str.charAt(i)) >= 0; i++) {
                    s = s + str.charAt(i);
                }
                i--;
                postQueue[j] = s;// 数字字符直接加入后缀表达式
                j++;
            } else if ("(".indexOf(str.charAt(i)) >= 0) {// 遇到左括号
                top++;
                opStack[top] = str.charAt(i);// 左括号入栈
            } else if (")".indexOf(str.charAt(i)) >= 0) {// 遇到右括号
                for (;;)// 栈顶元素循环出栈,直到遇到左括号为止
                {
                    if (opStack[top] != '(') {// 栈顶元素不是左括号
                        postQueue[j] = opStack[top] + "";// 栈顶元素出栈
                        j++;
                        top--;
                    } else { // 找到栈顶元素是左括号
                        top--;// 删除栈顶左括号
                        break;// 循环结束
                    }
                }
            }
            if ("*%/".indexOf(str.charAt(i)) >= 0)// 遇到高优先级运算符
            {
                if (top == -1) {// 若栈为空则直接入栈
                    top++;
                    opStack[top] = str.charAt(i);
                } else {// 栈不为空,把栈中弹出的元素入队,直到栈顶元素优先级小于x或者栈为空
                    if ("*%/".indexOf(opStack[top]) >= 0) {
                        // 栈顶元素也为高优先级运算符
                        postQueue[j] = opStack[top] + "";// 栈顶元素出栈进入后缀表达式
                        j++;
                        opStack[top] = str.charAt(i);// 当前运算符入栈
                    } else if ("(".indexOf(opStack[top]) >= 0) {// 栈顶元素为左括号,当前运算符入栈
                        top++;
                        opStack[top] = str.charAt(i);
                    } else if ("+-".indexOf(str.charAt(i)) >= 0) {// 遇到低优先级运算符
                        postQueue[j] = opStack[top] + "";// 栈顶元素出栈进入后最表达式
                        j++;
                        opStack[top] = str.charAt(i);// 当前元素入栈
                    }
                }
            } else if ("+-".indexOf(str.charAt(i)) >= 0) {
                if (top == -1) {
                    top++;
                    opStack[top] = str.charAt(i);
                } else {
                    if ("*%/".indexOf(opStack[top]) >= 0) {
                        // 栈顶元素也为高优先级运算符
                        postQueue[j] = opStack[top] + "";// 栈顶元素出栈进入后缀表达式
                        j++;
                        opStack[top] = str.charAt(i);// 当前运算符入栈
                    } else if ("(".indexOf(opStack[top]) >= 0) {// 栈顶元素为左括号,当前运算符入栈
                        top++;
                        opStack[top] = str.charAt(i);
                    } else if ("+-".indexOf(str.charAt(i)) >= 0) {// 遇到低优先级运算符
                        postQueue[j] = opStack[top] + "";// 栈顶元素出栈进入后最表达式
                        j++;
                        opStack[top] = str.charAt(i);// 当前元素入栈
                    }
                }
            }
        }
        for (; top != -1;) {// 遍历结束后将栈中剩余元素依次出栈进入后缀表达式
            postQueue[j] = opStack[top] + "";
            j++;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值