`

Java 计算器

阅读更多
以下是自己用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
分享到:
评论
1 楼 zxw961346704 2013-08-31  
值得学习的算法

相关推荐

    java计算器java计算器

    java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器java计算器

    java计算器代码(gui界面)

    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包实现的JAVA计算器”旨在通过AWT来构建一个功能完备的计算器应用。下面将详细介绍这个项目中的关键知识点。 1. **AWT组件**: - AWT提供了各种基本组件,如按钮(Button)、文本字段(TextField)、...

    java计算器+报告

    【标题】"java计算器+报告"揭示了这个项目的核心内容,即一个用Java语言实现的计算器程序,并且包含了相应的项目报告。这表明该程序不仅是一个简单的计算工具,可能还涉及了高级功能,如复杂数学运算、图形界面或者...

    java计算器 期末作业

    【Java计算器实现详解】 在Java编程的学习过程中,创建一个计算器是一项常见的练习任务,它能帮助学生深入理解面向对象编程的概念,以及如何处理用户输入和输出。这个“java计算器”项目,作为期末作业,旨在检验...

    JAVA计算器 课程设计报告

    《JAVA计算器课程设计详解》 在计算机编程领域,设计并实现一个计算器程序是常见的课程设计任务,这有助于学习者深入理解编程语言的基本语法和逻辑控制。在这个Java计算器课程设计报告中,我们将探讨如何构建一个...

    Java计算器实训报告

    Java计算器实训报告旨在通过设计和实现一个计算器程序,让学生深入理解和掌握Java编程语言以及面向对象设计的基本原理。这个计算器分为普通计算器和科学计算器两种模式,提供了丰富的数学运算功能。 在需求分析部分...

    手机上的JAVA计算器

    Java计算器是基于Java编程语言开发的一款简单应用,适用于智能手机用户。它通常包含了基本的数学运算功能,如加、减、乘、除,以及可能的更高级功能,如求平方根、指数运算、对数等。在Java中实现计算器涉及到许多...

    java 计算器 源代码

    Java计算器源代码是一个典型的编程项目,它展示了如何在Java中实现一个简单的图形用户界面(GUI)应用程序,用于执行基本的算术运算。这个项目通常包括加、减、乘、除等基本功能,以及可能的括号支持和错误处理。...

    java 计算器 实验报告

    **实验报告:简易Java计算器制作** 一、实验目的及要求 本实验旨在加深对Java编程语言的理解,特别是其面向对象编程特性。通过设计并实现一个简单的计算器,学习者将掌握以下知识点: 1. Java基本语法:包括变量...

    带有清零功能的小型JAVA计算器完整源代码!

    Java 计算器完整源代码实现详解 在本资源中,我们将实现一个完整的 Java 计算器应用程序,该应用程序具有基本的计算功能,如加、减、乘、除、清零等。下面我们将详细解释该应用程序的实现细节。 Java Swing 框架 ...

    Calculator_java计算器_

    在本项目中,我们讨论的是一个使用Java编程...以上就是构建一个Java计算器应用时涉及的主要技术点。通过这个项目,开发者可以巩固对Java语言的理解,增强面向对象编程的实践能力,以及提升处理用户输入和异常的能力。

    java 计算器 小程序(精简版)

    通过以上知识点的解释,我们可以理解这个Java计算器小程序的基本工作原理。实际的源代码会包含类定义、方法实现以及具体的逻辑处理,对于学习Java编程和理解程序设计思路是非常有价值的。如果你对Java编程感兴趣,...

    简易计算器.rar_java 计算器_java 计算_java计算器_计算器

    【描述】"简易的JAVA计算器" 提供了一个直观的示例,展示了如何在Java中设计一个用户界面以及处理用户的输入和输出。这个项目可能包含了一个独立的源代码文件(Calculator.java)和编译后的类文件(Calculator.class...

Global site tag (gtag.js) - Google Analytics