diff --git a/src/Calculator b/src/Calculator new file mode 100644 index 0000000000000000000000000000000000000000..d54a714d453ae0a5e08edae434452321ed3c0eaa --- /dev/null +++ b/src/Calculator @@ -0,0 +1,431 @@ +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.*; +public class Calculator extends JFrame{ + private JTextField d1,d2,d3; + 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",".","+"}; + //定义了只能在该类内部才能访问的名叫name的字符串变量 + private operateNum t1=new operateNum(),t2=new operateNum();//操作数1,操作数2 + private String action="t1";//表示要操作的对象 "t1"操作第一个操作数,"t2"操作第二个操作数 + private String sign="";//运算符,默认为空 + private String s1,s2; + private boolean Disable=false; + public Calculator() + { super("计算器"); + this.setLayout(null); + //设置布局管理器为默认值 + this.setSize(230, 330); + //设置显示框架的宽和高 + JPanel jp=new JPanel(null); + //设置布局管理器为空,就可以自己手动的设置组件的坐标位置和大小 + jp.setBounds(10,15,getWidth()-25,getHeight()); + //设置窗口坐标,宽和高 + + //显示屏 + d1=new JTextField(""); + d2=new JTextField("0"); + d3=new JTextField(""); + //新建文本框 + d1.setEnabled(false); + d2.setEnabled(false); + d3.setEnabled(false); + //设置控件可否使用 + d1.setBounds(0, 0, 205, 25); + d2.setBounds(20, 20, 185, 35); + d3.setBounds(0, 20, 20, 35); + //设置按钮的位置 + + //设置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*42, 60+i/5*35+5, 35, 30); + 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*42, 60+i/5*35+5, 35, 65); + 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*40, 60+i/5*35+5, 80, 30); + jp.add(operate[i]); + + //前24个按钮 + for(i=i+1;i=16)//计算器屏幕所能显示数据的最大长度 + {2.setText(str.substring(0, 16)); + } + else d2.setText(str); + } + public void cut()//减法 + {run("-"); + } + public void add()//加法 + {run("+"); + } + public void sum()//等于 + {int a1=t1.dot,a2=t2.dot,i; + switch(sign){ //运算后 结果保存到t1中 + case "+":t1.value=t1.value+t2.value;break; + case "-":t1.value=t1.value-t2.value;break; + case "*":t1.value=t1.value*t2.value;break; + case "/":t1.value=t1.value/t2.value;break; + case "%":t1.value=t1.value%t2.value;break; + } + if(t2.value==0&&sign=="/")//除数为0 + {Disable=true; + d2.setText(t1.value+""); + d1.setText(null); + action="t1"; + return ; + } + if(t1.value==Math.floor(t1.value))//结果为整数 + {d2.setText((int)t1.value+""); + t1.dot=0; + t1.isFloat=false; + } + else{//结果为小数 + String str=t1.value+""; + //准确控制算术运算结果的精度,加,减,求余运算,小数点后的有效数字最多为max(d1,d2)位 + if(sign.equals("+")||sign.equals("-")||sign.equals("%")) + {i=a1>a2?a1:a2; + str=t1.value+""; + str=str.substring(0, str.indexOf(".")+i+1);//取i位输出 + } + //准确控制算术运算结果的精度,乘法运算,小数点后的有效数字最多为d1+d2位 + else if(sign.equals("*")) + {i=a1+a2; + BigDecimal bd=new BigDecimal(t1.value); + t1.value=bd.setScale(i,BigDecimal.ROUND_DOWN ).doubleValue(); + str=t1.value+"";//更新修改后的str + } + //结果超过显示数据的最大长度 + if(str.length()>=16) + {str=str.substring(0, 16); + } + d2.setText(str); + t1.dot=str.length()-str.indexOf(".")-1;//更新t1w值 + } + + d1.setText(null); + action="t1"; + t1.clear=true;//开始新的表达式运算时,t1要先重置 + t2.clear=true;//开始新的表达式运算时,t2要先重置 + sign=""; + } + public void dot()//小数点 + {if(action=="t1") + t1.isFloat=true; + else + t2.isFloat=true; + d2.setText(d2.getText()+"."); + } + public void run(String SIGN) + {action="t2"; + int a1=t1.dot,a2=t2.dot,i; + if(!sign.equals(""))//检测是否为以为表达式的第一运算 + {switch(sign) + {//运算后 结果保存到t1中 + case "+":t1.value=t1.value+t2.value;break; + case "-":t1.value=t1.value-t2.value;break; + case "*":t1.value=t1.value*t2.value;break; + case "/":t1.value=t1.value/t2.value;break; + case "%":t1.value=t1.value%t2.value;break; + } + } + if(t2.value==0&&sign=="/")//除数为0 + {Disable=true; + d2.setText(t1.value+""); + d1.setText(d1.getText()+t1.value); + } + if(t1.value==Math.floor(t1.value))//结果为整数 + {d2.setText((int)t1.value+""); + t1.dot=0; + t1.isFloat=false; + } + else{String str=t1.value+""; + } + sign=SIGN; + d1.setText(d1.getText()+sign); + t2.value=t1.value;//运算后,操作数t2默认的值为t1的值 + t2.clear=true;//下一次键入数据,t2要重置 + t1.clear=false;//下一次键入数据,t1不要重置 + } + + //参照keycode对照表 设置数字键“0、1、2、3、4、5、6、7、8、9” + 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; + } + } + //参照keycode对照表 设置运算符键+ - * / =和. 以及退格键(* =号) + 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(); + } +} \ No newline at end of file diff --git a/src/operateNum b/src/operateNum new file mode 100644 index 0000000000000000000000000000000000000000..a06e2ea818d3079a422e004a92412b49f821c183 --- /dev/null +++ b/src/operateNum @@ -0,0 +1,26 @@ +package java2020spring; + +public class operateNum {//操作数类 + public double value;//操作数的实际值 + public int dot;//操作数如果是小数,记录小数点后的位数 + public String invertedString;//1/x字符串 + public String sqrtedString;//sqrt(x)字符串 + public boolean clear;//clear为真表示是否重置操作数 + public boolean isFloat;//isFloat为真,表示操作数是小数 + public operateNum() + {value=0; + dot=0; + sqrtedString=null; + invertedString=null; + clear=false; + isFloat=false; + } + public void reset()//重置各种操作数 + {value=0; + dot=0; + sqrtedString=null; + invertedString=null; + clear=false; + isFloat=false; + } +} \ No newline at end of file