diff --git a/src/java2020spring/BaseCalculator.java b/src/java2020spring/BaseCalculator.java new file mode 100644 index 0000000000000000000000000000000000000000..f8d3b582e17f4a9b69e617888c6a5dc01473c412 --- /dev/null +++ b/src/java2020spring/BaseCalculator.java @@ -0,0 +1,285 @@ +package java2020spring; + +import java.awt.*; +import java.awt.event.*; +import java.util.Stack; +import javax.swing.*; + +public class BaseCalculator extends JFrame implements ActionListener{ + + StringBuilder secondNum = new StringBuilder(); //存储运算符之后的数字 + + double result = 0; + + double num = 0; + + int count = 0; //统计运算符的个数 + + char oper = ' '; //用于对每个运算符做相应的标识 + + boolean M = false; //用于记录是否按下“M+”或“M-" + + double saveResult = 0; //用于记录通过按下“M+”或“M-”存储的数字 + + JTextField showArea; + + JButton [] button = new JButton[28]; + + Stack numStack = new Stack(); //声明一个栈用于存储数字 + + Stack saveNum =new Stack(); //声明一个栈用于通过按下“M+”或“M-”存储的数字 + //计算器上的按钮的字符 + String [] symbol = {"MC","MR","M+","M-", + "%","CE","C","Del", + "1/x","x²","√x","÷", + "7","8","9","×", + "4","5","6","-", + "1","2","3","+", + "±","0",".","="}; + + JPanel p; + + public BaseCalculator() { + init(); + setTitle("标准计算器"); + setBounds(100,100,300,400); + setVisible(true); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + void init() { + showArea = new JTextField(); + showArea.setHorizontalAlignment(JTextField.RIGHT); //将文本框的光标置于右边 + showArea.setFont(new Font("Arial",Font.BOLD,18)); + showArea.setPreferredSize(new Dimension(300,60)); //将文本框设置成合适大小 + add(showArea,BorderLayout.NORTH); + p = new JPanel(); + p.setLayout(new GridLayout(7,4)); //将p的布局设置为7行4列的GridLayout布局以便存放按钮 + //利用循环逐一设置每个按钮并注册监视器 + for(int i=0;i<28;i++) { + button[i] = new JButton(symbol[i]); + button[i].addActionListener(this); + button[i].setFont(new Font("Arial",Font.BOLD,18)); + p.add(button[i]); + } + add(p); + } + + public void actionPerformed(ActionEvent e) { + String text=e.getActionCommand(); //记录按钮上的命令字符 + //按下“CE”按钮时 + if(text.equals("CE")) { + //若缓冲区有数字则将要其清空 + if (secondNum.length() > 0) { + secondNum.delete(0, secondNum.length()); + } + showArea.setText(""); //同时将当前文本框清空 + } + //按下“C”按钮时,将一切恢复至初始状态 + if(text.equals("C")) { + if (secondNum.length() > 0) { + secondNum.delete(0, secondNum.length()); + } + showArea.setText(""); + count=0; + //清空栈内的数字 + while(!numStack.isEmpty()) { + numStack.pop(); + } + } + //按下“1/x”按钮时 + if(text.equals("1/x")) { + num=Double.parseDouble(showArea.getText()); //将文本框内的字符串转化成浮点数 + //满足“分母不能为0”的条件 + if(num!=0) { + num=1/num; + showArea.setText(String.valueOf(num)); + } + else { + showArea.setText(""); + } + } + //按下“x²”按钮时 + if(text.equals("x²")) { + num = Double.parseDouble(showArea.getText()); + num*=num; + showArea.setText(String.valueOf(num)); + } + //按下“√x”按钮时 + if(text.equals("√x")) { + if(num>=0) { + num = Double.parseDouble(showArea.getText()); + num = Math.sqrt(num); + showArea.setText(String.valueOf(num)); + } + else + showArea.setText(""); + } + //按下“±”按钮时 + if(text.equals("±")) { + num = Double.parseDouble(showArea.getText()); + num*=(-1); + showArea.setText(String.valueOf(num)); + } + //按下“%”按钮时 + if(text.equals("%")) { + num = Double.parseDouble(showArea.getText()); + num*=0.01; + showArea.setText(String.valueOf(num)); + } + //按下“Del”按钮时,即是退格 + if(text.equals("Del")) { + int length = showArea.getText().length(); + if(length==1) { + showArea.setText(""); + if (secondNum.length() > 0) { + secondNum.delete(0, secondNum.length()); + } + } + else { + showArea.setText(showArea.getText().substring(0,length-1)); + if(secondNum.length()>0) { + secondNum.delete(secondNum.length()-1,secondNum.length()); + } + } + } + //按下“.”按钮时 + if(text.equals(".")) { + if(showArea.getText().equals("")||showArea.getText().equals("0")) { + showArea.setText("0."); + } + else if(showArea.getText().indexOf(".")==-1) { + showArea.setText(showArea.getText()+"."); + secondNum.append(text); + } + } + //按下数字按钮时 + if(text.matches("[0-9]")) { + // 判断是否为第一个数 + if(numStack.isEmpty()) { + showArea.setText(showArea.getText()+text); + } + // 如果是运算符之后的数字 + else { + // 先将该数字添加到缓冲区 + secondNum.append(text); + // 再写入文本框 + showArea.setText(secondNum.toString()); + } + } + //按下运算符按钮时 + String regex="[\\+\\-\\×\\÷]"; + if(text.matches(regex)) { + // 按下运算符时清空缓存区,方便继续存储按下运算符之后的数字 + if (secondNum.length() > 0) { + secondNum.delete(0, secondNum.length()); + } + //如果是第一次按下运算符键 + if(numStack.isEmpty() && count == 0) { + num=Double.parseDouble(showArea.getText()); + numStack.push(num); //将输入的第一个数字先压入栈内 + } + //按下“+”按钮时 + if(text.equals("+")) { + count++; //每一次按下运算符都会进行计数 + //当按下运算符的次数多于等于2次时,总先将此运算符前的两个数做运算 + if(count>=2) { + calculate(); + numStack.push(result); + showArea.setText(String.valueOf(result)); + } + //对此运算符做标记,若在这之后再按运算符即可做出相应的运算 + oper='+'; + } + //按下“-”按钮时 + if(text.equals("-")) { + count++; + if(count>=2) { + calculate(); + numStack.push(result); + showArea.setText(String.valueOf(result)); + } + oper='-'; + } + //按下“×”按钮时 + if(text.equals("×")) { + count++; + if(count>=2) { + calculate(); + numStack.push(result); + showArea.setText(String.valueOf(result)); + } + oper='*'; + } + //按下“÷"按钮时 + if(text.equals("÷")) { + count++; + if(count>=2) { + calculate(); + numStack.push(result); + showArea.setText(String.valueOf(result)); + } + oper='/'; + } + } + //按下“=”按钮时 + if(text.equals("=")){ + calculate(); //计算最后两个数 + count = 0; //并将按下运算符的次数清空 + oper=' '; + showArea.setText(String.valueOf(result)); + } + //MC或MR事件的执行必须建立在用户按下了M+或M-按钮的前提下 + //按下“MC”按钮时,将存储起来的栈清空,并将一切初始化 + if(text.equals("MC")&&M) { + while(!saveNum.isEmpty()) { + saveNum.pop(); + } + M = false; + saveResult = 0; + } + //按下“MR”按钮时 + if(text.equals("MR")&&M) { + saveResult = saveNum.pop(); + showArea.setText(String.valueOf(saveResult)); + } + //按下“M+”按钮时 + if(text.equals("M+")) { + num = Double.parseDouble(showArea.getText()); + if(saveNum.isEmpty()){ + saveNum.push(num); + } + else{ + saveResult = num + saveNum.pop(); + saveNum.push(saveResult); + } + M = true; + } + //按下“M-”按钮时 + if(text.equals("M-")) { + num = Double.parseDouble(showArea.getText()); + if(saveNum.isEmpty()){ + saveResult = (-1) * num; + saveNum.push(saveResult); + } + else{ + saveResult = saveNum.pop() - num; + saveNum.push(saveResult); + } + M = true; + } + } + //对已标记的运算符做相应的运算 + public double calculate() { + num=Double.parseDouble(showArea.getText()); + if(oper=='+') + result = numStack.pop() + num; + else if(oper=='-') + result = numStack.pop() - num; + else if(oper=='*') + result = numStack.pop() * num; + else if(oper=='/') + result = numStack.pop() / num; + return result; + } +} diff --git a/src/java2020spring/StartUp.java b/src/java2020spring/StartUp.java new file mode 100644 index 0000000000000000000000000000000000000000..530ed4b756ebe901b5a11dfa7fa686ada9743379 --- /dev/null +++ b/src/java2020spring/StartUp.java @@ -0,0 +1,8 @@ +package java2020spring; + +public class StartUp { + public static void main(String args[]) { + BaseCalculator calculator=new BaseCalculator(); + } + +}