• 大小: 12KB
    文件类型: .java
    金币: 1
    下载: 0 次
    发布日期: 2021-06-11
  • 语言: Java
  • 标签: Java  Swing  计算器    

资源简介

/** * Java计算器 * chishaxie * 支持中缀表达式运算(可以算一个很长的数学表达式) * 支持高精度浮点数运算 * 支持按钮和键盘同步监听 * 支持错误处理并提示 */ 可以试试算65535的阶乘啰(等待1分钟左右)

资源截图

代码片段和文件信息

/**
 * Java计算器
 * chishaxie
 * 支持中缀表达式运算
 * 支持高精度浮点数运算
 * 支持按钮和键盘同步监听
 * 支持错误处理并提示
 */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.util.Stack;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.Jframe;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;

/**
 * 计算器引擎类(抽象类)
 * 提供中缀表达式的计算功能
 * 支持高精度浮点数
 * 运算过程出现循环小数只处理至其小数点后15位
 * @author chishaxie
 * @throws Exception 计算过程中出现错误
 */
abstract class CalculatorEngine {

/**
 * 运算符优先级判断
 * @param op 运算符或者‘(’或者‘=’
 * @return 优先级(最高4,最低0)
 */
static private int Precedence(char op)
{
switch (op) {
case ‘+‘:
case ‘-‘:
return 1; // 定义加减运算的优先级为1
case ‘*‘:
case ‘/‘:
case ‘%‘:
return 2; // 定义乘除与取余运算的优先级为2
case ‘^‘:
return 3; // 定义次方运算的优先级为3
case ‘!‘:
return 4; // 定义阶乘运算的优先级为4
case ‘(‘:
case ‘=‘:
default:
return 0; // 定义在栈中的左括号和栈底字符的优先级为0
}
}

/**
 * 中缀表达式转换后缀表达式
 * @param str 中缀表达式字符串(要求以=结尾)
 * @return 后缀表达式的字符串形式
 * @throws Exception 中缀表达式存在错误
 */
static private String toSuffix(String str) throws Exception {
StringBuffer strBuf = new StringBuffer();// 存储后缀表达式
Stack stack = new Stack();// 字符栈,用于处理运算符
stack.push(‘=‘);// 压入栈底字符
int i = 0;// 中缀式字符串迭代器
if(str==null || str.equals(““) || str.equals(“=“))
throw new Exception(“中缀式不能为空“);
char ch = str.charAt(i);// 临时字符处理
if(ch==‘.‘)
throw new Exception(“中缀式格式不规范(不能以“.”开头)“);
if (str.charAt(str.length() - 1) != ‘=‘)
throw new Exception(“中缀式格式不规范(不以“=”结尾)“);
if(ch==‘-‘ || ch==‘+‘)
strBuf.append(“0 “);//正负号首位补零
while (ch != ‘=‘) {
if (ch == ‘ ‘)
ch = str.charAt(++i);// 读取下一个字符(忽略空格)
else if (ch == ‘(‘) {
stack.push(‘(‘);// 如果是左括号将其压入栈
ch = str.charAt(++i);
if(ch==‘-‘ || ch==‘+‘)
strBuf.append(“0 “);//正负号补零
} else if (ch == ‘)‘) {
while (stack.peek() != ‘(‘) {
if (stack.peek() == ‘=‘)
throw new Exception(“括号不匹配缺少“(”“);
strBuf.append(stack.pop());
}
stack.pop();
ch = str.charAt(++i);
} else if (ch == ‘+‘ || ch == ‘-‘ || ch == ‘*‘ || ch == ‘/‘ || ch==‘^‘ || ch==‘!‘ || ch==‘%‘) {
char w = stack.peek();// 临时读取栈中的运算符
// 将现在的运算符和栈中的运算符进行优先级比较
while (Precedence(w) >= Precedence(ch)) {
strBuf.append(w);
stack.pop();
w = stack.peek();
}
stack.push(ch);
ch = str.charAt(++i);
} else {
// 直接将数字和小数点加到后缀式中
if (!((ch >= ‘0‘ && ch <= ‘9‘) || ch == ‘.‘))
throw new Exception(“出现非法符号“);

评论

共有 条评论