这是我写的一个计算器,可运算四则混合运算,支持多重括号签套,自己感觉写得相当不好,实现手法笨拙,效率不高,希望大家指点指点.
一:
package calcul;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class CalculateMethod {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
static int count = 0;
static ArrayList lt = new ArrayList();
// 计算前校验计算表达式的方法
public static boolean checkExpression(String str) {
int count = 0;
String checkModel = "([0-9]|[\\+\\-\\*/\\(\\).])+";
Pattern p = Pattern.compile(checkModel);
Matcher m = p.matcher(str);
boolean b1 = m.matches();
if (!b1)
return b1;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (i == 0) {
if (ch == '.' || ch == '*' || ch == '/')
return false;
}
if (ch == '.') {
if (i < str.length() - 1) {
if (!isNumeric(str.charAt(i + 1)))
return false;
} else
return false;
if (!isNumeric(str.charAt(i - 1)))
return false;
}
if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
if (i < str.length() - 1) {
if (!isNumeric(str.charAt(i + 1))
&& str.charAt(i + 1) != '(')
return false;
} else
return false;
if (i > 0) {
if (!isNumeric(str.charAt(i - 1))
&& str.charAt(i - 1) != ')') {
if (ch == '*' || ch == '/')
return false;
if (ch == '+' || ch == '-') {
if (str.charAt(i - 1) != '(')
return false;
}
}
}
}
}
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch == '(')
++count;
else if (ch == ')')
--count;
}
if (count != 0)
return false;
for (int i = 0; i < str.length(); i++) {
try {
char ch = str.charAt(i);
if (ch == '(') {
if (str.charAt(i + 1) == ')')
return false;
} else if (ch == ')') {
if (str.charAt(i + 1) == '(')
return false;
if (isNumeric(str.charAt(i + 1)))
return false;
}
} catch (Exception e) {
return true;
}
}
if (count != 0)
return false;
return true;
}
// 判断是否是数字的方法
public static boolean isNumeric(char str) {
String checkModel = "[0-9]+";
Pattern p = Pattern.compile(checkModel);
Matcher m = p.matcher(String.valueOf(str));
boolean b = m.matches();
return b;
}
// 设置输入框显示值的方法
public static void setJText(String jbName) {
CalculateTextPanel c = CalculateTextPanel.getCalculateTextPanel();
JTextField jt = c.jt;
c.setTestValue(jt.getText() + jbName);
}
// 提取括号里的计算式方法
public static String getString(String str) throws MyException {
String string = new String();
int count = 0;
int leftCount = 0;
int rightCount = 0;
for (int i = 0; i < str.length(); i++) {
char temp = str.charAt(i);
if (temp == '(') {
leftCount = i;
count++;
continue;
}
if (temp == ')') {
rightCount = i;
break;
}
}
if (count == 0)
return str;
if (count != 0) {
String s1 = str.substring(leftCount + 1, rightCount);
String s2 = str.substring(leftCount, rightCount + 1);
String strtemp = result2(result1(subStr(s1)));
string = str.replace(s2, strtemp);
}
return string;
}
public static int getCount(String str) {
int count = 0;
for (int i = 0; i < str.length(); i++) {
char temp = str.charAt(i);
if (temp == '(') {
count++;
continue;
}
}
return count;
}
public static String getStr(String str) throws MyException {
int count = getCount(str);
if (count == 0)
return str;
else
for (int i = 0; i < count; i++) {
str = getString(str);
}
return str;
}
// 分解没有括号的计算表达式
public static ArrayList subStr(String str) {
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (i != 0 && !CalculateMethod.isNumeric(str.charAt(i))) {
lt.add(str.substring(0, i));
lt.add(str.substring(i, i + 1));
str = str.substring(i + 1);
count++;
if (str.indexOf("+") == -1 && str.indexOf("-") == -1
&& str.indexOf("*") == -1 && str.indexOf("/") == -1) {
lt.add(str);
break;
}
subStr(str);
break;
}
}
for (int i = 0; i < lt.size(); i++) {
if (lt.get(i).equals(".")) {
Object ob1 = lt.get(i - 1);
Object ob2 = lt.get(i);
Object ob3 = lt.get(i + 1);
String s = ob1.toString() + ob2.toString() + ob3.toString();
lt.set(i - 1, s);
lt.remove(i);
lt.remove(i);
}
}
if (!lt.get(1).equals("+") && !lt.get(1).equals("-")
&& !lt.get(1).equals("*") && !lt.get(1).equals("/")
&& !lt.get(1).equals("(")) {
lt.remove(0);
}
return lt;
}
// 两个数计算的表达式的计算方法
public static String mulAndDivi(String num1, String sign, String num2)
throws MyException {
double dnum1 = Double.parseDouble(num1);
double dnum2 = Double.parseDouble(num2);
double result = 0;
if (sign.equals("*"))
result = dnum1 * dnum2;
else if (sign.equals("/")) {
result = dnum1 / dnum2;
if (dnum2 == 0)
throw new MyException("除数为0");
} else if (sign.equals("+"))
result = dnum1 + dnum2;
else if (sign.equals("-"))
result = dnum1 - dnum2;
return Double.toString(result);
}
// 计算乘除的方法
public static ArrayList result1(ArrayList lt) throws MyException {
for (int i = 0; i < lt.size(); i++) {
if (lt.get(i).equals("*") || lt.get(i).equals("/")) {
Object ob1 = lt.get(i - 1);
Object ob2 = lt.get(i);
Object ob3 = lt.get(i + 1);
String result = CalculateMethod.mulAndDivi(ob1.toString(), ob2
.toString(), ob3.toString());
lt.set(i - 1, result);
lt.remove(i);
lt.remove(i);
result1(lt);
break;
}
}
return lt;
}
// 计算加减的方法
public static String result2(ArrayList lt) throws MyException {
if (lt.size() > 1) {
String result = CalculateMethod.mulAndDivi(lt.get(0).toString(), lt
.get(1).toString(), lt.get(2).toString());
lt.remove(0);
lt.remove(0);
lt.remove(0);
lt.add(0, result);
result2(lt);
}
return lt.get(0).toString();
}
// 取得最后结果的方法
public static String getResult(String s) throws MyException {
String str = CalculateMethod.getStr(s);
ArrayList lt1 = CalculateMethod.subStr(str);
ArrayList lt2 = CalculateMethod.result1(lt1);
String lt3 = CalculateMethod.result2(lt2);
count = 0;
lt.clear();
return lt3;
}
}
二:
package calcul;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
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.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Map;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JPanel;
public class CalculatePanel extends JPanel {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
private JButton jb[] = new JButton[20];
private String[] jbName = new String[] { "0", "1", "2", "3", "4", "5", "6",
"7", "8", "9", "=", "+", "-", "*", "/", "(", ")", ".", "清零", "关闭" };
public CalculatePanel() {
Font font = new Font("Serif", Font.BOLD, 14);
this.setLayout(new GridLayout(4, 5, 3, 3));
this.setBackground(Color.BLUE);
for (int i = 0; i < 20; i++) {
jb[i] = new JButton(jbName[i]);
jb[i].setFont(font);
jb[i].setSize(1, 1);
this.add(jb[i]);
}
addListenerMethod();
}
public void myAction(){
CalculateTextPanel c = CalculateTextPanel
.getCalculateTextPanel();
String result;
JTextField jt = c.jt;
if (jt.getText() != null) {
boolean b = CalculateMethod.checkExpression(jt
.getText());
if (!b) {
JOptionPane
.showMessageDialog(null, "计算表达式不正确!");
jt.setText(null);
CalculateMethod.count = 0;
CalculateMethod.lt.clear();
} else
try {
CalculateMethod.setJText("="
+ CalculateMethod.getResult(jt
.getText().trim()
.toString()));
} catch (MyException e1) {
JOptionPane
.showMessageDialog(null, "除数为零!");
jt.setText(null);
CalculateMethod.count = 0;
CalculateMethod.lt.clear();
}
}
}
public void addListenerMethod() {
for (int i = 0; i < 18; i++) {
if (i != 10)
jb[i].addActionListener(new KeyAction(jbName[i]));
else {
jb[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myAction();
}
});
jb[19].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
}
jb[18].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CalculateTextPanel c = CalculateTextPanel
.getCalculateTextPanel();
JTextField jt = c.jt;
jt.setText(null);
}
});
}
}
三:
package calcul;
import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class CalculateTextPanel extends JPanel {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
private static final CalculateTextPanel c = new CalculateTextPanel();
JTextField jt = new JTextField();
private CalculateTextPanel() {
jt.setHorizontalAlignment(JTextField.RIGHT);
this.setBackground(Color.BLUE);
this.setLayout(new BorderLayout());
this.add("Center", jt);
}
public static CalculateTextPanel getCalculateTextPanel() {
return c;
}
public void setTestValue(String str) {
jt.setText(str);
}
}
四:
package calcul;
import javax.swing.JFrame;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import java.awt.Color;
public class CalculateFrame extends JFrame{
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
static int WIDTH;
static int HIGHT;
public CalculateFrame() {
this.setResizable(false);
this.setTitle("记算器" + " " + "Justin"+" "+ "http://suhuanxi.iteye.com");
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension screenSize = kit.getScreenSize();
int screenHeight = screenSize.height;
int screenWidth = screenSize.width;
WIDTH = screenWidth / 3;
HIGHT = screenHeight / 4;
this.setLocation(screenWidth / 4, screenHeight / 4);
this.setSize(WIDTH, HIGHT);
this.setBackground(Color.BLUE);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CalculateTextPanel panel1 =CalculateTextPanel.getCalculateTextPanel();
CalculatePanel panel2 = new CalculatePanel();
CalculateBottomPanel panel3 = new CalculateBottomPanel();
this.setLayout(new BorderLayout());
this.add("North",panel1);
this.add("Center",panel2);
this.add("South",panel3);
}
}
五:
package calcul;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
public class KeyAction implements ActionListener{
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
String jbName;
KeyAction(String jbName){
this.jbName=jbName;
}
public void actionPerformed(ActionEvent arg0) {
CalculateMethod.setJText(jbName);
}
}
六:
package calcul;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
public class CalculateBottomPanel extends JPanel {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
CalculateBottomPanel() {
this.setBackground(Color.WHITE);
}
protected void paintComponent(Graphics g) {
Font f1 = new Font("Serif", Font.BOLD, 10);
g.setFont(f1);
g.setColor(Color.blue);
super.paintComponent(g);
g.drawString("版权所有,翻版必究", 110, 8);
}
}
七:
package calcul;
public class MyException extends Exception{
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
public MyException(String msg){
super(msg);
}
}
八:
package calcul;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class MainRun {
/**
* 神恋科技:http://suhuanxi.iteye.com
*/
public static void main(String[] args) {
CalculateFrame frame = new CalculateFrame();
frame.setVisible(true);
frame.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
}
分享到:
- 2008-10-11 20:38
- 浏览 1200
- 评论(0)
- 论坛回复 / 浏览 (0 / 4022)
- 查看更多
相关推荐
【四则混合运算计算器】是一种计算工具,它能够处理包括加法、减法、乘法、除法以及指数在内的多种算术运算,并且支持使用括号来改变运算优先级。这个计算器是用Microsoft Visual Studio 2008(简称VS2008)开发的,...
**VC60MFC编写的四则混合运算计算器** 该计算器程序是利用Microsoft Visual C++ 6.0的MFC(Microsoft Foundation Classes)框架开发的。MFC是微软提供的一套面向对象的类库,它封装了Windows API,使得开发者可以...
《VB60实现的四则混合运算计算器解析》 VB60,即Visual Basic 6.0,是Microsoft公司推出的经典编程环境,主要用于编写Windows应用程序。在这个环境中,开发者可以利用其直观的图形用户界面(GUI)和事件驱动编程...
《VC60实现的四则混合运算计算器》 在编程领域,计算器程序是初学者学习逻辑处理和运算符优先级的经典案例。本文将深入探讨如何使用VC60(Microsoft Visual C++ 6.0)来编写一个能进行四则混合运算的计算器。此...
在本项目中,我们主要探讨的是如何利用Java编程语言设计一个具有加减乘除四则混合运算功能的GUI(图形用户界面)计算器。这个计算器旨在模拟Windows操作系统中的标准计算器,提供用户友好的交互方式,使得非程序员也...
本篇文章将详细解析一个用VS2008 C#编写的四则混合运算计算器,该计算器能够处理加、减、乘、除以及负数和小数的运算,同时通过状态管理确保输入的正确性,采用逆波兰表达式(RPN)进行计算。 首先,我们要理解四则...
【标题】"vs2008C#写的四则混合运算计算器"是一个基于Microsoft Visual Studio 2008和C#编程语言开发的计算器应用程序,它具有处理加法、减法、乘法和除法等四则运算的能力,并且能够进行负数和小数的计算。...
在本文中,我们将深入探讨如何使用C#编程语言在Visual Studio 2003 (VS03)环境下创建一个简单的计算器程序,该程序能够执行基本的加法、减法、乘法以及除法的混合运算。这个项目对于初学者来说是很好的实践,因为它...
在C#编程中,开发一个简单的四则运算计算器是一个经典的初学者项目,它涉及到基本的UI设计、事件处理以及数值类型的转换。这个项目的核心在于理解如何接收用户输入、执行计算并返回结果。以下是对这个小型四则运算...
在本文中,我们将深入探讨如何使用Qt框架实现一个四则混合运算计算器。Qt是一个功能强大的C++库,广泛用于创建跨平台的桌面和移动应用程序。它提供了丰富的图形用户界面(GUI)组件,使得开发人员能够轻松地构建各种...
为了实现一个简单的四则混合运算计算器,我们需要定义两种类型的数据结构:一种用于存储字符串类型的运算符或数字,另一种用于存储整型数值。这两种数据结构都是基于栈来实现的。 #### 1. 字符串栈 定义了一个名为...
【标题】"vs2010+qt四则混合运算计算器"所涉及的知识点主要集中在使用Visual Studio 2010(简称VS2010)集成开发环境和Qt库来构建一个支持优先级和括号的四则混合运算计算器应用。这个项目不仅涉及到基本的C++编程,...
总之,通过VC6.0和MFC,我们可以构建一个功能齐全的四则混合运算计算器。这涉及到UI设计、事件处理、表达式解析和计算等多个方面的知识,是学习MFC和C++编程的一个实用案例。在实践中,可以不断优化代码结构,提高...
【C# Form 四则混合运算计算器】 C# Form 是微软.NET Framework 提供的一种用于创建图形用户界面(GUI)的应用程序开发方式。在这个项目中,我们讨论的是一个使用C#编程语言实现的桌面计算器,专注于四则混合运算,...
在这个四则运算计算器中,描述提到了混合运算,这意味着计算器可以处理如"2 + 3 * 4 - 5 / 2"这样的复杂表达式。实现这样的功能,我们需要理解操作数和运算符的优先级规则,例如乘法和除法的优先级高于加法和减法。...
### 四则混合运算计算器程序解析 #### 一、程序概览 本程序是一个简易的四则混合运算计算器实现,采用Java Swing库构建GUI界面。它支持加、减、乘、除以及数字输入等基本功能,并能进行简单的混合运算。 #### 二...
《VC6.0实现四则混合运算计算器》 在编程领域,计算器程序是初学者常用来练习基础控制流程和数据处理的经典案例。本项目利用Microsoft Visual C++ 6.0(简称VC6.0)这一古老的但依然强大的开发工具,实现了能够进行...
对于混合运算,我们需要考虑运算符的优先级和括号的使用。C++遵循PEMDAS(括号、指数、乘除、加减)规则,即先处理括号内的运算,然后是指数,接着是乘法和除法(从左到右),最后是加法和减法(同样从左到右)。...
在本项目中,我们讨论的是一个使用Visual Studio 2008和C#语言编写的计算器应用程序,它能够处理四则混合运算。这个计算器的设计旨在确保用户输入的运算符序列符合数学逻辑,并能够正确地计算出表达式的结果。以下是...
这篇PPT课件主要讲解了有理数的混合运算,特别是如何使用计算器进行高效准确的计算。有理数的混合运算通常包括加、减、乘、除四种基本运算,以及括号的使用来确定运算顺序。课件提到了在运算过程中可以巧妙运用运算...