资源描述
JAVA课程设计说明书
题目:模拟科学计算器
姓名:
学号:
班级: 网络工程11-2
山东科技大学
2013年11月7日
目录
1 课设任务及要求 1
1.1课设任务 1
1.2设计要求 1
2 需求分析 2
2.1 设计背景 2
2.2 需求获取 3
2.3 程序功能图 4
3 设计思路 4
3.1 界面布局 4
3.2 类的定义 5
3.3变量的定义 5
4 详细设计 6
4.1整体概述 6
4.2 误操作处理 7
4.3流程图和结构图 8
5 系统调试 11
5.1 程序界面 11
5.2 运行界面 11
6 心得与体会 15
7 参考文献 16
8 附录 16
1 课设任务及要求
1.1课设任务:
要求:界面模拟Windows中的计算器程序。
实现基本数学运算、函数等功能:加、减、乘、除、阶乘、正弦、余弦和指数运算。
实现要点:添加相关组件并进行按钮事件处理。
要求提交Application和Applet两个版本的程序。
1.2设计要求
①设计的java计算器应用程序可以完成加法、减法、乘法、除法和取余运算,和cos,sin,tan等三角函数功能以及阶乘和指数等运算,且有小数点、正负号、求倒数、退格和清零功能。具体可参考windows附件下的计算器
②课程设计使用Eclipse4.2等作为程序编译和运行测试的开发平台,采用JDK-7u25作为java开发环境,使用Microsoft Office Visio 2007作为绘图工具。
③认真按时完成课程设计报告,制作演讲PPT,积极报名上讲台向大家演示和讲解自己的程序。提交打印版的报告以及电子版的原稿和Application和Applet两个版本的程序代码。
2 需求分析
2.1 设计背景
本程序是老师提供的几个课程设计题目中比较中等的题目。要求实现模拟的科学计算器功能,主要包括加减乘除四则运算和阶乘,三角函数以及指数的运算。具体的功能我参考了Windows7下的计算机小程序,并根据其界面设计了java小程序界面,根据其功能对自己设计的计算器小程序进行了功能的适当增加与修改。在实现了课程设计题目要求的基础上,自己又增添了对数函数,幂函数,三角函数,取余等我们常用到的功能比较简单的函数。由于本函数涉及的函数以及按键数目较多,故没有采用面向对象的设计方法,没有对每个功能封装成函数调用,而是针对每个按键的动作事件直接采用了算法的编写。最终实现了全部的功能,但是由于时间有限,许多功能没有坐到很到位的优化,或许还存在着许多了漏洞,欢迎老师和同学的批评指正,我一定会不断完善。
2.2 需求获取
本程序的设计过程,按照题目的要求,我认真参考了Windows7下计算器小程序的运行界面与运行操作与结果,对我自己设计的程序的需求展开了进一步的研究。主要得到以下几点需求:
1.必须实现题目要求的和Windows7下计算器下的基本功能,并能正确运行。
2.必须使程序具有清空,清除,退格和正负数,小数点的基本功能。
3.必须要修程序可以进行连续运算,即如“1+2+3+4,1*2+4-4”等连续运算
4.必须使用可视化界面,按键布局简单明了,使人一看就懂,直接可以上手操作。界面要做到简单明了,通俗易懂,和蔼可亲。
5.必须有用户错误操作,输入不规范的警告与提示,提醒用户正确操作。
6.程序必须经过严格的测试与运行,保证没有明显的BUG和程序崩溃状况,要经得起用户的长时间使用。
2.3 程序功能图
功能图如下:
3 设计思路
3.1界面布局
本应用程序继承自框架类(JFrame),采用BorderLayout边缘布局和GridLayout网格布局相结合的布局管理方式,将单行文本框加入到“North”区域,包含各种按钮的面板JPanel p按照网格布局的顺序加入到其他区域。将文本框放到界面上方,将指数函数放到界面下方,将三角函数放到界面左边,将基本四则运算放到界面的右面,使得界面的整体布局合理整洁,易于上手。
3.2类的定义
本程序主要定义了一个主函数和三个类:
public static void main(String[] args):程序的主函数,Application程序的主要实现标志,调用上文中定义的类
class C1:程序主类,定义了整个界面的布局,和针对每个按钮的动作监听,以及每个动作所对应的具体的操作,计算的运行和输出主函数。
class jiecheng:定义了阶乘运算(fff)的算法实现。
class Mymath:定义了asinh、acosha、tanh三个Math.中不包含的三角函数及其算法实现
3.3变量的定义
字符串变量String a,c,s用来储存数字和符号以及运算结果。
整形变量flagdenghao,flagyunsuan,lastyunsuan
Count变量countxiaoshudian用来统计小数点出现的次数
4 详细设计
4.1.整体概述
首先,程序定义了三个类:一个主类,两个主类里调用的辅助类。分别实现,计算器主要功能的实现,阶乘算法的实现,和反三角函数算法的实现。
其次,对于C1主类,首先在框架JFrame下定义了每个触击式组件,即JButton命令式按钮。并采用了BorderLayout边缘布局和GridLayout网格布局相结合的布局管理方式。将文本框,Str1(数字运算),Str2(三角函数),Str3(反三角函数)和Str4(指数函数)合理的排布在整个框架下。
然后,定义了每个JButton命令式按钮代表的数字,符号和函数,并且通过public void actionPerformed(ActionEvent e)
函数定义了每个按钮对应的动作监听,从而确定了鼠标点击每个按钮时可以实现对应的不同的算法。
接下来,就是每个运算所对应的算法实现,这里以加法运算为例:
1.首先用户输入一个数字,程序用String s暂时储存,并通过JTexField()文本编辑框显示出来。
2.接着,用户按下“+”按钮,触发按钮事件,先判断是数字或者是符号,当触发事件之前输入的是符号时“.”没有输入数字时,程序采用 Double.valueOf(),将输入的“.”进行强制类型转换成“0.”。当用户输入正常数字时,程序首先将s内的数据储存到a中,同时将a中的内容清空,以便输入加数,并再次储存到s中,并通过JTexField()文本编辑框显示出来。
3.当用户按下“=”按钮时,程序首先进行判断是否flagyunsuan==0,当flagyunsuan==0是说明是第一次按“=”按钮,接下在判断“=”之前是否是空值或符号,当判断flagdenghao = ture的时候可以进行运算。将运算结果存入a中,并再次通过JTexField()文本编辑框显示出来。
4.接下来还要对运行的结果通过Double.valueOf()进行强制类型转换。因为储存数据的s和a都是String型变量,而要求的输出结果却是double类型的变量,所以要转换以后输出。
5.输出完毕以后,必须判断是否使用本次运算结果进行下一步的运算,如果是的话则通过switch (lastyunsuan)来判断接下来需要进行的运算,再重复上面的步骤。
4.2.误操作处理
由于用户操作的不确定性,有时可能不会严格按照程序说明书进行对应的操作,经常会发生误操作。这便对程序的操作性要求大大提高。这就要求程序做到以下几点:
1.程序不能因为操作失误而崩溃。
2.程序要可以给用户发出错误警报。
3.程序要可以对错误进行适当的修改。
而本程序经过反复误操作运行,已经可以保证程序不会因为误操作而发生崩溃。其次,本程序采用了Toolkit.getDefaultToolkit().beep()函数,可以使程序发出“beep”声音的警报。最后,本程序对一些显而易见的错误,比如输入小数时可以自动把用户输入的“.”强制转化为“0.”等。
从而保证了,当遇到各种误操作的时候程序可以正常运行。
4.3.流程图和结构图
1.程序流程图
2.代码结构图
5 运行与调试
5.1 程序界面
计算器界面如下:
5.2 运行界面
注:由于本程序要实现的功能过多,这里只采用部分具有代表性的功能的截图作为参考。
1.加法操作
程序可以正确运行8+5=13
2.除操作
程序可以正确运行9/3=3
3.sin函数运算
可以正确运行sin(π)= 0(由于本函数采用弧度运算,这里取了π的近似值3.14进行的运算,所以运算结果只能约等于1)。
4.指数运算
本程序可以正确运行2的立方= 8。
5.阶乘运算
本程序正确实现了9的阶乘 = 362880
6心得与体会
本次课程设计在我的努力编写下顺利完成了。设计过程中我付出了劳动与汗水,遇到过很多的困难和挫折,而且我们最终都战胜了他们,获得的最大收货,我认为并不是我设计成功了一个多么了不起的程序,而是我在设计过程中遇到的困难和解决它的方法与经验才是最值得我认真体会的地方。
通过本次设计过程我发现了我们学习知识的严重不足,许多设计过程中常用到的知识,我们掌握的并不好。还要时常去查课本,有的甚至一点印象都没有,我认为这一切的原因在于我们不去用他,俗话说孰能生巧。对于所学的知识我们要善于使用。
我还发现,一些问题不能只凭借自己的主观去臆想判断,实践才是硬道理,实践出真知。只有通过自身去调查去分析得出的结论,才最接近事实,软件的开发切忌不能想当然的去看问题,毕竟只有动手做了才知道对与不对。
本次实验过后,不仅锻炼了我的设计分析能力,编程能力,最重要的是锻炼了我面对问题的应变与解决能力。只有把自己所学的知识,和自己的经验,老师的指导相互结合起来,才能在学习的道路上少走弯路,并实现自己想要的目标。
最后,再次感谢《java程序设计》赵建立老师的指导,,感谢有关同学提供的帮助,最后祝愿java这门课越学越好。
7参考资料
《Java程序设计教程(第2版)》 雍俊海 清华大学出版社
《Java程序设计实验指导》 雍俊海 清华大学出版社
《Java语言使用教程》 丁振凡 北京邮件大学出版社
8附录
由于本程序涉及的代码量过于庞大,这里只给出几个有代表性的算法的代码,完整的代码请参考电子版的代码附录。
部分程序源代码如下:
class jiecheng {
public static double fff(double n){
if(n<=0)
return 1;
else
return n*fff(n-1);
}
}
class Mymath {
public static double asinh(double x){
return Math.log(x+Math.sqrt(x*x+1));
}
public static double acosh(double x){
return Math.log(x+Math.sqrt(x*x-1));
}
public static double atanh(double x){
return 0.5*Math.log((1+x)/(1-x));
}
}
public class C1 implements ActionListener//,KeyListener{
{
public C1() {
JFrame frame = new JFrame();
Container con = frame.getContentPane();
con.setLayout(new BorderLayout(10,10));
panel1 = new JPanel();
panel2 = new JPanel();
panel3 = new JPanel();
panel4 = new JPanel();
panel1.setLayout(new GridLayout(6,4,5,5));
panel2.setLayout(new GridLayout(4,2,2,2));
panel3.setLayout(new GridLayout(4,2,3,3));
panel4.setLayout(new GridLayout(2,4,4,4));
panel5 = new JPanel();
panel5.setLayout(new CardLayout());
String []str1 = {"7","8","9","/","4","5","6","*","1","2","3","-","0",".","+","=","back","CE","mod","C","+/-"};
for(int i=0;i<str1.length;i++){
b[i] = new JButton(str1[i]);
b[i].addActionListener(this);
panel1.add(b[i]);
}
String []str2 = {"lnv","ln","sin","cos","tan","sinh","cosh","tanh"};
for(int i = 0;i<str2.length;i++){
b2[i] = new JButton(str2[i]);
b2[i].addActionListener(this);
panel2.add(b2[i]);
}
String []str3 = {"lnv","ex","asin","acos","atan","asinh","acosh","atanh"};
for(int i = 0;i<str3.length;i++){
b3[i] = new JButton(str3[i]);
b3[i].addActionListener(this);
panel3.add(b3[i]);
}
panel5.add("one",panel2);
panel5.add("two",panel3);
((CardLayout)panel5.getLayout()).show(panel5, "one");
String []str4 = {"1/x","sqrt","x^2","x^3","x^y","3√","y√x","log","10^x","n!"};
for(int i=0;i<str4.length;i++){
b4[i] = new JButton(str4[i]);
b4[i].addActionListener(this);
panel4.add(b4[i]);
} }
}
);
}
//===========================================================
public void actionPerformed(ActionEvent e){
if(e.getSource()==b[0]){//7
if(flagb2 == true){
s = "";
s += 7;
textfield.setText(s);
textfield.requestFocus();
return;
}
if(flagdenghao==true){
flagdenghao = false;
}
s+=7;
textfield.setText(s);
textfield.requestFocus();
}
else if(e.getSource()==b[13]){//.
if(flagb2 == true){
s = "";
s += ".";
textfield.setText(s);
textfield.requestFocus();
flagb2 = false;
countxiaoshudian++;
return;
}
if(flagdenghao==true){
flagdenghao = false;
}
if(countxiaoshudian >= 1){
Toolkit.getDefaultToolkit().beep();
}
else{
s+=".";
System.out.println(s);
System.out.println(s.length());
if(s.equals("."))
System.out.println("true");
else
System.out.println("false");
}
textfield.setText(s);
textfield.requestFocus();
countxiaoshudian++;
}
//-----------------------------------------------
else if(e.getSource()==b[3]){///
if(flagyunsuan==0){
if(s == ""){
if(flagdenghao == false)
a = 0;
else
flagdenghao = false;
}
else{
if(s.equals(".")){
s = "0.";
}
a = Double.valueOf(s);
}
}
else{
if(s !=""){
if(s.equals(".")){
s = "0.";
}
c = Double.valueOf(s);
switch (lastyunsuan){
case '+':
a += c;
break;
case '-':
a -= c;
break;
case '*':
a *= c;
break;
case '%':
if(c == 0){
a = 0;
}
else{
a %= c;
}
break;
case '/':
if(c == 0){
textfield.setText("除数不为0");
flagdenghao = false;
flagyunsuan = 0;
lastyunsuan = ' ';
countxiaoshudian = 0;
a = 0;
c = 0;
ch = ' ';
}
else
a /= c;
break;
case '^':
a = Math.pow(a, c);
break;
case '$':
if(a <= 0){
textfield.setText("error");
flagdenghao = false;
flagyunsuan = 0;
lastyunsuan = ' ';
countxiaoshudian = 0;
a = 0;
c = 0;
ch = ' ';
}
else{
a = Math.pow(a, 1.0/c);
}
break;
}
}
textfield.setText(""+a);
}
s = "";
countxiaoshudian = 0;
ch='/';
lastyunsuan=ch;
flagyunsuan++;
flagdenghao = false;
flagb2 = false;
textfield.requestFocus();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new C1();
}
第 23 页
展开阅读全文