/*
* 本版计算器设计括号运算
* 利用集合来进行遍历运算
* 输入处理并未完善,存在bug(输入运算公式合理,便能运算出结果)
* 本版计算器设计括号运算
* 利用集合来进行遍历运算
* 输入处理并未完善,存在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="";
@Override
public 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"));
else
textFieldIn.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);
else
textFieldIn.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));
else
textFieldIn.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());
}
}else
textFieldIn.setText("0");
}
if(textFieldIn.getText().equals("0")){
if(mySet.size()>0&&mySet.get(mySet.size()-1).toString().equals(")")){
flagRightBracket=true;
}
}
//删完则赋0
if(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;
}
else
falg=mySet.remove(mySet.size()-1);
}
else
falg=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();
}
}