信息与计算科学专业计算器Java课程设计_第1页
信息与计算科学专业计算器Java课程设计_第2页
信息与计算科学专业计算器Java课程设计_第3页
信息与计算科学专业计算器Java课程设计_第4页
信息与计算科学专业计算器Java课程设计_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

信息与计算科学专业计算器Java课程设计目录一、 需求分析 11. 程序需求: 12. 学习需求: 1二、 概要设计 11. 设计理念: 12. 视图设计: 13. 模型设计: 14. Callback: 25. 观察者模式: 2三、 详细设计 21. App类: 22. View类: 23. Model类: 34. Callback接口: 55. ObserverPattern: 56. 文档写入: 5四、 编码实现 61. App类 62. View类 63. Model类 94. Callback接口 12五、 软件测试 13计算测试 13文件测试 18六、 总结 191. 收获: 192. 优化建议: 19七、 源程序 20需求分析程序需求:网络上计算器类型与数量数不胜数,功能也是应有尽有,但是因此导致UI界面也相对的繁杂,此项目旨在设计一个交互性强,界面简约,操作人性化且能完成基本运算的计算器。学习需求:通过本次课程设计,可以认知并理解Java语言的基本概念、理论和方法。初步掌握JDK与常用IDE集成开发环境的调试与应用。同时领略Java语言严谨规范之美。认知其在计算机语言中的开发地位。概要设计设计理念:MVVM设计模式。视图与模型分离,实现低耦合,提高视图的复用性,视图、模型之间可以独立开发,同时也可提高视图和模型的复用性,达到一套视图对应多套模型或一套模型对应多套视图。本项目只实现一套视图与一套模型的绑定。视图设计:本项目图形化界面基于JavaSwing进行构建。Swing工具包拥有较丰富的GUI组件与屏幕显示元素,且具有可移植性。程序UI界面由JFrame最为最外层框架,内包含JLabel、JPanel、JButton等组件。整个视图的设计使用windowBuilder插件,此插件可以进行快速的进行页面的搭建,同时增加可控性与操作性。模型设计:模型使用基本的逻辑运算进行架构。将操作数、操作符、屏显内容、结果等元素进行分离,使用不同的方法针对性进行计算。Callback:视图与模型之间的解耦,使用自定义接口Callback。通过此回调方法进行视图与模型之间的联系。观察者模式:本项目同时采用ObserverPattern,避免因为需进行结果显示而导致视图与模型之间不能完全分离,造成程序维护与再开发困难。详细设计App类:作为程序的主类,在此类中new出View类和Model类的对象,然后通过回调Callback类进行视图与模型间的绑定。View类:在此类中进行视图的创建。整体框架使用Swing构建。外层包装使用JFrame。程序title为“计算器”,UI界面的大小应该为不可调节,默认生成位置为windows桌面的中心位置。同时UI界面被关闭,此程序的进行应该被停止。contentPane:总容器,使用JPanel对象。JPanel设置背景色为白灰色,另外设置容器的margin与border,让界面变得不拥挤。外层容器中使用BoderLayout布局,使用此布局可有结构的存放内部组件。总容器中嵌套的第一层组件应该包括存放图片的JLabel、显示输入内容、显示计算结果的JLabel,除此之外第一层嵌套组件中应该还包含用来按钮面板JPanel。result_t:存放图片或第二行显示结果的JLabel,此组件应该具有自动判断功能。在显示的文本内容为空时,应该显示设置好的图片,需要显示文本时,此组件需要将图片隐藏,显示文本。此组件可以进行结果显示的扩展功能,在有限的显示空间中显示更多位的结果显示,同时也可以增加UI界面的美观性,在朴素的界面中使用淡雅的卡通图片,让程序更美观。result:显示输入数字、操作符和显示结果的主要JLabel组件。在输入需要显示的字符时,首选都是由本组件进行展示,当超出最大显示量后,由result_t扩展JLabel进行显示。panel:存放按钮的按钮面板,通过JPanel组件存放按钮。Panel使用GridLayout布局,使用此布局可以让按钮进行整齐的摆放,同时每个Button之间的间距等属性也是可控的。jButton:按钮面板中存放的按钮组件,此组件也是用户可以直接可以看见的组件,用户通过jButton与用户进行交互,即进行计算器的计算功能。jButton最重要的设置便是需要在按钮中设置显示的文本,即数字与操作符。另,由于window平台的原因,为提高美观,jButton需取消文本聚焦属性。Model类:在此类中通过基础逻辑原酸进行程序功能的实现。left:左操作数。此变量进行存放在进行双目运算时候,操作符左侧的值。同时也可存放在进行连续运算时,上一步运算的结果。right:右操作数。此变量进行存放在双目运算中,操作符右侧的值。、contentBuilder:屏显内容。此变量为UI界面中屏幕显示的内容,为StringBuilder对象。builder:全局变量操作数。穿梭于整个模型之间,在进行单目运算时,作为单目操作符,是UI界面传输过来的第一层变量。为StringBuilder对象。complexOperator:双目运算符。进行双目运算时,根据此操作符进行判断计算的类型。changeNum():数字面板唤醒的方法。通过此方法,对数据进行拼接存储,需要对数据进行合法性进行校验。小数点处理:只允许接受一次小数点,如果在接受小数点前未接受到其他操作数,需要默认补全小数点前的数据为0。0的处理:数据的开头,整数不能为0开头,小数的整数部分如果有多位,按整数的要求进行0处理。需要对builder与result两个变量的值进行改变singleOperate():单目运算。被View面板按钮中,单目运算符唤醒的方法。此方法首先判断builder中是否有值,如果没有值则不进行与运算,有值则根据单目运算符的类型,进行对应的计算。在计算结束后,应该改变result的值,同时清空builder.eq():等号对应的方法,使用此方法,首先需要检测左操作数,右操作数,双目运算符同时存在且不为空,然后根据对应的双目操作符进行运算。clear():清除方法。此方法分为两类,全局清除与末位清除。del类型:当操作符为del时,进行末位清除,同时清除result与builder的末位值。C类型:当操作符为C时。进行全清除,此模型中含有的所有属性的值。complexOperate():双目运算方法。此操作符分为两种逻辑判断right为空:当右操作数为空时,则代表计算器为第一次进行运算。此方法被调用时,不做具体的运算,将当前builder的值传递给left进行存储,同时将接收到的operator传递给compleOpertor存储,然后清空builder对象。right不为空:当right不为空,则代表,此使left、right、compleOpertor变量都不为空,此使需要根据compleOpertor进行具体的运算,并且将计算得到的值传递给result,将compleOpertor的值更新为接受到的operator。addSum(),subSum(),mulSum(),divSum():四则运算,内部封装四则运算逻辑,并且将对应的值进行存储传递。在其他方法需要进行计算的时候,调用此类方法。modSum():求模运算,内部封装求模的逻辑方法。在其他方法需要进行计算的时候,调用此类方法。saveHistory():进行计算器运算历史记录的保存,并写入文档进行永久的保存,适用于有相关需求的人员进行使用。在程序退出后,此文档仍可查看,不受时间与进程限制。此方法在进行其他运算的时候被调用。Callback接口:回调方法,实现视图与模型之间的解耦。在此类中需要定义视图与模型之间绑定所需要使用方法与变量。在视图进行方法唤醒的时候,使用的为此回调方法。采用接口反射回调结束,可以实现视图和模型之间的松藕合。使线程更加安全。ObserverPattern:使用观察者模式实现模型与视图间的完全分离。视图为观察者,模型对被观察者。模型中被观察数据改变时,需要通知观察者状态发生改变,观察者中的更新方法会根据编辑好的逻辑,进行自身状态的改变一个观察者可以观察多个对象,一个被观察者同时可被多个观察者进行观察。被观察数据可以自行定义,观察者只需要对自己检测所关心数据的状态。文档写入:使用此项技术,可以进行计算记录的永久保存。通过进行定义io流的方向,将计算的过程转化为字符流,然后通过包装,写入文档,以此达到内容的追加保存。编码实现主要类及方法介绍(项目中附源码)App类创建视图对象与模型对象将模型与视图进行绑定,实现模型与视图之间的交流给model添加观察者View类View类继承JFrame并实现观察者接口回调callback的set方法,通过此方法,实现视图中对callback中的方法进行回调。对UI界面进行初始化,设置标题,退出程序默认关闭线程,设置边界值,设置大小不可调节,设置大小的值创建contentPane对象,并设置布局,边框,默认显示的位置 new出panel对象,进行存放button,并设置panel的布局,处于contentPanel布局中的位置为南方new出result对象,进行结果显示,并设置其大小,文本在label中的位置,文本的字体家族,字体大小,字体颜色label在contentPanel布局中的位置。通过for循环创建button,然后将button添加至panel中。取消按钮的文本聚焦。并且通过隐式自动设置按钮的command值。通过内部类,实现对按钮的command进行监听处理通过switch和按钮的actioncommand确认回调的方法给button增加点击音效!观察者模式中,观察者的数据更新方法update(),当接收到被观察者中数据发生改变的信号时,观察者也进行数据更新,数据更新的逻辑封装在update里面。扩展label根据text的长度判断,是显示图片还是显示文本Model类Model类继承被观察者对象,并且实现回调的接口定义left、right、contentBuilder、builder、result、complexOperator等全局字段。在此对数字面板的数据进行处理,并且做响应的判断观察者模式的实现,当model中被监听数据发生改变,应该通知观察者,采用setChanged()方法。同时发出通知,将数据传递。单目运算方法,根据单目运算符的类型,进行对应的逻辑运算此方法中的,运算后需通知观察者和将数据发送给观察者等号计算方法清除方法双目运算,通过判断左操作数、右操作数、双目运算符的状态,进行确定双目运算的方法。通过io流,进行数据的写出。将计算记录进行保存。创建SimpleDateFormat类对象,对当前时间进行format,定义时间显示模板创建文件指针对内容进行format,定义记录的模板Callback接口作为视图与模型间的通信协议声明视图中会调用接口中的方法,以便让模型去实现此类方法软件测试本项目采用黑盒测试方法进行软件测试计算测试整体程序页面基础四则运算测试实例:3+36-33*23/2除0测试测试实例:3/0点击等号无效,进行连续运算,会给予用户友好的提醒方法连续运算功能测试测试实例:3+3+3+3大数运算测试测试实例:12134567+7654321单目运算求幂测试实例:3233单目运算求模测试实例:9%211%3测试单目运算,求倒数8的倒数5的倒数测试扩展结果框图片的自适应小数运算测试测试实例:.3.3+2.2文件测试历史记录文件查看计算历史记录完全按照自定义模板进行内容保存。软件测试结果:黑盒测试模式下,程序无bug,具有较好的健壮性。计算中,结果准确无错误。关于文件流的写出,正确,按照程序定义的功能执行。整体测试通过。总结收获:认知java语言的特性。深入理解去面向对象编程理念。理解java的封装、继承、多态三个理念。封装:将程序封装在类或者方法容器中,根据提供的接口和API去进行方法的访问,让程序更加安全,减少暴露。提高了程序的健壮性,并实现程序的高内聚,低耦合,同时能够对成员变量进行更加精确的控制。继承,继承父类,达到代码的复用性与维护性。多态:针对同一个接口,使用不同实例,可以执行不同的操作,本项目中的模型与视图之间绑定的关系,就是多态性的一个应用。对MVVM模型的认知。Model-View-ViewModel,视图模型分离,实现编程范式中的高内聚低耦合。使用此模式可以让程序结构化,面向对象编程。提高可维护性与再开发性。熟练掌握GUISwing的基本操作,能够构造出简单的UI交互界面,基本掌握图形化的技术。优化建议:运算逻辑的优化。大数运算:本项目采用decimal进行浮点运算,计算位数有限,可采用字符串转换进行运算,可以大幅度增加运算能力。单目运算:单目运算不能够进行连续运算,可以通过成员变量的赋值,达到连续进行单目运算的效果。视图优化。按钮优化:可以修改button中text的字体、按钮的圆角边框、按钮的背景色等方面进行样式的优化。整体样式:可以修改jframe的样式,达到美化效果。网络编程应用。在进行某些重要数据的运算时,可以采用网络编程技术。在退出程序的时候,将运算历史记录发送到指定ip的主机或云端进行保存,然后删除掉本地的记录文件。源程序App.javapackagecom.free.calc;publicclassApp{publicstaticvoidmain(String[]args){ //创建视图对象 Viewview=newView(); //创建模型对象 Modelmodel=newModel(); //把模型传递给视图将视图与模型进行绑定pvvm模式 view.setCallback(model); //给model添加观察者 model.addObserver(view); }}View.javapackagecom.free.calc;importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.EventQueue;importjavax.sound.sampled.AudioInputStream;importjavax.sound.sampled.AudioSystem;importjavax.sound.sampled.Clip;importjavax.sound.sampled.LineUnavailableException;importjavax.sound.sampled.UnsupportedAudioFileException;importjavax.swing.*;importjavax.swing.border.EmptyBorder;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.GridLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.File;importjava.io.IOException;importjava.util.Arrays;importjava.util.Observable;importjava.util.Observer;importjava.awt.Color;importjava.awt.Component;importjava.awt.SystemColor;importjava.awt.FlowLayout;importjava.applet.AudioClip;importjava.io.File;importjava.io.IOException;importjavax.sound.sampled.AudioInputStream;importjavax.sound.sampled.AudioSystem;importjavax.sound.sampled.Clip;importjavax.sound.sampled.LineUnavailableException;importjavax.sound.sampled.UnsupportedAudioFileException;/***与用户交互的视图*观察者*/publicclassViewextendsJFrameimplementsObserver{//主面板privateJPanelcontentPane;//结果labelprivateJLabelresult;//回调模型privateCallbackcallback;//按钮privateJButtonjButton;//按钮面板privateJPanelpanel;//按钮text数据String[]btnText={"%","X^3","C","del","1/X","X^2","sqrt","/","7","8","9","*","4","5","6","-","1","2","3","+","+/-","0",".","="};privateJLabelresult_t;//Callback的set方法publicvoidsetCallback(Callbackcallback){this.callback=callback;}/***Createtheswingframe.*/publicView(){//设置Swing界面的基础属性initJframe();//添加外层容器进行存放resultLable、内层JpanelcontentPane=newJPanel();contentPane.setBackground(newColor(255,250,250));contentPane.setBorder(newEmptyBorder(0,5,5,5));setLocationRelativeTo(null);setContentPane(contentPane);contentPane.setLayout(newBorderLayout(0,0));//构建存放按钮的面板容器panel=newJPanel();panel.setPreferredSize(newDimension(400,300));panel.setBackground(SystemColor.control);contentPane.add(panel,BorderLayout.SOUTH);panel.setLayout(newGridLayout(6,6,4,5));//显示结果resultresult=newJLabel("0");result.setForeground(SystemColor.desktop);result.setVerticalAlignment(SwingConstants.TOP);contentPane.add(result,BorderLayout.CENTER);//设置Jlabel的大小result.setPreferredSize(newDimension(500,100));result.setBackground(SystemColor.window);//在外层容器中的布局位置result.setHorizontalAlignment(SwingConstants.RIGHT);result.setFont(newFont("华文新魏",Font.PLAIN,55));//双行显示上层labelresult_t=newJLabel();setIc();result_t.setVerticalAlignment(SwingConstants.BOTTOM);result_t.setHorizontalAlignment(SwingConstants.RIGHT);result_t.setPreferredSize(newDimension(500,140));result_t.setFont(newFont("华文新魏",Font.PLAIN,55));contentPane.add(result_t,BorderLayout.NORTH);//通过for循环向面板容器中增加按钮for(inti=0;i<btnText.length;i++){//创建按钮对象jButton=newJButton(btnText[i]);jButton.addActionListener(newBtnListener());//对按钮进行设置jButton.setFocusPainted(false);panel.add(jButton);}setVisible(true);}/***内部类BtnListener*因为按钮较多,且相似功能较多,所以定义此类,对按钮的事件进行监听*/classBtnListenerimplementsActionListener{//重写当点击,会实现下面方法@OverridepublicvoidactionPerformed(ActionEvente){ //按钮的点击音效 btnMusic(); //判断,如果计算出现错误,则终止掉本轮的计算重新开始if(result.getText().equals("error")){//模型额clc()作用理解为clearallcallback.clc();result.setText("0");}else{//通过按钮的ActionCommand进行对按钮的鉴别,并调用对应的方法switch(e.getActionCommand()){case"%":case"/":case"*":case"+":case"-"://模型的双目运算存储plexOperate(e.getActionCommand());break;case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":case"0":case"."://模型的改变输入框并进行对应操作callback.changeNum(e.getActionCommand());break;case"X^3":case"1/X":case"X^2":case"sqrt":case"+/-"://单目运算callback.singleOprate(e.getActionCommand());break;case"C":case"del"://清除末位callback.clear(e.getActionCommand());break;case"=":callback.eq();break;default:break;}}}/***按钮的点击音效*/privatevoidbtnMusic(){ //创建音频播放功能 AudioInputStreamaInputStream=null; try{ //使用系统类 aInputStream=AudioSystem.getAudioInputStream(newFile("btnm.WAV")); } //补全性抛出异常 catch(UnsupportedAudioFileExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } try{ //使用系统类播放已经定义好的音频对象 Clipclip=AudioSystem.getClip(); try{ clip.open(aInputStream); clip.start(); } //补全性抛出异常 catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } }catch(LineUnavailableExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }}}/***对图形界面进行初始化设置titlesizeclose等基本属性*/privatevoidinitJframe(){//名称退出程序关闭进程sizesetTitle("计算器");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,450,300);setResizable(false);setSize(350,550);}/****实现被观察者的功能*当模型内容发生改变,通过此函数,修改视图中的内容*@paramo被观察者*@paramarg传过来的数据对象*/@Overridepublicvoidupdate(Observableo,Objectarg){//如果传过来的值为空,则默认显示为0if(String.valueOf(arg).length()==0){result.setText("0");result_t.setText("");setIc();}//否则显示接收到的数据字符串else{ //如果字符长度大于10则分两行显示if(arg.toString().length()>10&&arg.toString().length()<20){ char[]c= arg.toString().toCharArray(); StringBuilderbuilder1=newStringBuilder(); StringBuilderbuilder2=newStringBuilder(); //将前10个字符添加到下面显示区 for(inti=0;i<c.length-10;i++){ builder2.append(c[i]); } //将后10个字符添加到上面显示区 for(inti=c.length-10;i<c.length;i++){ builder1.append(c[i]); } result.setText(builder1.toString()); result_t.setText(builder2.toString()); setIc(); }elseif(arg.toString().length()>19){ callback.clc(); result_t.setText(""); setIc(); result.setText("error"); }else{ result_t.setText(""); result.setText(arg.toString()); setIc(); } }}/*** 设置背景图*/privatevoidsetIc(){ if(result_t.getText().length()==0){ result_t.setIcon(newImageIcon("t.png")); } else{ result_t.setIcon(null); } }}Model.javapackagecom.free.calc;importjava.io.*;importjava.math.BigDecimal;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Observable;/***模型进行数据处理*<p>*同时为被观察者*/publicclassModelextendsObservableimplementsCallback{//左操作数publicStringleft;//右操作数publicStringright;//屏幕显示的内容publicStringBuildercontentBuilder=newStringBuilder();//模型中操作数publicStringBuilderbuilder=newStringBuilder();//计算结果publicDoubleresult;//双目运算符publicStringcomplexOperator;//builder与contentbuilder之间协同的参数Booleanflag=true;Stringx;/***数字面板的操作通过此数字面板可以进行对数据的改变**@paramoperator*/@OverridepublicvoidchangeNum(Stringoperator){//进行判断输入的是否为小数点if(operator.equals(".")){//限制小数点在同一个builder中只能存在一个//记录是否有小数点booleanf=true;//通过for循环对小数点的状态进行检测for(inti=0;i<builder.length();i++){if(builder.charAt(i)=='.'){f=false;}}//如果不存在小数点,才允许添加if(f){//检测输入小数点前是否输入其他数据if(builder.length()==0){//如果数字面板中直接增加小数点,则默认开头补全0builder.append("0");builder.append(".");contentBuilder.append("0");}else{builder.append(".");}}}//限制整数不能以0开头elseif(operator=="0"){//通过判断数字大小以及buider长度进行判断if(builder.length()==1&&Integer.valueOf(String.valueOf(builder))==0);elsebuilder.append("0");}//当输入其他数值时,如果builder此时长度为1,但是值为0,则默认取消掉0elseif(builder.length()==1&&Integer.valueOf(String.valueOf(builder))==0){builder=newStringBuilder();builder.append(operator);}else{builder.append(operator);}//通知观察者数据改变setChanged();//通过判断contentbuilder与builder的状态进行两者的协同contentBuilder.append(builder.charAt(builder.length()-1));if(contentBuilder.length()>2){if(contentBuilder.charAt(contentBuilder.length()-1)=='.'&&contentBuilder.charAt(contentBuilder.length()-2)=='.'){contentBuilder.delete(contentBuilder.length()-1,contentBuilder.length());}if(contentBuilder.charAt(contentBuilder.length()-2)==contentBuilder.charAt(contentBuilder.length()-1)&&operator=="."){contentBuilder.delete(contentBuilder.length()-1,contentBuilder.length());}}notifyObservers(contentBuilder);}/***单目运算**@paramoperator*/@OverridepublicvoidsingleOprate(Stringoperator){//首先判断是否有输入数据if(builder.length()!=0){Doubledata=Double.parseDouble(String.valueOf(builder));//通过输入符的actionCommand进行数据处理switch(operator){case"X^3":result=data*data*data;break;case"1/X"://检测被除数不能为0if(data!=0){result=1/data;}break;case"X^2":result=data*data;break;case"sqrt"://调用Math库的开平方接口result=Math.sqrt(data);break;case"+/-":result=-data;break;default:break;}//进行计算的存储saveSimple(operator,data);builder=newStringBuilder();}//判断结果是否为空if(result==null){clc();}else{contentBuilder=newStringBuilder(result.toString());setChanged();notifyObservers(contentBuilder);}}/***按下等号进行计算*/@Overridepublicvoideq(){if(builder.length()!=0&&left!=null&&complexOperator!=null){right=builder.toString();switch(complexOperator){case"+":addSum();break;case"-":subSum();break;case"*":mulSum();break;case"/":if(Double.valueOf(right)!=0){divSum();}break;case"%":modSum();break;default:break;}setChanged();notifyObservers(result);}}/***del与C的方法*del:删除末位字符*C:清空全局变量**@paramoperator*/@Overridepublicvoidclear(Stringoperator){switch(operator){case"C":clc();break;//通过判断各项来决定怎么删除case"del":if(builder.length()!=0&&contentBuilder.length()!=0){builder.delete(builder.length()-1,builder.length());contentBuilder.delete(contentBuilder.length()-1,contentBuilder.length());}//通过此项判断可以避免抛出异常elseif(builder.length()==0&&complexOperator!=null){complexOperator=null;contentBuilder.delete(contentBuilder.length()-1,contentBuilder.length());builder=contentBuilder;}}setChanged();notifyObservers(contentBuilder);}/***对double类型进行处理,最多允许小数点后6位*///publicStringdoubleFormat(Doubled){//Stringa=d.toString();//DecimalFormatdecimalFormat=newDecimalFormat("0.000");//if(d.toString().split("\\.")[1].length()>6){//a=decimalFormat.format(d);//}//returna;//}/***对整个计算的数据进行清空*清空全局变量*/publicvoidclc(){builder=newStringBuilder();left=null;right=null;result=null;complexOperator=null;contentBuilder=newStringBuilder();}/***双目运算*/@OverridepublicvoidcomplexOperate(Stringoperator){//判断双目运算符是否存在//不存在则把builder的值赋给leftif(complexOperator==null){if(builder.length()!=0){left=builder.toString();complexOperator=operator;//添加显示框中的字符contentBuilder.append(operator);builder=newStringBuilder();}}else{//如果再输入下一个操作符时,builder值为空,则更改complexOperatorif(builder.length()!=0){right=builder.toString();switch(complexOperator){case"+":addSum();break;case"-":subSum();break;case"*":mulSum();break;case"/":if(Double.valueOf(right)!=0){divSum();}break;case"%":modSum();break;default:break;}//清空builderbuilder=newStringBuilder();complexOperator=operator;//此下进行输入结果的优化避免显示结果异常if(Double.valueOf(right)!=0&&result<10000000){//如果result小数点后为0,则舍弃小数点if(result%1==0){contentBuilder=newStringBuilder(result.toString().split("\\.")[0]);}elsecontentBuilder=newStringBuilder(result.toString());left=result.toString();contentBuilder.append(operator);}else{clc();contentBuilder.append("error");}}else{contentBuilder.replace(contentBuilder.length()-1,contentBuilder.length(),operator);complexOperator=operator;}}//通知观察者即View视图setChanged();notifyObservers(contentBuilder);}/***加法*/publicvoidaddSum(){BigDecimalbigLelt=newBigDecimal(left);BigDecimalbigRight=newBigDecimal(right);result=bigLelt.add(bigRight).doubleValue();saveHistory();}/***减法*/@OverridepublicvoidsubSum(){BigDecimalbigLelt=newBigDecimal(left);BigDecimalbigRight=newBigDecimal(right);result=bigLelt.subtract(bigRight).doubleValue();saveHistory();}/***乘法*/@OverridepublicvoidmulSum(){BigDecimalbigLelt=newBigDecimal(left);BigDecimalbigRight=newBigDecimal(right);result=bigLelt.multiply(bigRight).doubleValue();saveHistory();}/***除法*/@OverridepublicvoiddivSum(){BigDecimalbigLelt=newBigDecimal(left);BigDecimalbigRight=newBigDecimal(right);result=bigLelt.divide(bigRight,3,BigDecimal.ROUND_HALF_UP).doubleValue();saveHistory();}/***求模运算*/@OverridepublicvoidmodSum(){DoubledLeft=Double.parseDouble(left);DoublerLeft=Double.parseDouble(right);result=dLeft%rLeft;saveHistory();

温馨提示

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

评论

0/150

提交评论