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