北邮JAVA第三次作业科学计算器附源代码_第1页
北邮JAVA第三次作业科学计算器附源代码_第2页
北邮JAVA第三次作业科学计算器附源代码_第3页
北邮JAVA第三次作业科学计算器附源代码_第4页
北邮JAVA第三次作业科学计算器附源代码_第5页
免费预览已结束,剩余20页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JAVA第三次作业选题:科学计算器一、设计思路⑴布局.数字键盘有0~9和小数点.符号键盘有+-X+,哥,开方,lg,ln.功能按键有清屏(AC)和删除(Del)(2)计算器流程状态转移图设定的标志位和变量有:////解决浮点数的精度丢失问booleannumflag=false;booleanopflag=false;Stringtxt=null;Stringnum_txt="";Stringop="";num1=0;num2=0;privateBigDecimalbig_num1题privateBigDecimalbig_num2

//标志:是否输入数字//标志:是否输入运算操作符//显示到文本框里的字符串//当前操作数的字符串形式//存放输入的运算操作符//第一个操作数//第二个操作数=newBigDecimal(Double.toString(0));=newBigDecimal(Double.toString(0));.关于操作数操作数为输入数字时会改变的数,有numl和num2。按下运算符和控制字符,会设定当前卜在键入的操作数,由opflag控制,false表示正在操作numl,true表示正在操作num2。初始状态下的操作数为numl。按下AC会恢复操作数为初始状态numl。按Delete、开方、lg、ln不会改变当前的操作数。其中后三者只对numl有效。其他的运算符和控制符都会使操作数为num2o.计算器的状态框图numl的结果上处理。其中按下结果存入numl的结果上处理。其中按下结果存入在上述图中没有画出的还有:任何时彳II按下AC,都会回到初始状态任何时彳II按下Del,都会把当前的操作数回删一位程序截图按下9+3.3,再按下+0.25按下=,再按DelAC后进行乘法和除法测试。3/9*3Z井■棘03333X3333333333r3TOC\o"1-5"\h\zR*[KWOn56iqr|AC33叼06In

JVrt摘tapo*M456mn*L23IgiDOD哥测试2A10开方测试根号65。开方是对文本框里只有一个操作数时有效卜面是lg101和ln2.718的结果。ln和lg对文本框里只有一个操作数时有效M0l+NB后面的功能已经验证了可以对结果继续操作没有出现bug。三、代码分析.声明控件这些就不写了,包括JFrame在内用了25个控件,23个JButton,1个Jframe,一个显示计算界面的文本框resultprivateJTextFieldresult;.初始化用于控制计算流程的变量几个变量,用于计算、判定,存放结构等。*/privatebooleannumflag=false;//标志:是否输入数字privatebooleanopflag=false;//标志:是否输入运算操作符privateStringtxt=null;//显示到文本框里的字符串privateStringnum_txt="";//正在键入的操作数的字符串形式privateStringop="";//存放输入的运算操作符privatedoublenum1=0;//num1和num2用作运算privatedoublenum2=0;privateBigDecimalbig_num1=newBigDecimal(Double.toString(0));//解决浮点数的精度问题privateBigDecimalbig_num2=newBigDecimal(Double.toString(0));.main方法里创建窗体publicstaticvoidmain(String口args){EventQueue.invokeLater(newRunnable(){//添加到线程队列publicvoidrun(){try{MyFramewindow=newMyFrame();//创建对象时初始化控件window.frame.setVisible(true);}catch(Exceptione){e.printStackTrace();}}});

.窗体的构造函数*Constructor*/publicMyFrame(){initialize();)5.initialize。函数里摆放控件,并设置事件的处理Jframeframe=newJFrame("Java计算器");frame.setResizable(false);frame.setBounds(100,100,371+60,371);frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);frame.getContentPane().setLayout(null);文本框result=newJTextField();result.setFont(newFont("Helvetica",Font.PLAIN,15));result.setHorizontalAlignment(SwingConstants.RIGHT);result.setBounds(29,28,308+60,50);frame.getContentPane().add(result);result.setColumns(10);result.setText(txt);数字按钮,用0举例,其他都一样bt_0=newJButton("0");bt_0.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("0");//按钮被按下时触发的事件,在后面写了)});bt_0.setBounds(99,273,50,50);frame.getContentPane().add(bt_0);一按钮bt_equal=newJButton("=");bt_equal.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){if(opflag==true){//如果此时opflag//如果此时opflag为true的话,证明big_num1.doubleValue())));big_num1.doubleValue()));已经输入运算符,这时候刚输入的数为num2,num1和num2进行运算big_num2=newBigDecimal(num_txt);calc(op);}result.setText(subZeroAndDot(Double.toString(//显示结果。结果存入num1num_txt=subZeroAndDot(Double.toString(}.});+、-、*、/和哥方按钮,以+举例,其他都一样bt_plus=newJButton("+");bt_plus.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){opBtnAction("+");}});开方,lg,ln按钮,以开方举例,其他都一样bt_sqrt=newJButton("sqrt");bt_sqrt.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){num1时有效if(opflag==false){//num1时有效calc("sqrt");txt=num_txt;result.setText(txt);}}});ac和del的初始化,重点在事件处理上bt_ac.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){result.setText(null);//全部运算标志和文本框置为初始状态txt=null;numflag=opflag=false;num1=num2=0;big_num1=big_num2=newBigDecimal(Double.toString(0.0));num_txt="";TOC\o"1-5"\h\z}.});bt_del.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){if(num_txt!=""&&num_txt.length()>0){//"通过截取字符串的方式而删一个字符num_txt=num_txt.substring(0,num_txt.length()-1);}"一if(txt!=null&&txt.length()>0){txt=result.getText();//文本框的回删,且不能删除运算符if(txt.charAt(txt.length()-1)=='+'||txt.charAt(txt.length()-1)=='-'||txt.charAt(txt.length()-1)=='*'||txt.charAt(txt.length()-1)=='/'||txt.charAt(txt.length()-1)==w){}else{txt=txt.substring(0,txt.length()-1);}result.setText(txt);}}});数字键盘事件处理函数/**数字键盘里的按键按下后触发的事件。*@paramnum传入字符串形式的数字**/

privatevoidnumBtnAction(Stringnum){numflag=true;//只要输入一个数,则把numflag置为true,表示已有数字输入num_txt+=num;//把输入的数加入到最终要转换成都double运算的字符串txt=result.getText()+num;//加到txt,使输入的数显示到文本框中。result.setText(txt);运算符处理的函数/**运算符按键触发的动作*@paramoperator点击的运算符**///进行判断,如果opflag为//进行判断,如果opflag为false,则表示还没//这个时候把num_txt转换成double赋给numl//如果opflag为true,表示第一个数输入完毕,num2//先计算两数结果,赋给numl,num2置为0,以if(opflag==false&&num_txt!=""){TOC\o"1-5"\h\z输入运算符,一numl=Double.parseDouble(num_txt);big_num1=newBigDecimal(num_txt);)一一if(opflag==true&&num_txt!=""){num2=Double.parseDouble(num_txt);且已输入相应的运算符,这个时候是在输入第二个要参与运算的薮,则加到big_num2=newBigDecimal(num_txt);calc(op);便后面多层混合运算使用。)操作数");))操作数");)numflag=false;//numflag置为0,表示当前需要输入数进行运算opflag=true;//opflag置为true,表示当前已输入一个或多个op=operator;result.setText(subZeroAndDot(big_num1//在文本框显示,正则表达式去多余的0num_txt="";//把新输入的运算符赋给op.toString())+""+operator+”//num_txt置为空,为了存储下一个操作数8.进行运算的函数/**进行+、-、*、/等的运算@paramop运算符**/privatevoidcalc(Stringop){switch(op){case"+":numl=numl+num2;num2=0;big_num1=big_num1.add(big_num2);big_num2=newBigDecimal(O);opflag=false;num_txt="";break;casenum1=num2=0;big_num1num1-num2;big_num1.subtract(big_num2);

num1=num2=0;big_num1num1-num2;big_num1.subtract(big_num2);casebig_num2=newBigDecimal(0);casebig_num2=newBigDecimal(0);opflag=false;num_txt="";break;num1=num1*num2;num2=0;big_num1=big_num1.multiply(big_num2);big_num2=newBigDecimal(0);opflag=false;num_txt="";breakcase"/":if(num2!=0){num1=num1/num2;num2=0;big_num1=big_num1.divide(big_num2,17,BigDecimal.ROUND_HALF_UP);big_num2=newBigDecimal(0);opflag=false;num_txt="";).break;case"A"numl=Math.pow(numl,num2);num2=0;big_num1=newBigDecimal(Double.toString(numl));big_num2=newBigDecimal(0);opflag=false;num_txt="";break;case"sqrt":num1=Double.parseDouble(num_txt);num1=Math.sqrt(num1);num2=0;big_num1=newBigDecimal(Double.toString(num1));big_num2=newBigDecimal(0);num_txt=subZeroAndDot(Double.toString(numl));break;case"lg":num1=Double.parseDouble(num_txt);num1=Math.log10(num1);num2=0;big_num1=newBigDecimal(Double.toString(num1));big_num2=newBigDecimal(0);num_txt=subZeroAndDot(Double.toString(num1));break;case"ln":num1=Double.parseDouble(num_txt);num1=Math.log(num1);num2=0;big_num1=newBigDecimal(Double.toString(num1));big_num2=newBigDecimal(0);num_txt=subZeroAndDot(Double.toString(num1));break;defaultopflagnum_txtbreak;false;;

;defaultopflagnum_txtbreak;false;;

;9.正则表达式去掉字符串多余的0/**使用java正则表达式去掉多余的.与0@params@return/publicstaticStringsubZeroAndDot(Strings){if(s.indexOf(".")>0){s=s.replaceAll("0+?$","");//去掉多余的0s=s.replaceAll("[.]$","");//如最后一位是.则去掉}returns;}}四、问题.浮点数精度丢失(已解决)在计算12.3+0.72时,得到的结果是13.020000000000001。由于数在机器里是以二进制存储,0.72的二进制长度是无限长,但double位数是有限的,必然会存在精度丢失问题。应该使用BigDecimal类进行计算。.操作数与显示的不同步(已解决)在程序中一个重要的点就是保持显示的数和内存中的数是相等的,尤其在回删的时候,可能会显示删除运算符,但实际内存中只删掉了操作数的位数,运算符相关变量和标识没有重置。保持显示的操作数的同步是很重要的.BigDecimal除不尽报错(已解决)BigDecimal除法要限制scale不然会报错。精度要大于浮点数的16位。五、总结,并且程序逻辑需要完整,对各计算器里面小的坑挺多的,看似写完的时候还有一堆事件要处理,个计算状态的步骤要清晰。,并且程序逻辑需要完整,对各*@authorlingnanmiao**BUG解决日志*-BigDecimal除不尽报错*-浮点数精度问题,采用了BigDecimal*-按下等于后再次输入字符时实际num1与文本框显示不同步*-Delete时会显示删除运算符实际上没有删除的问题*-正则表达式去多余的0*/packageassignment02;importjava.awt.EventQueue;importjava.awt.Font;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.math.BigDecimal;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JTextField;importjavax.swing.SwingConstants;@authorlingnanmiao*BUG解决日志-BigDecimal除不尽报错-浮点数精度问题,采用了BigDecimal-按下等于后再次输入字符时实际numl与文本框显示不同步-Delete时会删除运算符的问题-正则表达式去多余的0*/publicclassMyFrameextendsJFrame{/***声明各个控件,在后面初始化*/privateJFrameframe;privateJTextFieldresult;privateJButtonbt_1;privateJButtonbt_2;privateJButtonbt_3;privateJButtonbt_4;privateJButtonbt_5;privateJButtonbt_6;privateJButtonbt_7;privateJButtonbt_8;privateJButtonbt_9;privateJButtonbt_0;privateJButtonbt_equal;privateJButtonbt_dot;privateJButtonbt_d0;privateJButtonbt_plus;privateJButtonbt_sub;privateJButtonbt_ac;privateJButtonbt_del;privateJButtonbt_mul;privateJButtonbt_div;privateJButtonbt_power;privateJButtonbt_sqrt;privateJButtonbt_lg;privateJButtonbt_ln;/**几个变量,用于计算、判定,存放结构等。*/privatebooleannumflag=false;//标志:是否输入数字privatebooleanopflag=false;//标志:是否输入运算操作符privateStringtxt=null;//显示到文本框里的字符串privateStringnum_txt="";//正在键入的操作数的字符串形式privateStringop="";//存放输入的运算操作符privatedoublenuml=0;//numl和num2用作运算privatedoublenum2=0;privateBigDecimalbig_num1=newBigDecimal(Double.toString(0));//解决浮点数的精度问题privateBigDecimalbig_num2=newBigDecimal(Double.toString(0));Launchtheapplication./publicstaticvoidmain(String[]args){EventQueue.invokeLater(newRunnable(){〃添加到线程队列publicvoidrun(){try{MyFramewindow=newMyFrame();//创建对象时初始化控件window.frame.setVisible(true);}catch(Exceptione){e.printStackTrace();))});)/***Constructor/publicMyFrame(){initialize();}/**初始化控件/publicvoidinitialize(){frame=newJFrame("Java计算器");frame.setResizable(false);frame.setBounds(100,100,371+60,371);frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);frame.getContentPane().setLayout(null);result=newJTextField();//result.setFont(newFont("Helvetica",Font.PLAIN,15));//result.setHorizontalAlignment(SwingConstants.RIGHT);//显示结果的文本框的布局result.setBounds(29,28,308+60,50);//Initialize显示结果的文本框的布局frame.getContentPane().add(result);//result.setColumns(10);//result.setText(txt);///***NumberKeyboardInitialize*/bt_0=newJButton("0");bt_0.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("0");)});bt_0.setBounds(99,273,50,50);frame.getContentPane().add(bt_0);bt_1=newJButton("1");bt_1.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("1");}});bt_1.setBounds(99,213,50,50);frame.getContentPane().add(bt_1);bt_2=newJButton("2");bt_2.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("2");}});bt_2.setBounds(159,213,50,50);frame.getContentPane().add(bt_2);bt_3=newJButton("3");bt_3.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("3");}});bt_3.setBounds(219,213,50,50);frame.getContentPane().add(bt_3);bt_4=newJButton("4");bt_4.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("4");}});bt_4.setBounds(99,157,50,50);frame.getContentPane().add(bt_4);bt_5=newJButton("5");bt_5.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("5");}});bt_5.setBounds(159,157,50,50);frame.getContentPane().add(bt_5);bt_6=newJButton("6");bt_6.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("6");}});bt_6.setBounds(219,157,50,50);frame.getContentPane().add(bt_6);bt_7=newJButton("7");bt_7.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("7");}});bt_7.setBounds(99,97,50,50);frame.getContentPane().add(bt_7);bt_8=newJButton("8");bt_8.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("8");}});bt_8.setBounds(159,97,50,50);frame.getContentPane().add(bt_8);bt_9=newJButton("9");bt_9.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){numBtnAction("9");}});bt_9.setBounds(219,97,50,50);frame.getContentPane().add(bt_9);bt_dot=newJButton(".");bt_dot.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){numBtnAction(".");}});bt_dot.setFont(newFont("Helvetica",Font.PLAIN,15));bt_dot.setBounds(159,273,50,50);frame.getContentPane().add(bt_dot);bt_d0=newJButton("00");bt_d0.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){numBtnAction("0");numBtnAction("0");)});bt_d0.setBounds(219,273,50,50);frame.getContentPane().add(bt_d0);/***OptionInitialize*/bt_equal=newJButton("=");bt_equal.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){if(opflag==true){num2=Double.parseDouble(num_txt);//如果此时opflag为true的话,证明已经输入运算符,这时候刚输入的数为num2,numl和num2进行运算big_num2=newBigDecimal(num_txt);calc(op);}result.setText(subZeroAndDot(Double.toString(big_num1.doubleValue())));//显示结果。结果存入numlnum_txt=subZeroAndDot(Double.toString(big_num1.doubleValue()));}});bt_equal.setBounds(339,213,50,110);frame.getContentPane().add(bt_equal);bt_plus=newJButton("+");bt_plus.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){opBtnAction("+");}});bt_plus.setBounds(39,273,50,50);frame.getContentPane().add(bt_plus);bt_sub=newJButton("-");bt_sub.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){opBtnAction("-");)});bt_sub.setBounds(39,213,50,50);frame.getContentPane().add(bt_sub);bt_mul=newJButton("*");bt_mul.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){opBtnAction("*");}});bt_mul.setBounds(39,157,50,50);frame.getContentPane().add(bt_mul);bt_div=newJButton("/");bt_div.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){opBtnAction("/");}});bt_div.setBounds(39,97,50,50);frame.getContentPane().add(bt_div);bt_power=newJButton("pow");bt_power.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){opBtnAction("A");}});bt_power.setBounds(279,97,50,50);frame.getContentPane().add(bt_power);bt_sqrt=newJButton("sqrt");bt_sqrt.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){if(opflag==false){〃只对操作数为numl时有效calc("sqrt");txt=num_txt;result.setText(txt);}}});bt_sqrt.setBounds(279,157,50,50);frame.getContentPane().add(bt_sqrt);bt_lg=newJButton("lg");bt_lg.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){if(opflag==false){〃只对操作数为num1时有效calc("lg");txt=subZeroAndDot(num_txt);result.setText(txt);}}});bt_lg.setBounds(279,213,50,50);frame.getContentPane().add(bt_lg);bt_ln=newJButton("ln");bt_ln.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){if(opflag==false){〃只对操作数为num1时有效calc("ln");txt=subZeroAndDot(num_txt);result.setText(txt);}}});bt_ln.setBounds(279,273,50,50);frame.getContentPane().add(bt_ln);/***功能键AC:清空和Del回删两个按键的初始化。**/bt_ac=newJButton("AC");bt_ac.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){result.setText(null);//全部运算标志和文本框置为初始状态txt=null;numflag=opflag=false;num1=num2=0;big_num1=big_num2=newBigDecimal(Double.toString(0.0));num_txt="";}});bt_ac.setBounds(339,157,50,50);frame.getContentPane().add(bt_ac);bt_del=newJButton("Del");bt_del.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){if(num_txt!=""&&num_txt.length()>0){num_txt=num_txt.substring(0,num_txt.length()-1);//通过截取字符串的方式回删一个字符}if(txt!=null&&txt.length()>0){txt=result.getText();//文本框的回删,且不能删除运算符if(txt.charAt(txt.length()-1)=='+'||txt.charAt(txt.length()-1)=='-'||txt.charAt(txt.length()-1)=='*'||txt.charAt(txt.length()-1)=='/'||txt.charAt(txt.length()-1)=='A'){}else{txt=txt.substring(0,txt.length()-1);}result.setText(txt);))});bt_del.setBounds(339,97,50,50);frame.getContentPane().add(bt_del);/***数字键盘里的按键按下后触发的事件。*@paramnum传入字符串形式的数字**/privatevoidnumBtnAction(Stringnum){numflag=true;//只要输入一个数,则把numflag置为true,表示已有数字输入num_txt+=num;txt=result.getText()+num;result.setText(txt);/***运算符按键触发的动作*@paramoperator点击的运算符**///把输入的数加入到最终要转换成都double运算的字符串//加到txt,使输入的数显示到文本框中。privatevoidopBtnAction(Stringoperator){if(opflag==false&&num_txt!=""){//进行判断,如果opflag为false,则表示还没输入运算num1=Double.parseDouble(num_txt);//这个时候把num_txt转换成double赋给num1。big_num1=newBigDecimal(num_txt);}if(opflag==true&&num_txt!=""){num2=Double.parseDouble(num_txt);//如果opflag为true,表示第一个数输入完毕,且已输入相应的运算符,这个时候是在输入第三个要参与运算的数,则加到num2big_num2=newBigDecimal(num_txt);calc(op);〃先计算两数结果,赋给num1,num2置为0,以便后面多层混合运算使用。}numflag=false;//numflag置为0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论