java小小工具第四弹 计算器(括号运算)

来源:互联网 发布:网络信息发布通知单 编辑:程序博客网 时间:2024/05/16 04:56
/*
 * 本版计算器设计括号运算
 * 利用集合来进行遍历运算
 * 输入处理并未完善,存在bug(输入运算公式合理,便能运算出结果)

 */


package cn.hncu.mytoolkit;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.Insets;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.print.attribute.TextSyntax;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.border.Border;import cn.hncu.set.MySet;public class MyJsq extends JFrame {private JMenu[] menu;private JMenuItem[] menuItem;private JButton[] button;private JTextField textFieldShow,textFieldIn;private MySet mySet=new MySet();private ActionListener btnListener=new ActionListener() {//输入处理标记private boolean flagPoint=true;private boolean flagMessage=false;private boolean[] flagBracket=new boolean[0];private boolean flagRightBracket=false;private String Message="";@Overridepublic void actionPerformed(ActionEvent e) {//输入处理if(flagMessage){textFieldIn.setText(Message);flagMessage=false;return;}String text=((JButton)e.getSource()).getText();//标签转换if(text.equals("=")){button[4].setText("CE");}else{button[4].setText("←");}//)括号后需接运算连接符if(flagRightBracket&&!(isSymbol(text)||text.equals("←")||text.equals("="))){message();textFieldIn.setText(")后需运算连接符");return;}else{flagRightBracket=false;}//数据处理//0的处理if(text.equals("0")){if(textFieldIn.getText().equals("0"));elsetextFieldIn.setText(textFieldIn.getText()+text);return;}//.的处理else if(text.equals(".")){//小数点不能多次出现if(!flagPoint){Toolkit.getDefaultToolkit().beep();return;}flagPoint=false;textFieldIn.setText(textFieldIn.getText()+text);return;}//数字处理else if(text.charAt(text.length()-1)>='1'&&text.charAt(text.length()-1)<='9'){if(textFieldIn.getText().equals("0"))textFieldIn.setText(text);elsetextFieldIn.setText(textFieldIn.getText()+text);return;}//删除处理else if(text.equals("←")){//删除小数点时恢复if(textFieldIn.getText().lastIndexOf(".")==textFieldIn.getText().length()-1)flagPoint=true;//不为0时删除末位if(!textFieldIn.getText().equals("0"))textFieldIn.setText(textFieldIn.getText().substring(0, textFieldIn.getText().length()-1));//为0时删除上一个数if(textFieldIn.getText().equals("0")){//有上一个数,则删if(mySet.size()>0){String str=mySet.get(mySet.size()-1).toString();if(str.length()>1)//多位数时textFieldIn.setText(str.substring(0, str.length()-1));elsetextFieldIn.setText("0");mySet.remove(mySet.size()-1);//移除上一位数textFieldShow.setText("");for (int i = 0; i < mySet.size(); i++) {textFieldShow.setText(textFieldShow.getText()+" "+mySet.get(i).toString());}}elsetextFieldIn.setText("0");}if(textFieldIn.getText().equals("0")){if(mySet.size()>0&&mySet.get(mySet.size()-1).toString().equals(")")){flagRightBracket=true;}}//删完则赋0if(textFieldIn.getText().equals(""))textFieldIn.setText("0");//有小数点则取消小数点if(textFieldIn.getText().lastIndexOf(".")>=0)flagPoint=false;return;}//清零处理else if(text.equals("CE")){textFieldIn.setText("0");textFieldShow.setText("");mySet.removeAll();button[4].setText("←");return;}//小数点合理性处理flagPoint=true;if(text.indexOf(".")==text.length()-1)text.substring(0, text.length()-1);//双目运算符处理if(isSymbol(text)){boolean falg=false;if(textFieldIn.getText().equals("0")||Double.parseDouble(textFieldIn.getText())==0){if(mySet.size()<1)return;String s=mySet.get(mySet.size()-1).toString();if(s.equals("(")){falg=false;message();textFieldIn.setText("(后需接数字");}else if(s.equals(")")){falg=true;}elsefalg=mySet.remove(mySet.size()-1);}elsefalg=mySet.add(textFieldIn.getText());if(falg){operationHandle(text);}return;}//括号处理else if(text.equals("(")||text.equals(")")){if(text.equals("(")){if(textFieldIn.getText().equals("0")){if(mySet.size()>0&&!isSymbol(mySet.get(mySet.size()-1).toString())){message();textFieldIn.setText("(前需运算连接符");}else{operationHandle(text);//记录括号次数flagBracket=new boolean[flagBracket.length+1];}}else{message();textFieldIn.setText("(前需运算连接符");}}else{if(flagBracket.length<1){message();textFieldIn.setText("前无(括号");}else{mySet.add(textFieldIn.getText());operationHandle(text);flagBracket=new boolean[flagBracket.length-1];flagRightBracket=true;}}return;}//开方处理else if(text.equals("√")){//if(textFieldIn.getText().equals("0")){//if(isSymbol(mySet.get(mySet.size()-1).toString())){//mySet.add(textFieldIn.getText());//}//}//else//mySet.add(""+Math.pow(Double.parseDouble(textFieldIn.getText()), 1/2));}//1/x处理else if(text.equals("1/x")){}//结果处理if(text.equals("=")){if(mySet.size()>0&&isSymbol(mySet.get(mySet.size()-1).toString())){mySet.add(textFieldIn.getText());operationHandle(text) ;}String[] strs=new String[mySet.size()];for (int i = 0; i < mySet.size(); i++) {if(!mySet.get(i).toString().equals("="))strs[i]=mySet.get(i).toString();}String strTextField=handle(strs);textFieldIn.setText(strTextField);//int indix=strTextField.indexOf(".");//if(indix==-1)//textFieldIn.setText(strTextField);//else{//if(indix+3<strTextField.length())//textFieldIn.setText(strTextField.substring(0, indix+3));//else{//textFieldIn.setText(strTextField);//}//}}}private boolean isSymbol(String text) {return text.equals("+")||text.equals("-")||text.equals("*")||text.equals("/")||text.equals("%")||text.equals("^");}//错误提示private void message() {Toolkit.getDefaultToolkit().beep();flagMessage=true;Message=textFieldIn.getText();}        //输入处理private void operationHandle(String text) {mySet.add(text);textFieldShow.setText("");for (int i = 0; i < mySet.size(); i++) {textFieldShow.setText(textFieldShow.getText()+" "+mySet.get(i).toString());}textFieldIn.setText("0");}        //计算处理private String handle(String[] strs) {//处理括号whileBracket:while (true) {//找到最先的一组()int[][] numBracket = new int[0][];for (int i = 0; i < strs.length; i++) {if (strs[i] != null)if (strs[i].equals("(")) {int[][] numBra = new int[numBracket.length + 1][2];for (int k = 0; k < numBra.length; k++) {numBra[k][0] = -1;numBra[k][1] = -1;}for (int k = 0; k < numBracket.length; k++) {numBra[k][0] = numBracket[k][0];numBra[k][1] = numBracket[k][1];}numBra[numBra.length - 1][0] = i;numBracket = numBra;} else if (strs[i].equals(")")) {for (int k = numBracket.length - 1; k >= 0; k--) {if (numBracket[k][0] != -1&& numBracket[k][1] == -1) {numBracket[k][1] = i;break;}}if (numBracket[0][0] != -1&& numBracket[0][1] != -1)break;}}if (numBracket.length > 0) {String[] strBracket = new String[numBracket[0][1]- numBracket[0][0] - 1];strs[numBracket[0][0]] = null;strs[numBracket[0][1]] = null;for (int k = numBracket[0][0] + 1; k < numBracket[0][1]; k++) {strBracket[k - numBracket[0][0] - 1] = strs[k];strs[k] = null;}strs[numBracket[0][0]] = handle(strBracket);}for (int j = 0; j < strs.length; j++) {if(strs[j]!=null)if(strs[j].equals("(")){break;}if(j ==strs.length-1)break whileBracket;}}//优先级搞得/*%等运算先进行运算for (int i = 0; i < strs.length; i++) {if(strs[i]!=null)if(strs[i].equals("*")||strs[i].equals("/")||strs[i].equals("%")||strs[i].equals("^")){String first=strs[i-1];strs[i-1]=null;String end=strs[i+1];strs[i+1]=null;int count=2;while(first==null||end==null){if(first==null){first=strs[i-count];strs[i-count]=null;}if(end==null){end=strs[i+count];strs[i+count]=null;}count++;}if(strs[i].equals("*")){strs[i]=""+(Double.parseDouble(first)*Double.parseDouble(end));}else if(strs[i].equals("/")){strs[i]=""+(Double.parseDouble(first)/Double.parseDouble(end));}else if(strs[i].equals("%")){strs[i]=""+(Double.parseDouble(first)%Double.parseDouble(end));}else{strs[i]=""+Math.pow(Double.parseDouble(first),Double.parseDouble(end));}}}//+-运算for (int i = 0; i < strs.length; i++) {if(strs[i]!=null)if(strs[i].equals("+")||strs[i].equals("-")){String first=strs[i-1];strs[i-1]=null;String end=strs[i+1];strs[i+1]=null;int count=2;while(first==null||end==null){if(first==null){first=strs[i-count];strs[i-count]=null;}if(end==null){end=strs[i+count];strs[i+count]=null;}count++;}if(strs[i].equals("+")){strs[i]=""+(Double.parseDouble(first)+Double.parseDouble(end));}else{strs[i]=""+(Double.parseDouble(first)-Double.parseDouble(end));}}}for (int i = strs.length-1; i >=0; i--) {if(strs[i]!=null)return strs[i];}return null;}};private String[] s={"(",")","^","√","←",             "7","8","9","/","%",             "4","5","6","*","1/x",             "1","2","3","-","=",             "0",    ".","+"};public MyJsq(){super("简单计算器");//Dimension dim=getToolkit().getScreenSize();setBounds(100,120,225,320);setDefaultCloseOperation(DISPOSE_ON_CLOSE);getContentPane().setLayout(null);//菜单JMenuBar bar=new JMenuBar();setJMenuBar(bar);String[] str={"查看","编辑","帮助"};menu=new JMenu[str.length];for (int i = 0; i < menu.length; i++) {menu[i]=new JMenu(str[i]);bar.add(menu[i]);}//布局//显示框textFieldIn=new JTextField("0");textFieldIn.setHorizontalAlignment(JTextField.RIGHT);textFieldIn.setEditable(false);textFieldIn.setFont(new Font("仿宋", Font.BOLD, 20));;textFieldIn.setBorder(BorderFactory.createBevelBorder(2));textFieldIn.setBounds(getContentPane().getX()+12, getContentPane().getY()+26, 186, 27);getContentPane().add(textFieldIn);textFieldShow=new JTextField();textFieldShow.setHorizontalAlignment(JTextField.RIGHT);textFieldShow.setEditable(false);textFieldShow.setBorder(BorderFactory.createBevelBorder(2));textFieldShow.setBounds(getContentPane().getX()+12, getContentPane().getY()+12, 186, 12);getContentPane().add(textFieldShow);//边框线JTextField textborder=new JTextField();textborder.setEditable(false);textborder.setBounds(getContentPane().getX()+10, getContentPane().getY()+10, 192, 45);getContentPane().add(textborder);//按钮button=new JButton[s.length];int i = 0;for (; i < button.length; i++) {button[i]=new JButton(s[i]);button[i].setMargin(new Insets(0,0,0,0));getContentPane().add(button[i]);if(i<19)button[i].setBounds(getContentPane().getX()+10+i%5*40, getContentPane().getY()+60+i/5*40, 32, 32);else if(i==21||i==22)button[i].setBounds(getContentPane().getX()+10+(i+1)%5*40, getContentPane().getY()+60+(i+1)/5*40, 32, 32);button[i].addActionListener(btnListener);}button[19].setBounds(getContentPane().getX()+10+19%5*40, getContentPane().getY()+60+19/5*40, 32, 72);button[20].setBounds(getContentPane().getX()+10+20%5*40, getContentPane().getY()+60+20/5*40, 72, 32);setVisible(true);}public static void main(String[] args) {new MyJsq();}}


0 0
原创粉丝点击