diff --git a/JiSuan.java b/JiSuan.java new file mode 100644 index 0000000000000000000000000000000000000000..a936eb41dd7e6c3d0bde7048d6683850ce938c1e --- /dev/null +++ b/JiSuan.java @@ -0,0 +1,124 @@ +package java2020spring; +public class JiSuan { + private boolean isSecondNum = false; + String lastOp; + String firstNum = "0"; + String secondNum = "null"; + double store; +String numString = "0123456789."; +String opString = "+-*/"; + + public String catNum(String cmd, String text) { + String result = cmd; + if (!"0".equals(text)) { + if (isSecondNum) { + isSecondNum = false; + } else { + result = text + cmd; + } + } + if (result.indexOf(".") == 0) { + result = "0" + result; + } + return result; + } + public String setOp(String cmd, String text) { + this.lastOp = cmd; + this.firstNum = text; + this.secondNum = null; + this.isSecondNum = true; + return null; + } + public String cal(String text, boolean isPercent) { + double secondResult = secondNum == null ? Double.valueOf(text) + .doubleValue() : Double.valueOf(secondNum).doubleValue(); + if(secondResult == 0 && this.lastOp.equals("/")){ + return "0"; + } + if(isPercent){ + secondResult = Mymath.multiply(Double.valueOf(firstNum), Mymath.divide(secondResult, 100)); + } + if(this.lastOp.equals("+")){ + firstNum = String.valueOf(Mymath.add(Double.valueOf(firstNum),secondResult)); + }else if (this.lastOp.equals("-")) { + firstNum = String.valueOf(Mymath.subtract(Double.valueOf(firstNum),secondResult)); + }else if (this.lastOp.equals("*")) { + firstNum = String.valueOf(Mymath.multiply(Double.valueOf(firstNum),secondResult)); + }else if (this.lastOp.equals("/")) { + firstNum = String.valueOf(Mymath.divide(Double.valueOf(firstNum),secondResult)); + } + this.isSecondNum = true; + return firstNum; + } + public String sqrt(String text){ + this.isSecondNum = true; + return String.valueOf(Math.sqrt(Double.valueOf(text))); + } + public String setReciprocal(String text){ + if (text.equals("0")){ + return text; + }else{ + this.isSecondNum = true; + return String.valueOf(Mymath.divide(1, Double.valueOf(text))); + } + } + public String mCmd(String cmd,String text){ + if(cmd.equals("M+")){ + store = Mymath.add(store, Double.valueOf(text)); + }else if (cmd.equals("MC")) { + store = 0; + }else if (cmd.equals("MR")) { + isSecondNum = true; + return String.valueOf(store); + }else if (cmd.equals("MS")) { + store = Double.valueOf(text).doubleValue(); + } + return null; + } + + public String backSpace(String text){ + return text.equals("0") || text.equals("") ? "0" :text.substring(0,text.length()-1); + } + + public String setNegative(String text){ + if(text.indexOf("-") == 0){ + return text.substring(1,text.length()); + }else{ + return "-" + text; + } + } + public String clearAll(){ + this.firstNum = "0"; + this.secondNum = null; + return this.firstNum; + } + public String clear(String text){ + return "0"; + } + + public String callMethod(String cmd, String text){ + if(cmd.equals("C")){ + return clearAll(); + }else if(cmd.equals("CE")){ + return clear(text); + }else if (cmd.equals("Back")) { + return backSpace(text); + }else if (numString.indexOf(cmd) != -1) { + return catNum(cmd, text); + }else if (opString.indexOf(cmd) != -1) { + return setOp(cmd, text); + }else if (cmd.equals("+/-")) { + return setNegative(text); + }else if(cmd.equals("1/x")){ + return setReciprocal(text); + }else if (cmd.equals("sqrt")) { + return sqrt(text); + }else if(cmd.equals("%")){ + return cal(text, true); + }else if(cmd.equals("=")){ + return cal(text, false); + }else { + return mCmd(cmd, text); + } + } +} \ No newline at end of file diff --git a/JiSuanQi.java b/JiSuanQi.java new file mode 100644 index 0000000000000000000000000000000000000000..a10b16b50e528eb3f90e2dbb2fe2ee06ec26afdb --- /dev/null +++ b/JiSuanQi.java @@ -0,0 +1,129 @@ +package java2020spring; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Arrays; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTextField; +public class JiSuanQi extends JFrame { + int PRE_WIDTH = 700; + int PRE_HEIGHT = 600; + JTextField text = null; + JButton button = null; + String[] 按键1 = {"7","8","9","/","sqrt","4","5","6","*","%","1","2","3","-","1/x","0","+/-",".","+","="}; + String[] 按键2 = {"MC","MR","MS","M+"}; + String[] 按键3 = {"Back","CE","C"}; + JiSuan service = new JiSuan(); + public JiSuanQi(){ + this.setTitle("计算器"); + this.setSize(PRE_WIDTH, PRE_HEIGHT); + this.setLocationRelativeTo(null); + this.setResizable(false); + JPanel panel = new JPanel(); + panel.setLayout(new BorderLayout(10,1)); + panel.add(getTextField(), BorderLayout.NORTH); + panel.setPreferredSize(new Dimension(PRE_WIDTH, PRE_HEIGHT)); + JButton[] mButton = getMButton(); + JPanel panel1 = new JPanel(); + panel1.setLayout(new GridLayout(5,1,0,5)); + for(JButton b : mButton ){ + panel1.add(b); + } + panel.add(panel1,BorderLayout.WEST); + JButton[] rButton = getRButton(); + JPanel panel2 = new JPanel(); + panel2.setLayout(new BorderLayout(1,5)); + JPanel panel21 = new JPanel(); + panel21.setLayout(new GridLayout(1,3,3,3)); + for(JButton b : rButton){ + panel21.add(b); + } + panel2.add(panel21,BorderLayout.NORTH); + JButton[] nButton = getNButton(); + JPanel panel22 = new JPanel(); + panel22.setLayout(new GridLayout(4,5,3,5)); + for(JButton b : nButton){ + panel22.add(b); + } + panel2.add(panel22,BorderLayout.CENTER); + panel.add(panel2,BorderLayout.CENTER); + this.add(panel); + this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + this.setVisible(true); + } +JTextField getTextField(){ + text = new JTextField("0",10); + return text; + } + JButton[] getNButton(){ + String[] redButton = {"/","*","-","+","="}; + JButton[] nbutton = new JButton[按键1.length]; + for(int i = 0; i < this.按键1.length; i++){ + JButton b = new JButton(this.按键1[i]); + b.addActionListener(getActionListener()); + Arrays.sort(redButton); + if(Arrays.binarySearch(redButton, 按键1[i]) >= 0){ + b.setForeground(Color.black); + }else{ + b.setForeground(Color.black); + } + nbutton[i] = b; + } + return nbutton; + } +JButton[] getMButton(){ + JButton[] mbutton = new JButton[按键2.length + 1]; + mbutton[0] = getButton(); + for(int i = 0; i < this.按键2.length; i++){ + JButton b = new JButton(this.按键2[i]); + b.addActionListener(getActionListener()); + b.setForeground(Color.black); + mbutton[i+1] = b; + } + return mbutton; + } + JButton[] getRButton(){ + JButton[] rbutton = new JButton[按键3.length]; + for(int i = 0; i < this.按键3.length; i++){ + JButton b = new JButton(this.按键3[i]); + b.addActionListener(getActionListener()); + b.setForeground(Color.black); + rbutton[i] = b; + } + return rbutton; + } + JButton getButton(){ + button = new JButton(); + return button; + } + ActionListener getActionListener(){ + ActionListener actionListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + String cmd = e.getActionCommand(); + String result = null; + try { + result = service.callMethod(cmd, text.getText()); + } catch (Exception e2) { + System.out.println(e2.getMessage()); + } + if(cmd.indexOf("MC") == 0){ + button.setText(""); + }else if(cmd.indexOf("M") == 0){ + button.setText("M"); + } + if(result != null){ + text.setText(result); + } + } + }; + return actionListener; + } + public static void main(String[] args) { + new JiSuanQi(); + } +} \ No newline at end of file diff --git a/Mymath.java b/Mymath.java new file mode 100644 index 0000000000000000000000000000000000000000..93580de2991d9a26646c4603984f99a06f2d4f25 --- /dev/null +++ b/Mymath.java @@ -0,0 +1,27 @@ +package java2020spring; +import java.math.BigDecimal; +public class Mymath { +static BigDecimal getBigDecimal(double number){ + return new BigDecimal(number); + } + public static double add(double num1, double num2) { + BigDecimal first = getBigDecimal(num1); + BigDecimal second = getBigDecimal(num2); + return first.add(second).doubleValue(); +} + public static double subtract(double num1, double num2) { + BigDecimal first = getBigDecimal(num1); + BigDecimal second = getBigDecimal(num2); + return first.subtract(second).doubleValue(); +} + public static double multiply(double num1, double num2) { + BigDecimal first = getBigDecimal(num1); + BigDecimal second = getBigDecimal(num2); + return first.multiply(second).doubleValue(); +} + public static double divide(double num1, double num2) { + BigDecimal first = getBigDecimal(num1); + BigDecimal second = getBigDecimal(num2); + return 0; +} +} \ No newline at end of file diff --git a/src/java2020spring/Test.java b/src/java2020spring/Test.java deleted file mode 100644 index fc09c195f566d0e707f5e8a2f05fd168069c73a7..0000000000000000000000000000000000000000 --- a/src/java2020spring/Test.java +++ /dev/null @@ -1,10 +0,0 @@ -package java2020spring; - -public class Test { - - public static void main(String[] args) { - System.out.println("Hello world!"); - - } - -}