以下是自己用Java写的一个计算器类。
支持科学计数表达式的结果,但不支持在过程中的计算。
支持字符串的数学表达式,包括括号,指数运算,然后最后直接计算。
附件是可以直接运行的jar文件(电脑上需要有JDK环境)
package com.eric.calculator;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* 支持科学计数表达式的结果,但不支持在过程中的计算
* @author Yuanbo Han
*
*/
public class Calculator {
public static boolean checkBalance(String expression){
boolean balanced = true;
Stack<Character> stack = new Stack<Character>();
for(int i=0;balanced && i<expression.length();i++){
char ch = expression.charAt(i);
switch(ch){
case '(': case '[': case '{':
stack.push(ch);
break;
case ')': case ']': case '}':
if(stack.isEmpty()){
balanced = false;
}else{
char pop = stack.pop();
balanced = isPaired(pop,ch);
}
break;
}
}
if(!stack.isEmpty()){
balanced = false;
}
return balanced;
}
private static boolean isPaired(char left, char right){
return (left == '(' && right == ')') ||
(left == '[' && right == ']') ||
(left == '{' && right == '}');
}
/**
* 需要处理的数据类型包括:
* 运算数 ^ + - * / ( )
* 中缀表达式转变为后缀表达式时,遇到相应的符号所对应的动作:
* 运算数: 添加到输出表达式的末尾
* ^: 压入栈
* +-* /: 从栈中弹出运算符并添加到表达式的末尾,直到栈为空或者栈顶优先级比该新的运算符低。然后将新的运算符压入栈
* ( : 压入栈
* ) : 从栈中弹出运算符并添加到表达式的末尾,直到弹出(,丢弃这两个括号
* @param expression
* @return 后缀表达式中的操作数以一个固定的符号来分开,如 _
*/
public static String convert2Postfix(String expression, String regex){
Stack<String> stack = new Stack<String>();
StringBuffer sb = new StringBuffer();
String[] arr = process(expression);
for(int i=0;i<arr.length;i++){
String ch = arr[i];
if(isDouble(ch)){
sb.append(ch + regex);
}else{
if(ch.equals("^")){
stack.push(ch);
} else if(ch.equals("+") || ch.equals("-") || ch.equals("*") || ch.equals("/")){
while(!stack.isEmpty()){
String top = stack.peek();
if(getPrecedence(ch.charAt(0)) <= getPrecedence(top.charAt(0))){
sb.append(top + regex);
stack.pop();
}else{
break;
}
}
stack.push(ch);
} else if(ch.equals("(")){
stack.push(ch);
} else if(ch.equals(")")){
String pop = stack.pop();
while(!pop.equals("(")){
sb.append(pop + regex);
pop = stack.pop();
}
}
}
}
while(!stack.isEmpty()){
String pop = stack.pop();
sb.append(pop + regex);
}
return sb.toString();
}
/**
* 判断是否是一个double型数值
* @param input
* @return
*/
private static boolean isDouble(String input){
try {
Double.parseDouble(input);
return true;
} catch (NumberFormatException e) {
return false;
}
}
/**
* 将expression处理下,以运算符来将expression分隔成数组
* @param expression
* @param index
* @return
*/
public static String[] process(String expression){
List<String> list = new ArrayList<String>();
char[] arr = expression.toCharArray();
StringBuffer sb = new StringBuffer();
for(int i=0;i<arr.length;i++){
if(arr[i] == '-'){//考虑到-不仅是减号,还有可能是负号
if(i == 0 || (arr[i-1] == '(' || arr[i-1] == ')' || arr[i-1] == '+' || arr[i-1] == '-' || arr[i-1] == '*' || arr[i-1] == '/')){
sb.append("-");
} else{
if(!sb.toString().trim().equals("")){
list.add(sb.toString());
}
list.add(String.valueOf(arr[i]));
sb = new StringBuffer();
}
} else if(arr[i] != '(' && arr[i] != ')' && arr[i] != '+' && arr[i] != '*' && arr[i] != '/' && arr[i] != '^' ){
sb.append(arr[i]);
} else{
if(!sb.toString().trim().equals("")){
list.add(sb.toString());
}
list.add(String.valueOf(arr[i]));
sb = new StringBuffer();
}
}
if(!sb.toString().trim().equals("")){//将最后的数据放入到list中
list.add(sb.toString());
}
return list.toArray(new String[list.size()]);
}
private static int getPrecedence(char ch){
switch(ch){
case '(': case ')': return 0;
case '+': case '-': return 1;
case '*': case '/': return 2;
case '^': return 3;
default: return -1;
}
}
/**
* expression是中缀表达式
* @param regex
* @param expression
* @return
*/
public static double calculateExpression(String expression, String regex){
Stack<Double> stack = new Stack<Double>();
String[] arr = convert2Postfix(expression,regex).split(regex);
for(int i=0;i<arr.length;i++){
String ch = arr[i];
if(isDouble(ch)){
stack.push(Double.parseDouble(String.valueOf(ch)));
}else{
double two = stack.pop();
double one = stack.pop();
char operator = ch.charAt(0);
double value = calculate(one,two,operator);
stack.push(value);
}
}
return stack.peek();
}
private static double calculate(double one, double two, char operator){
switch(operator){
case '+':
return one + two;
case '-':
return one - two;
case '*':
return one * two;
case '/':
return one / two;
case '^':
return (int)Math.pow(one, two);
}
return 0;
}
public static void main(String[] args) {
CalculatorFrame frame = new CalculatorFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
}
}
@SuppressWarnings("serial")
class CalculatorFrame extends JFrame {
public CalculatorFrame() {
this.setTitle("计算器");
CalculatorPanel panel = new CalculatorPanel();
this.add(panel);
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension dimension = kit.getScreenSize();
double x = dimension.getWidth() / 3;
double y = dimension.getHeight() / 3;
setLocation((int) x, (int) y);
this.pack();
}
}
@SuppressWarnings("serial")
class CalculatorPanel extends JPanel {
private JTextField display;
private JPanel panel;
public CalculatorPanel() {
this.setLayout(new BorderLayout());
display = new JTextField();
display.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
calculate();
}
});
this.add(display, BorderLayout.NORTH);
InputAction action = new InputAction();
panel = new JPanel();
panel.setLayout(new GridLayout(5, 4));
this.addButton("C", action);
this.addButton("(", action);
this.addButton(")", action);
this.addButton("^", action);
this.addButton("7", action);
this.addButton("8", action);
this.addButton("9", action);
this.addButton("+", action);
this.addButton("4", action);
this.addButton("5", action);
this.addButton("6", action);
this.addButton("-", action);
this.addButton("1", action);
this.addButton("2", action);
this.addButton("3", action);
this.addButton("*", action);
this.addButton("0", action);
this.addButton(".", action);
this.addButton("=", action);
this.addButton("/", action);
this.add(panel, BorderLayout.CENTER);
}
private void addButton(String label, ActionListener listener) {
JButton btn = new JButton(label);
btn.addActionListener(listener);
panel.add(btn);
}
class InputAction implements ActionListener {
public void actionPerformed(ActionEvent event) {
String btnVal = event.getActionCommand();
if (btnVal.equals("=")) {
calculate();
} else if(btnVal.equals("C")){
display.setText("");
} else {
String input = display.getText().trim();
display.setText(input + btnVal);
}
}
}
public void calculate() {
String input = display.getText().trim();
if (!Calculator.checkBalance(input)) {
System.out.println("输入的表达式有误1");
}
try {
double result = Calculator.calculateExpression(input, "_");
String str = String.valueOf(result);
if(str.endsWith(".0")){
str = str.substring(0, str.length()-2);
}
display.setText(str);
} catch (Exception e) {
System.out.println("输入的表达式有误2");
}
}
}
- 大小: 9 KB
- 大小: 7.7 KB
分享到:
相关推荐
java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用java计算器代码,初学者专用
JAVA 计算器 实验报告书,内附完整代码,可用。
java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器
在这个“Java计算器实验报告”中,我们探讨了一个基于Java编程语言的计算器应用程序的开发过程。这个实验的主要目标是设计一个用户界面,实现基本的数学运算,包括加法、减法、乘法和除法,同时处理可能出现的异常...
java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器java 计算器
Java 计算器程序代码解析 Java 计算器程序代码是 Java 课上老师提供的编译源代码,内容详细,适合研究学习。下面对代码的标题、描述、标签和部分内容进行详细解析。 标题解析 Java 计算器程序代码的标题为“Java ...
在这个项目中,我们看到的"java计算器,带历史记录功能"显然包含了一个核心的类——`Computer.java`,这个类可能实现了计算器的所有逻辑和界面。 首先,`Computer.java`文件很可能是主程序的入口点,它可能继承自...
本项目“用AWT包实现的JAVA计算器”旨在通过AWT来构建一个功能完备的计算器应用。下面将详细介绍这个项目中的关键知识点。 1. **AWT组件**: - AWT提供了各种基本组件,如按钮(Button)、文本字段(TextField)、...
【标题】"java计算器+报告"揭示了这个项目的核心内容,即一个用Java语言实现的计算器程序,并且包含了相应的项目报告。这表明该程序不仅是一个简单的计算工具,可能还涉及了高级功能,如复杂数学运算、图形界面或者...
【Java计算器实现详解】 在Java编程的学习过程中,创建一个计算器是一项常见的练习任务,它能帮助学生深入理解面向对象编程的概念,以及如何处理用户输入和输出。这个“java计算器”项目,作为期末作业,旨在检验...
《JAVA计算器课程设计详解》 在计算机编程领域,设计并实现一个计算器程序是常见的课程设计任务,这有助于学习者深入理解编程语言的基本语法和逻辑控制。在这个Java计算器课程设计报告中,我们将探讨如何构建一个...
Java计算器实训报告旨在通过设计和实现一个计算器程序,让学生深入理解和掌握Java编程语言以及面向对象设计的基本原理。这个计算器分为普通计算器和科学计算器两种模式,提供了丰富的数学运算功能。 在需求分析部分...
Java计算器是基于Java编程语言开发的一款简单应用,适用于智能手机用户。它通常包含了基本的数学运算功能,如加、减、乘、除,以及可能的更高级功能,如求平方根、指数运算、对数等。在Java中实现计算器涉及到许多...
Java计算器源代码是一个典型的编程项目,它展示了如何在Java中实现一个简单的图形用户界面(GUI)应用程序,用于执行基本的算术运算。这个项目通常包括加、减、乘、除等基本功能,以及可能的括号支持和错误处理。...
**实验报告:简易Java计算器制作** 一、实验目的及要求 本实验旨在加深对Java编程语言的理解,特别是其面向对象编程特性。通过设计并实现一个简单的计算器,学习者将掌握以下知识点: 1. Java基本语法:包括变量...
Java 计算器完整源代码实现详解 在本资源中,我们将实现一个完整的 Java 计算器应用程序,该应用程序具有基本的计算功能,如加、减、乘、除、清零等。下面我们将详细解释该应用程序的实现细节。 Java Swing 框架 ...
在本项目中,我们讨论的是一个使用Java编程...以上就是构建一个Java计算器应用时涉及的主要技术点。通过这个项目,开发者可以巩固对Java语言的理解,增强面向对象编程的实践能力,以及提升处理用户输入和异常的能力。
通过以上知识点的解释,我们可以理解这个Java计算器小程序的基本工作原理。实际的源代码会包含类定义、方法实现以及具体的逻辑处理,对于学习Java编程和理解程序设计思路是非常有价值的。如果你对Java编程感兴趣,...
【描述】"简易的JAVA计算器" 提供了一个直观的示例,展示了如何在Java中设计一个用户界面以及处理用户的输入和输出。这个项目可能包含了一个独立的源代码文件(Calculator.java)和编译后的类文件(Calculator.class...