计算四则混合运算的计算器

这是我写的一个计算器,可运算四则混合运算,支持多重括号签套,自己感觉写得相当不好,实现手法笨拙,效率不高,希望大家指点指点.

一:

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); 
                 } 
             } 
          );
 }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值