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

上传人:文库蛋蛋多 文档编号:2387047 上传时间:2023-02-17 格式:DOC 页数:19 大小:65.50KB
返回 下载 相关 举报
Java语言课程设计带函数功能和数制转换功能的计算器制作.doc_第1页
第1页 / 共19页
Java语言课程设计带函数功能和数制转换功能的计算器制作.doc_第2页
第2页 / 共19页
Java语言课程设计带函数功能和数制转换功能的计算器制作.doc_第3页
第3页 / 共19页
Java语言课程设计带函数功能和数制转换功能的计算器制作.doc_第4页
第4页 / 共19页
Java语言课程设计带函数功能和数制转换功能的计算器制作.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《Java语言课程设计带函数功能和数制转换功能的计算器制作.doc》由会员分享,可在线阅读,更多相关《Java语言课程设计带函数功能和数制转换功能的计算器制作.doc(19页珍藏版)》请在三一办公上搜索。

1、JAVA语言课程设计报告题 目:带函数功能和数制转换功能的计算器制作设 计 者: 专业班级: 学 号: 指导教师: 2011 年 12 月 12 日 计算机学院1、系统需求分析1.1系统名称:带函数功能和数制转换功能的计算器1.2系统介绍制作一个计算器,主要有以下功能:1.可以连续输入运算,对于输入的表达式能够按算符优先级进行处理。如输入2+3*2时输出为8,而不是10。2.可以处理含括号的表达式,Sin、Cos、Tan、平方、倒数、开方等操作可以与表达式结合进行运算,不用单独运算。3.科学计数法表示,当输入值或者计算结果超过一定范围时会自动以科学计数法表示。4.增加了科学计算器的一些设施,如

2、清空,求平方,求根号,求倒数,求三角函数,正负值,显示括号嵌套层数等。5.错误提示,除数为0,应算超过范围等在下方将有文字提示,并将当前结果置零。6.支持小数点,支持正负运算。1.3开发背景计算器作为计算工具被应用于方方面面,为人类的计算提供了便利。原来的计算器有很多不完善的地方,比如说三角函数和错误提示,本计算器制作期间考虑到这些点,将很多东西融入了这个小软件,给运算和使用提供了更多的功能。1.4系统面向的用户人群本计算器为计算量中等,对函数要求不太高的人群所开发。适合于简单计算数据,不适合科研工作。1.5开发环境Eclipse2.系统设计2.1总体设计本程序在设计时,参照了Windows自

3、带的科学计算器的界面设计和功能模式。在界面上与其非常相似。利用Eclipse编程环境,通过对按钮和菜单添加监听,并重载actionPerformed函数实现相应事件的响当当应。程序的内核采用栈来处理,从而不仅可以处理表达式,而且可以按优先级来计算。同时还可以将Sin、Cos、Tan、平方、倒数、开方等操作与表达式结合进行运算,在算符优先级的比较方面,本程序抛弃了传统的建立一个二维数组的方式来查询比较算符优先级,而是设一个ENUM类型的变量,将优先级别小的操作符放在前面,优先级别大的操作符放在后面,如:privateenumOperatorOpNone,OpLeft,OpAdd,OpSub,Op

4、Mul,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_Bi

5、ts=0;小数点后位数publicdoublem_Operand=0;当前操作数publicdoublem_Accum=0;计算结果publicbooleanm_Operable=false;决定当前是显示当前操作数还是运算结果publicbooleanm_Dot=false;是否已经输入小数点publicStringStr;输出框显示字符串Stackm_Stack=null;操作数栈Stacko_Stack=null;操作符栈privateenumOperatorOpNone,OpLeft,OpAdd,OpSub,OpMul,OpDiv,OpRight;自定义操作符类型publicOpera

6、torm_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

7、(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;th

8、is.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变量判断当前数是否输完,如未输完就按十进制计数法则累加,否则就作为新的数

9、。累加后的数据先放到临时变量里,当输入操作符的时候才压入栈里。这个操作在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.OpLef

10、t)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);

11、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

12、.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_S

13、tack.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,下

14、方文本显示“除数不能为零!”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(

15、10,this.m_Bits);elsethis.m_Operand=this.m_Operand*10+Integer.parseInt(str);4软件测试软件测试成功,实现设计的所有要求,能进行基本数据运算、三角函数运算、进制之间的转换以及括号的优先级运算等等,运算无误。5系统总结本次项目在规定期间完成,可以进行设计题目中要求的各种运算。6系统设计心得体会在本次项目中设计中,Java在原来的基础上有了更深的了解和掌握,能够熟练的对程序进行添加和改写。此外还在老师讲解的基础上学会了举一反三,能够根据自己的需求适当的添加一些相关的代码。其次对开发环境eclipse在原有的基础上有了很深的了解

16、。此外,在开发过程中,也得到了一些教训,必须对每句代码知道是什么意思,做到认真仔细。还需要不断地尝试新的内容。在不懂得地方要多查多看多问。参考文献朱福喜.java语言基础教程M.北京:清华大学出版社,2008张化祥.java语言基础教程M.北京:清华大学出版社,2007。部份原代码CalcDemo.javaimportCalcPackage.*;publicclassCalcDemo/*paramargs*/publicstaticvoidmain(Stringargs)CalcFramemainFrame=newCalcFrame();mainFrame.getJFrame();/只是为了去

17、除未使用变量错误警告,此语句无意义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)Fu

18、nc.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.ja

19、vapackageCalcPackage;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;publi

20、cdoublem_Accum=0;publicbooleanm_Operable=false;publicbooleanm_Dot=false;publicStringStr;Stackm_Stack=null;Stacko_Stack=null;privateenumOperatorOpNone,OpLeft,OpAdd,OpSub,OpMul,OpDiv,OpRight;publicOperatorm_Operator=Operator.OpNone;publicCalcFunc(JLabeljL,JTextFieldjF,JTextFieldjTL)this.jLabel=jL;this

21、.jTextField=jF;this.jLeft=jTL;m_Stack=newStack();o_Stack=newStack();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=Op

22、erator.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=

23、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;jTextFie

24、ld.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

25、_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_

26、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.se

27、tText();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_Oper

28、and;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.jText

29、Field.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(

30、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(!thi

31、s.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();pu

32、blicvoidCompute(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();

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号