diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..26d33521af10bcc7fd8cea344038eaaeb78d0ef5
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fe6cc425cc14e0850f04843fd60ed77086486c26
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ee415e06ca59fe945c79f05b89e56578d67850ce
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..35eb1ddfbbc029bcab630581847471d7f238ec53
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/java2021spring.iml b/java2021spring.iml
new file mode 100644
index 0000000000000000000000000000000000000000..1144e32ec780974e61205958ade1e768f139e3d5
--- /dev/null
+++ b/java2021spring.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/java2020spring/Calculator.java b/src/java2020spring/Calculator.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f3bab76af47b0b5a80c6b1325ed24afd2213fd6
--- /dev/null
+++ b/src/java2020spring/Calculator.java
@@ -0,0 +1,640 @@
+package java2020spring;
+
+
+import java.awt.*;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.math.BigDecimal;
+import javax.swing.*;
+import javax.swing.border.Border;
+import javax.swing.border.LineBorder;
+
+
+class storageField {//存储区
+ public double storageNum;//存储区存储的数据
+ public boolean storageMode;//是否启动存储区
+ public storageField()
+ {
+ storageNum=0;
+ storageMode=false;
+ }
+}
+
+public class Calculator extends JFrame{
+ private JTextField display1,display2,display3;
+ private JButton num[],operate[];
+ private String name[]={"MC","MR","MS","M+","M-","←","CE","C","±","√","7","8","9","/","%","4","5","6","*","1/x","1","2","3","-","=","0",".","+"};
+ private operateNum op1=new operateNum(),op2=new operateNum();//操作数1,操作数2
+ private storageField storage=new storageField();//存储区
+ private String action="op1";//表示要操作的对象 "op1"操作第一个操作数,"op2"操作第二个操作数
+ private String sign="";//运算符,默认为空
+ private String screen1,screen2;
+ private boolean Disable=false;
+ public Calculator()
+ {
+ super("计算器");
+ this.setLayout(null);
+ this.setSize(228, 324);
+ this.setResizable(false);
+ JPanel jp=new JPanel(null);
+ jp.setBounds(10,15,getWidth()-24,getHeight());
+ jp.setBackground(new Color(217,228,241));
+ this.getContentPane().setBackground(new Color(217,228,241));
+ /**显示屏**/
+ display1=new JTextField("");
+ display2=new JTextField("0");
+ display3=new JTextField("");
+ display1.setEnabled(false);
+ display2.setEnabled(false);
+ display3.setEnabled(false);
+ display1.setBounds(0, 0, 204, 26);
+ display2.setBounds(20, 20, 184, 34);
+ display3.setBounds(0, 20, 20, 34);
+ display1.setHorizontalAlignment(JLabel.RIGHT);
+ display2.setHorizontalAlignment(JLabel.RIGHT);
+ display3.setHorizontalAlignment(JLabel.CENTER);
+ display1.setFont(new Font("宋体",Font.PLAIN,12));
+ display2.setFont(new Font("宋体",Font.BOLD,20));
+ display3.setFont(new Font("宋体",Font.PLAIN,20));
+ display1.setDisabledTextColor(Color.BLACK);
+ display2.setDisabledTextColor(Color.BLACK);
+ display3.setDisabledTextColor(Color.BLACK);
+ display1.setBorder(new LineBorder(new Color(242,247,252)));
+ display2.setBorder(new LineBorder(new Color(242,247,252)));
+ display3.setBorder(new LineBorder(new Color(242,247,252)));
+ display1.setBackground(new Color(242,247,252));
+ display2.setBackground(new Color(242,247,252));
+ display3.setBackground(new Color(242,247,252));
+ // 5px*29px 28个
+ int i;
+ operate=new JButton[28];
+ //前24个
+ for(i=0;i<24;i++)
+ {
+ operate[i]=new JButton(name[i]);
+ operate[i].setMargin(new java.awt.Insets(0,0,0,0));
+ operate[i].setBounds(i%5*(35+7), 60+i/5*(29+5)+5, 35, 29);
+ jp.add(operate[i]);
+ }
+ //=号
+ operate[i]=new JButton(name[i]);
+ operate[i].setMargin(new java.awt.Insets(0,0,0,0));
+ operate[i].setBounds(i%5*(35+7), 60+i/5*(29+5)+5, 35, 29*2+5);
+ jp.add(operate[i]);
+ i++;
+ //0号
+ operate[i]=new JButton(name[i]);
+ operate[i].setMargin(new java.awt.Insets(0,0,0,0));
+ operate[i].setBounds(i%5*(35+7), 60+i/5*(29+5)+5, 35*2+7, 29);
+ jp.add(operate[i]);
+ //前24个
+ for(i=i+1;i=16)//计算器屏幕所能显示数据的最大长度
+ {
+ display2.setFont(new Font("宋体",Font.BOLD,14));//缩小字体输出
+ display2.setText(str.substring(0, 16));
+ }
+ else
+ display2.setText(str);
+ }
+ public void cut()
+ {
+ run("-");
+ }
+ public void add()
+ {
+ run("+");
+ }
+ public void sum()
+ {
+ display2.setFont(new Font("宋体",Font.BOLD,20));
+ int d1=op1.dotWei,d2=op2.dotWei,i;
+ switch(sign)
+ { //运算后 结果保存到op1中
+ case "+":op1.value=op1.value+op2.value;break;
+ case "-":op1.value=op1.value-op2.value;break;
+ case "*":op1.value=op1.value*op2.value;break;
+ case "/":op1.value=op1.value/op2.value;break;
+ case "%":op1.value=op1.value%op2.value;break;
+ }
+ if(op2.value==0&&sign=="/")//除数为0
+ {
+ Disable=true;
+ display2.setText(op1.value+"");
+ display1.setText(null);
+ action="op1";
+ return ;
+ }
+ if(op1.value==Math.floor(op1.value))//结果为整数
+ {
+ display2.setText((int)op1.value+"");
+ op1.dotWei=0;
+ op1.isFloat=false;
+ }
+ else{//结果为小数
+ String str=op1.value+"";
+ //准确控制算术运算结果的精度,加,减,取模运算,小数点后的有效数字最多为max(d1,d2)位
+ if(sign.equals("+")||sign.equals("-")||sign.equals("%"))
+ {
+ i=d1>d2?d1:d2;
+ str=op1.value+"";
+ str=str.substring(0, str.indexOf(".")+i+1);//取i位输出
+ }
+ //准确控制算术运算结果的精度,乘法运算,小数点后的有效数字最多为d1+d2位
+ else if(sign.equals("*"))
+ {
+ i=d1+d2;
+ BigDecimal bd=new BigDecimal(op1.value);
+ op1.value=bd.setScale(i,BigDecimal.ROUND_DOWN ).doubleValue();
+ str=op1.value+"";//更新修改后的str
+ }
+ //结果超过显示数据的最大长度
+ if(str.length()>=16)
+ {
+ display2.setFont(new Font("宋体",Font.BOLD,14));
+ str=str.substring(0, 16);
+ }
+ display2.setText(str);
+ op1.dotWei=str.length()-str.indexOf(".")-1;//更新op1w值
+ }
+
+ display1.setText(null);
+ action="op1";
+ op1.clear=true;//开始新的表达式运算时,op1要先重置
+ op2.clear=true;//开始新的表达式运算时,op2要先重置
+ sign="";
+ }
+ public void dot()
+ {
+ if(action=="op1")
+ op1.isFloat=true;
+ else
+ op2.isFloat=true;
+ display2.setText(display2.getText()+".");
+ }
+ public void run(String SIGN)
+ {
+ display2.setFont(new Font("宋体",Font.BOLD,20));
+ action="op2";
+ int d1=op1.dotWei,d2=op2.dotWei,i;
+ if(!sign.equals(""))//检测是否为以为表达式的第一运算
+ {
+ switch(sign)
+ { //运算后 结果保存到op1中
+ case "+":op1.value=op1.value+op2.value;break;
+ case "-":op1.value=op1.value-op2.value;break;
+ case "*":op1.value=op1.value*op2.value;break;
+ case "/":op1.value=op1.value/op2.value;break;
+ case "%":op1.value=op1.value%op2.value;break;
+ }
+ }
+ String temp=isSpecileHandle();
+ if(temp==null)
+ temp=display2.getText(); //先保存display2文本框里的数据
+ if(op2.value==0&&sign=="/") //除数为0
+ {
+ Disable=true;
+ display2.setText(op1.value+"");
+ display1.setText(display1.getText()+op1.value);
+ }
+ if(op1.value==Math.floor(op1.value))//结果为整数
+ {
+ display2.setText((int)op1.value+"");
+ op1.dotWei=0;
+ op1.isFloat=false;
+ }
+ else{
+ String str=op1.value+"";
+ //准确控制算术运算结果的精度,加,减,取模运算,小数点后的有效数字最多为max(d1,d2)位
+ if(sign.equals("+")||sign.equals("-")||sign.equals("%"))
+ {
+ i=d1>d2?d1:d2;
+ BigDecimal bd=new BigDecimal(op1.value);
+ op1.value=bd.setScale(i,BigDecimal.ROUND_DOWN ).doubleValue();
+ str=op1.value+"";//更新修改后的str
+ }
+ //准确控制算术运算结果的精度,乘法运算,小数点后的有效数字最多为d1+d2位
+ else if(sign.equals("*"))
+ {
+ i=d1+d2;
+ BigDecimal bd=new BigDecimal(op1.value);
+ op1.value=bd.setScale(i,BigDecimal.ROUND_DOWN ).doubleValue();
+ str=op1.value+"";//更新修改后的str
+ }
+ //结果超过显示数据的最大长度
+ if(str.length()>=16)
+ {
+ display2.setFont(new Font("宋体",Font.BOLD,14));
+ str=str.substring(0, 16);
+ }
+ display2.setText(str);
+ op1.dotWei=str.length()-str.indexOf(".")-1;//每次加完后,如果结果op1的值为小数则更新op1w的值
+ }
+ sign=SIGN;
+ display1.setText(display1.getText()+temp+sign);
+ op2.value=op1.value;//运算后,操作数op2默认的值为op1的值
+ op2.clear=true;//下一次键入数据,op2要重置
+ op1.clear=false;//下一次键入数据,op1不要重置
+ }
+ //isSpecileHandle()
+ // 操作数是否sqrt()或1/x过,
+ //如果有,则返回"sqrt(x)"或"1/x"字符串
+
+ public String isSpecileHandle()
+ {
+ String temp=null;
+ if(op1.isSqrted)
+ {
+ temp=op1.sqrtedString;
+ op1.isSqrted=false;
+ }
+ else if(op2.isSqrted)
+ {
+ temp=op2.sqrtedString;
+ op2.isSqrted=false;
+ }
+ if(op1.isInverted)
+ {
+ temp=op1.invertedString;
+ op1.isInverted=false;
+ }
+ else if(op2.isInverted)
+ {
+ temp=op2.invertedString;
+ op2.isInverted=false;
+ }
+ return temp;
+ }
+ class keyAdapter extends KeyAdapter{
+ public void keyPressed(KeyEvent e)
+ {
+
+ int keycode=e.getKeyCode();
+ if((keycode>=96&&keycode<=105)||(keycode>=48&&keycode<=57))//数字键
+ {
+ if(keycode>=96)
+ keycode-=48;
+ switch(keycode)
+ {
+ case 48:read(0);break;
+ case 49:read(1);break;
+ case 50:read(2);break;
+ case 51:read(3);break;
+ case 52:read(4);break;
+ case 53:read(5);break;
+ case 54:read(6);break;
+ case 55:read(7);break;
+ case 56:read(8);break;
+ case 57:read(9);break;
+ }
+ }
+ //运算符键+ - * / =和. 以及退格键(* =号)
+ else if((keycode==110||keycode==46)||(keycode==111||keycode==47)||(keycode==45||keycode==109)||keycode==107||keycode==106||keycode==61||keycode==10||keycode==8)
+ {
+ if((keycode==110||keycode==46))
+ dot();
+ else if(keycode==111||keycode==47)
+ run("/");
+ else if(keycode==45||keycode==109)
+ run("-");
+ else if(keycode==107)
+ run("+");
+ else if(keycode==106)
+ run("*");
+ else if(keycode==61||keycode==10)//=号
+ sum();
+ else if(keycode==8)
+ cutEnd();
+ }
+ }
+ }
+ public static void main(String[] args) {
+ Calculator app=new Calculator();
+ }
+}
+
diff --git a/src/java2020spring/function.java b/src/java2020spring/function.java
new file mode 100644
index 0000000000000000000000000000000000000000..1ab8bf0f40a357669ea1295db9a75beef1f67abe
--- /dev/null
+++ b/src/java2020spring/function.java
@@ -0,0 +1,33 @@
+package java2020spring;
+
+class operateNum {// 操作数类
+ public double value;//操作数的实际值
+ public int dotWei;//操作数如果是小数,记录小数点后的位数
+ public String invertedString;//1/x字符串
+ public String sqrtedString;//sqrt(x)字符串
+ public boolean isSqrted,isInverted;//做标记是否√,1/x过,用于后续判断
+ public boolean clear;//clear为真表示是否重置操作数
+ public boolean isFloat;//isFloat为真,表示操作数是小数
+ public operateNum()
+ {
+ value=0;
+ dotWei=0;
+ sqrtedString=null;
+ invertedString=null;
+ isSqrted=false;
+ isInverted=false;
+ clear=false;
+ isFloat=false;
+ }
+ public void reset()//重置操作数
+ {
+ value=0;
+ dotWei=0;
+ sqrtedString=null;
+ invertedString=null;
+ isSqrted=false;
+ isInverted=false;
+ clear=false;
+ isFloat=false;
+ }
+}
\ No newline at end of file