欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    Java语言课程设计带函数功能和数制转换功能的计算器制作.doc

    • 资源ID:2387047       资源大小:65.50KB        全文页数:19页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Java语言课程设计带函数功能和数制转换功能的计算器制作.doc

    JAVA语言课程设计报告题 目:带函数功能和数制转换功能的计算器制作设 计 者: 专业班级: 学 号: 指导教师: 2011 年 12 月 12 日 计算机学院1、系统需求分析1.1系统名称:带函数功能和数制转换功能的计算器1.2系统介绍制作一个计算器,主要有以下功能:1.可以连续输入运算,对于输入的表达式能够按算符优先级进行处理。如输入2+3*2时输出为8,而不是10。2.可以处理含括号的表达式,Sin、Cos、Tan、平方、倒数、开方等操作可以与表达式结合进行运算,不用单独运算。3.科学计数法表示,当输入值或者计算结果超过一定范围时会自动以科学计数法表示。4.增加了科学计算器的一些设施,如清空,求平方,求根号,求倒数,求三角函数,正负值,显示括号嵌套层数等。5.错误提示,除数为0,应算超过范围等在下方将有文字提示,并将当前结果置零。6.支持小数点,支持正负运算。1.3开发背景计算器作为计算工具被应用于方方面面,为人类的计算提供了便利。原来的计算器有很多不完善的地方,比如说三角函数和错误提示,本计算器制作期间考虑到这些点,将很多东西融入了这个小软件,给运算和使用提供了更多的功能。1.4系统面向的用户人群本计算器为计算量中等,对函数要求不太高的人群所开发。适合于简单计算数据,不适合科研工作。1.5开发环境Eclipse2.系统设计2.1总体设计本程序在设计时,参照了Windows自带的科学计算器的界面设计和功能模式。在界面上与其非常相似。利用Eclipse编程环境,通过对按钮和菜单添加监听,并重载actionPerformed函数实现相应事件的响当当应。程序的内核采用栈来处理,从而不仅可以处理表达式,而且可以按优先级来计算。同时还可以将Sin、Cos、Tan、平方、倒数、开方等操作与表达式结合进行运算,在算符优先级的比较方面,本程序抛弃了传统的建立一个二维数组的方式来查询比较算符优先级,而是设一个ENUM类型的变量,将优先级别小的操作符放在前面,优先级别大的操作符放在后面,如:privateenumOperatorOpNone,OpLeft,OpAdd,OpSub,OpMul,OpDiv,OpRight,分别代表等号、左括号、加、减、乘、除、右括号。比较优先级时只要通过比较Operator成员的ordinal方法反回值就可以了,如:this.m_Operator.ordinal()<=this.o_Stack.peek().ordinal()。2.2源文件说明CalcDemo.java:主类CalcFrame.java:程序界面类CalcFunc.java:程序运算类,实现数值的输入显示和计算CalcMenu.java:程序菜单类2.3相关函数和变量说明CalcFunc.javapublicintm_Left=0;左括号与右括号相差数publicintm_Bits=0;小数点后位数publicdoublem_Operand=0;当前操作数publicdoublem_Accum=0;计算结果publicbooleanm_Operable=false;决定当前是显示当前操作数还是运算结果publicbooleanm_Dot=false;是否已经输入小数点publicStringStr;输出框显示字符串Stack<Double>m_Stack=null;操作数栈Stack<Operator>o_Stack=null;操作符栈privateenumOperatorOpNone,OpLeft,OpAdd,OpSub,OpMul,OpDiv,OpRight;自定义操作符类型publicOperatorm_Operator=Operator.OpNone;操作符的实例2.4详细设计双击计算器根目录calc.exe执行应用程序,运行界面如下所示:1) 数值输入和显示程序中数据的输入都是由ClacFunc.java中的input函数完成的。函数的代码如下:publicvoidInput(Stringstr)if(str.equals(".")this.m_Dot=true;this.m_Operable=true;return;if(str.equals("+")this.m_Operable=false;this.m_Operator=Operator.OpAdd;Run();return;if(str.equals("-")this.m_Operable=false;this.m_Operator=Operator.OpSub;Run();return;if(str.equals("*")this.m_Operable=false;this.m_Operator=Operator.OpMul;Run();return;if(str.equals("/")this.m_Operable=false;this.m_Operator=Operator.OpDiv;Run();return;if(!this.m_Operable)this.m_Operand=0;this.m_Dot=false;this.m_Bits=0;if(this.m_Dot)this.m_Bits+;this.m_Operand=this.m_Operand+Integer.parseInt(str)/Math.pow(10,this.m_Bits);elsethis.m_Operand=this.m_Operand*10+Integer.parseInt(str);this.m_Operable=true;Disp();主要思想就是如果输入的是操作符,则当操作符变量为输入的操作符,然后压入栈运算。如果输入的是数字,就根据m_Operable变量判断当前数是否输完,如未输完就按十进制计数法则累加,否则就作为新的数。累加后的数据先放到临时变量里,当输入操作符的时候才压入栈里。这个操作在Run函数里完成。2) 程序核心本程序的核心为两三个函数,Run处理操作数和操作符的栈操作,Compute函数从操作数栈取出两个操作数和从操作符栈取出一个操作符并进行运算,程序代码如下:publicvoidRun()OperatorGo;if(this.o_Stack.empty()|(this.m_Operator=Operator.OpLeft)|this.m_Operator.ordinal()>this.o_Stack.peek().ordinal()if(this.m_Operator=Operator.OpLeft)this.o_Stack.push(this.m_Operator);elsethis.o_Stack.push(this.m_Operator);this.m_Stack.push(this.m_Operand);elsethis.m_Stack.push(this.m_Operand);while(!this.o_Stack.empty()&&this.m_Operator.ordinal()<=this.o_Stack.peek().ordinal()Go=this.o_Stack.pop();Compute(Go);this.o_Stack.push(this.m_Operator);if(!this.m_Stack.empty()this.m_Operand=this.m_Accum=this.m_Stack.peek();Disp();if(this.m_Operator=Operator.OpNone)this.o_Stack.clear();this.m_Stack.clear();publicvoidCompute(OperatorOpp)intresult;result=GetTwo();if(result=1)switch(Opp)caseOpAdd:this.m_Stack.push(op1+op2);break;caseOpMul:this.m_Stack.push(op1*op2);break;caseOpSub:this.m_Stack.push(op2-op1);break;caseOpDiv:if(op1=0)this.jLabel.setText("除数不能为零!");elsethis.m_Stack.push(op2/op1);break;elsethis.m_Stack.clear();this.o_Stack.clear();this.m_Operable=false;privateintGetTwo()if(this.m_Stack.empty()return0;op1=this.m_Stack.pop();if(this.m_Stack.empty()return0;op2=this.m_Stack.pop();return1;3实验结果与数据处理1)计算表达式10+20*(30+40)+sin30。/22:计算器输出:1410.125000000064实际计算结果:1410.125,与计算结果符合。2)计算:123456789*987654321:计算器输出:1.21932631112635264E17实际计算结果:1.21932631112635264E17,与计算结果基本符合。3)计算:-3.86的平方计算器输出:14.8996实际计算结果:14.8996,与计算结果基本符合。4)计算:1/0计算器输出:0,下方文本显示“除数不能为零!”5)计算:100的N次方计算器输出:连续按N次平方后,计算器输出为0,下方文本显示“超出运算范围”;程序因为采用double数据类型存储输入数值,所以计算结果很精确,但有时会因为太精确而产生麻烦,如输入:0.1112时,实际显示会变成:0.11120000000000001。但这不影响运算结果。当再输入一个数值时,如8则显示正常:0.11128。这是由程序对输入数值的算法决定的。算法代码如下:if(this.m_Dot)this.m_Bits+;this.m_Operand=this.m_Operand+Integer.parseInt(str)/Math.pow(10,this.m_Bits);elsethis.m_Operand=this.m_Operand*10+Integer.parseInt(str);4软件测试软件测试成功,实现设计的所有要求,能进行基本数据运算、三角函数运算、进制之间的转换以及括号的优先级运算等等,运算无误。5系统总结本次项目在规定期间完成,可以进行设计题目中要求的各种运算。6系统设计心得体会在本次项目中设计中,Java在原来的基础上有了更深的了解和掌握,能够熟练的对程序进行添加和改写。此外还在老师讲解的基础上学会了举一反三,能够根据自己的需求适当的添加一些相关的代码。其次对开发环境eclipse在原有的基础上有了很深的了解。此外,在开发过程中,也得到了一些教训,必须对每句代码知道是什么意思,做到认真仔细。还需要不断地尝试新的内容。在不懂得地方要多查多看多问。参考文献朱福喜.java语言基础教程M.北京:清华大学出版社,2008张化祥.java语言基础教程M.北京:清华大学出版社,2007。部份原代码CalcDemo.javaimportCalcPackage.*;publicclassCalcDemo/*paramargs*/publicstaticvoidmain(Stringargs)CalcFramemainFrame=newCalcFrame();mainFrame.getJFrame();/只是为了去除未使用变量错误警告,此语句无意义CalcFrame.javapublicvoidactionPerformed(ActionEvente)StringCommand=e.getActionCommand();this.jLabel.setText("输入.");if(Command.equals("sin")Func.Sin();elseif(Command.equals("cos")Func.Cos();elseif(Command.equals("tan")Func.Tan();elseif(Command.equals("x2")Func.X2();elseif(Command.equals("1/x")Func.X1();elseif(Command.equals("(")Func.Left();elseif(Command.equals(")")Func.Right();elseif(Command.equals("sqrt")Func.Sqrt();elseif(Command.equals("清空")Func.Clear();elseif(Command.equals("退出")System.exit(0);elseif(Command.equals("=")Func.Be();elseif(Command.equals("+-")Func.As();elseFunc.Input(Command);CalcFunc.javapackageCalcPackage;importjavax.swing.*;importjava.util.Stack;publicclassCalcFuncprivateJLabeljLabel=null;privateJTextFieldjTextField=null;privateJTextFieldjLeft=null;privatedoubleop1=0,op2=0;publicdoublePI=3.141592655358989323846264;publicintm_Left=0;publicintm_Bits=0;publicdoublem_Operand=0;publicdoublem_Accum=0;publicbooleanm_Operable=false;publicbooleanm_Dot=false;publicStringStr;Stack<Double>m_Stack=null;Stack<Operator>o_Stack=null;privateenumOperatorOpNone,OpLeft,OpAdd,OpSub,OpMul,OpDiv,OpRight;publicOperatorm_Operator=Operator.OpNone;publicCalcFunc(JLabeljL,JTextFieldjF,JTextFieldjTL)this.jLabel=jL;this.jTextField=jF;this.jLeft=jTL;m_Stack=newStack<Double>();o_Stack=newStack<Operator>();Clear();publicvoidInput(Stringstr)if(str.equals(".")this.m_Dot=true;this.m_Operable=true;return;if(str.equals("+")this.m_Operable=false;this.m_Operator=Operator.OpAdd;Run();return;if(str.equals("-")this.m_Operable=false;this.m_Operator=Operator.OpSub;Run();return;if(str.equals("*")this.m_Operable=false;this.m_Operator=Operator.OpMul;Run();return;if(str.equals("/")this.m_Operable=false;this.m_Operator=Operator.OpDiv;Run();return;if(!this.m_Operable)this.m_Operand=0;this.m_Dot=false;this.m_Bits=0;if(this.m_Dot)this.m_Bits+;this.m_Operand=this.m_Operand+Integer.parseInt(str)/Math.pow(10,this.m_Bits);elsethis.m_Operand=this.m_Operand*10+Integer.parseInt(str);this.m_Operable=true;Disp();publicvoidDisp()doublelVal=(m_Operable)?m_Operand:m_Accum;Str=String.valueOf(lVal);if(Str.equals("Infinity")this.jLabel.setText("超过运算范围!");Str="0.0"jTextField.setText(Str);publicvoidSqrt()this.m_Operable=false;this.m_Operand=Math.sqrt(this.m_Operand);this.m_Accum=this.m_Operand;Disp();publicvoidSin()this.m_Operand=this.m_Operand/180*PI;this.m_Operand=Math.sin(this.m_Operand);this.m_Accum=this.m_Operand;this.m_Operable=false;Disp();publicvoidCos()this.m_Operand=this.m_Operand/180*PI;this.m_Operand=Math.cos(this.m_Operand);this.m_Accum=this.m_Operand;this.m_Operable=false;Disp();publicvoidTan()this.m_Operand=this.m_Operand/180*PI;this.m_Operand=Math.tan(this.m_Operand);this.m_Accum=this.m_Operand;this.m_Operable=false;Disp();publicvoidLeft()this.m_Left+;this.jLeft.setText("("+String.valueOf(this.m_Left);this.m_Operator=Operator.OpLeft;this.m_Operable=false;Run();publicvoidRight()if(this.m_Left!=0)this.m_Operator=Operator.OpRight;this.m_Operable=false;this.m_Left-;if(this.m_Left!=0)this.jLeft.setText("("+String.valueOf(this.m_Left);elsethis.jLeft.setText("");this.m_Stack.push(this.m_Operand);OperatorOp;while(this.o_Stack.peek()!=Operator.OpLeft)Op=this.o_Stack.pop();Compute(Op);this.m_Operand=this.m_Accum=this.m_Stack.peek();Disp();this.o_Stack.pop();this.m_Stack.pop();publicvoidX2()this.m_Operable=false;this.m_Operand=this.m_Operand*this.m_Operand;this.m_Accum=this.m_Operand;Disp();publicvoidX1()this.m_Operable=false;if(this.m_Operand=0)this.jLabel.setText("除数不能为零!");elsethis.m_Operand=1/this.m_Operand;this.m_Accum=this.m_Operand;Disp();publicvoidClear()this.m_Accum=0;this.m_Left=0;this.m_Operable=false;this.m_Operand=0;this.Str=""this.jTextField.setText("0.0");this.m_Dot=false;this.m_Stack.clear();this.o_Stack.clear();this.jLeft.setText("");this.op1=0;this.op2=0;this.m_Operator=Operator.OpNone;this.jLabel.setText("科学计算器");publicvoidAs()this.m_Operable=false;this.m_Operand=this.m_Accum=(-1)*this.m_Operand;Disp();publicvoidRun()OperatorGo;if(this.o_Stack.empty()|(this.m_Operator=Operator.OpLeft)|this.m_Operator.ordinal()>this.o_Stack.peek().ordinal()if(this.m_Operator=Operator.OpLeft)this.o_Stack.push(this.m_Operator);elsethis.o_Stack.push(this.m_Operator);this.m_Stack.push(this.m_Operand);elsethis.m_Stack.push(this.m_Operand);while(!this.o_Stack.empty()&&this.m_Operator.ordinal()<=this.o_Stack.peek().ordinal()Go=this.o_Stack.pop();Compute(Go);this.o_Stack.push(this.m_Operator);if(!this.m_Stack.empty()this.m_Operand=this.m_Accum=this.m_Stack.peek();Disp();if(this.m_Operator=Operator.OpNone)this.o_Stack.clear();this.m_Stack.clear();publicvoidCompute(OperatorOpp)intresult;result=GetTwo();if(result=1)switch(Opp)caseOpAdd:this.m_Stack.push(op1+op2);break;caseOpMul:this.m_Stack.push(op1*op2);break;caseOpSub:this.m_Stack.push(op2-op1);break;caseOpDiv:if(op1=0)this.jLabel.setText("除数不能为零!");elsethis.m_Stack.push(op2/op1);break;elsethis.m_Stack.clear();this.o_Stack.clear();this.m_Operable=false;privateintGetTwo()if(this.m_Stack.empty()return0;op1=this.m_Stack.pop();if(this.m_Stack.empty()return0;op2=this.m_Stack.pop();return1;publicvoidBe()this.m_Operable=false;this.m_Operator=Operator.OpNone;Run();

    注意事项

    本文(Java语言课程设计带函数功能和数制转换功能的计算器制作.doc)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开