1. 课程设计目的 .............................................. 2 2. 设计题目分析 .............................................. 2
2. 1题目简介 ............................................ 2 2. 2设计要求及需求分析 .................................. 3. 课程设计内容 .............................................. 3. 1总体设计 ............................................ 3.2计算器功能模块设计 ................................... 3.3计算器算法流程设计 .................................... 3.4类的设计 .............................................. 3. 5代码实现: .......................................... 3. 5设计结果与分析 ...................................... 4. 设计心得与总结 ........................................... 参考文献: ................................................. 附录: ..................................................... 2 3
3 4 4 5 6 8 101011
1.课程设计目的
通过课程设计把知识形成系统,把自己所学的知识在实际问题中加以运
用。如果自己编写的程序能够给更多的人带来方便,
并且得到人们的好评,那么
自己编写的程序就可以实现商品化,形成产品给更多的人利用,并实现一定的商 品价值。
因此本次课程设计有目的有以下几点:
(1) 复习巩固java语言的基础知识,进一步加深对java语言的理解和掌控。
(2) 提供一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际 有机结合起来,锻炼我们的分析解决实际问题的能力。 提高我们适应实际,实践 编程的能力。
(3) 培养我们在项目开发中创新意识及能力, 通过亲身实践,利用所学编写 简单的面向对象程序,提高对面向对象及 JAVA语言的理解。
2•设计题目分析
2 . 1题目简介
设计一个图形界面(GU)的计算器应用程序,完成简单的算术运算、 设计的计
算器应用程序可以完成家法、减法、乘法、除法。
2 . 2设计要求及需求分析
设计要求:由于现代用户更倾向于由鼠标方便操作的图形用户界面,
所以我
们采用GUI来实现计算器,并采用Swing组件,AWT事件处理等实现具体功能。
背景需求分析:在我们日常生活中,计算开支、收入时,大额数字或是多倍 小数的计算都需要计算器的帮助, 而在学习一些科目时,也常常要处理数字。虽 然现在的计算器价格比较低廉,但是功能过于简单的不能满足个人需求,功能多 的价格较贵,不仅操作不便,很多功能也根本用不到。所以我们想用自己所学设 计开发一个属于自己的简单计算器来完成日常学习生活的需求。
3.课程设计内容
3. 1总体设计
本应用程序继承自框架类(Frame),此程序 使用Frame布局管理器 BorderLayout,将单行文本框加入到“ North ”区域,包含各种按钮的面板 Panel p加入到” Center”区域。包含各种按钮的面板Panel p采用4行4列的网格布 局,然后将数字按钮和运算符按钮以及控制按钮添加到面板中。
件监听器。如:Button b=new Button();b.addActionListener(
同时注册按钮事 事件监听器);
完成主
事件监听器中的事件处理方法 void actio nPeformed(Actio nEve nt evt)
要的按钮事件的处理。事件处理分以下几种情况:数字按钮事件( ” 0”,” 1”,” 2” …”
8”,” 9”)、运算符按钮事件(” +”,”一
“,”* ”,”/”,”% )、正负号按钮事件(” +/- “)、小数点按钮事件(”.”)、 等号按钮事件(”=”)、求倒按钮事件(” 1/x ”)、退格按钮事件(”退格”)、 清楚按钮事件(“ C”)。
触发按钮事件时,要进一步分析,是重新开始计算时触发的按钮事件还是计 算中间触发的按钮事件。计算器完成的是一个数学表达式,如:
3+ 2,所以可以
采用一个链表(LinkedList类)来存储数字或字符,如3,+, 2分别存储在链 表中,最后运算时,可以 -------------- 取出来进行运算。
计算器设计外形及结构如下:
系统总体设计框架
Pan el2
Pan ell
Panel: 4*4的数字及运算键
Panel2 :输入及运行结果显示及倒退清空键
3.2计算器功能模块设计
以下为标准计算器的基本功能: (1) 加法
两个数据进行加操作,可以为小数。 (2) 减法
两个数据进行减操作,可以为负数相减 (3) 乘法
两个数相乘操作。 (4) 除法
两个数相除操作。
5)清零 清除显示框的数据。 具体的计算器功能模块图如下:
3.3计算器算法流程设计
计算器的程序设计,必然有数据的输入,当中就包含运算符和数字,都要通 过计算器上的butt on按钮选项按键输入进去,里面录入的为字符型的数据,若 要进行运算,要将输入的字符转换成 double型,以防运算出错。 实现计算器算法功能的流程图如下所示:
3.4类的设计
class jisua n exte nds JFrame impleme nts Actio nListe ner { }//jisuan
是初始化界面,以及响应用户的操作。
jisuan是个内部类,功能是进行进制的转换。
import java.awt.*; import java.awt.event.*; import javax.swi ng.*;
这三项是系统初始时需要引入的主类以达到完成界面的目的。
3 . 5代码实现:
1、引入主类:
import java.awt.*; import java.awt.event.*; import javax.swi ng.*; public class jisuan
extends JFrame implements ActionListener {
2、实现计算器界面的关闭与扩展
private static final long serialVersio nUID = -169068472193786457L; private class WindowCloser extends WindowAdapter {
public void windowClosing(WindowEvent we) {System. }
\"5\" \"0\"
int i ;
private final \"1 \"2\" \"3
II
exit (0);}
\"6\"
String[]
II II
II II
3、建立按键并为每个按键赋予相应的字符
JButton[]
buttons = new JButton[
str = { \"7\" , \"8\" , \"9\" , \"/\"
\"+
}; \"
I! __ I!
\"4\"
str . length ];
JTextField display new JTextField( \"0\");
4、设计计算器界面
public jisua n()
{ super (\"jisuan\" ); JPa nel pan el1 = new JPa nel( new GridLayout(4, 4));
i < str . length ; i ++) {
for ( i = 0;
JButton reset = new JButton( \"CE\");
new buttons [ i ]=
JButt panel1.add( buttons [ i ]);
}
JPa nel pan el2 =
str [ i ]);
new JPa nel( new BorderLayout());
pan el2.add( \"Ce nter\" , display ); panel2.add( \"East\" , reset ); getC onten tPa ne().setLayout( getCo nten tPa ne().add( getCo nten tPa ne().add(
new BorderLayout());
\"North\" , pan el2); \"Cen ter\" , pan el1);
5、为各个按键及显示框添加事件监听
for ( i = 0; i < str . length ; i ++)
buttons [ i ].addActionListener( // Add liste ner for \"reset\" butt on. reset .addActionListener( display .addActionListener(
this );
this );
// Add liste ner for \"display\" butt on.
this );
// The \"close\" button \"X\".
addWi ndowListe ner( new Win dowCloser());
//In itialize the win dow size. setSize(800, 800); // Show the wi ndow.
// show(); Usi ng show() while JDK vers ion is below 1.5. setVisible( true ); // Fit the certa in size. pack(); }
6实现各个功能函数的调度
public void action Performed(Act ion Eve nt e) {
Object target = e.getSource();
Stri ng label = e.getAct ion Comma nd(); if (target == reset )
han dleReset(); else if (\"0123456789.\"
.indexOf(label) > 0)
han dleNumber(label); else
han dleOperator(label);
}
boolea n isFirstDigit
=true
public void handleNumber(String key) { if ( isFirstDigit )
display .setText(key); else if ((key.equals(
\".\"))
&& (display .getText().i ndexOf(
0))
display .setText( display .getText() +
\".\");
else if (!key.equals(
\".\"))
display .setText( .getText() + key);
display isFirstDigit = false ; }
7、 重置功能的实现
public void handleReset() { display .setText( \"0\"); isFirstDigit = true ; operator =\"=\"; }
double nu mber = 0.0; String operator =\"=\";
8、 运算功能的实现
public void handleOperator(String key) { if ( operator .equals( \"+\"))
\".\")<
nu mber += Double valueOf (display .getText()); else if ( operator . equals(\"-\" ))
nu mber -= Double. valueOf (display .getText());
else if ( operator . equals( \"*\" ))
nu mber *= Double. valueOf (display .getText());
else if ( operator . equals( \"/\" ))
number /= Double. valueOf (display .getText());
else if ( operator .
(number)); operator = key; isFirstDigit = true ; }
equals(\"=\" ))
number = Double. valueOf ( display .getText()); display .setText(String. valueOf
public static void main( Stri ng[] args) { new jisua n(); } }
3 . 5设计结果与分析
1、运行的初始界面
2、数字计算演示
以计算(789+45) *23=19182为例,计算过程如下:
输入789
与45相加所得结果
输入23并相乘
得到最终结果
点击CE清零
最后得到的结果为19182,结果正确,计算器的各个功能均得以实现
4.设计心得与总结
通过此次的课程设计实践,我们不但进一步理解掌握了课上老师教授的知 识,而且通过查找资料学会了课上没有的东西,进一步理解了面向对象的含义, 发现了很多它比面向过程突出的地方,第一次接触了图形界面,初步了解了 GUI 方面的知识。在实践中我们遇到了很多问题,但我们都努力克服,并最终成功的 完成了这次课程设计。
通过编写这个相对复杂的程序,我们认识解决实际问题前应先建立模型, 再 通过建立的模型使问题简单化,从而解决问题。并且这次编写的程序大部分是通 过调用各包中的方法来实现的,这也让我们充分理解了包和类的调用关系。由于 这次编写的程序比较复杂,所以不能一次性编写、调试,也由此让我们学会把程 序分块,逐个编写、调试。
参考文献:
[2]叶乃文,王丹.面向对象程序设计 [2 ]邱桃荣,陈轶,冯缨.
2006.
[2]於东军,杨静宇,李千目,王国全.
[M].清华大学出版社,2009.
JAVA程序设计与应用开发[M].清华大学出版社,
JAVA语言程序设计教程[M].机械工业出版社,2009.
附录:
计算器的完整实现代码:
import java.awt.*; import java.awt.event.*; import javax.swi ng.*; public class jisuan
extends JFrame implements ActionListener {
= -169068472193786457L;
private static final long serialVersio nUID private class WindowCloser
} } int i ; private \"1
II
extends WindowAdapter {
public void windowClosing(WindowEvent we) { System. exit (0);
final Stri ng[]
II
II II
str = { \"7\" , \"8\" , \"9\" , \"/\"
II II
I! __ I!
\"4\"
\"5\" \"6\"
\"0\" \"2 \"3\"
// Strings for Digit & Operator butt ons. // Build butto ns.
JButto n[] butt ons =new JButt on[ // For can cel or reset.
JButton reset = new JButton( \"CE\"); // Build the text field to show the result. JTextField display = new JTextField( \"0\"); public jisua n() {
super (\"jisuan\" ); // Add a pan el. JPa nel pan el1 =
\"+\" };
str . length ];
new JPa nel( new GridLayout(4, 4));
// pan el1.setLayout( new GridLayout(4,4));
for ( i = 0; i < str . length ; i ++) { buttons [ i ] = new JButton( str [ i ]);
panel1.add( buttons [ i ]); }
JPa nel pan el2 =
new JPa nel( new BorderLayout());
// pan el2.setLayout (new BorderLayout()); pan el2.add( \"Ce nter\" , display ); panel2.add( \"East\" , reset ); // JPa nel pan el3 = new Pan el(); getC onten tPa ne().setLayout( getCo nten tPa ne().add(
new BorderLayout());
\"North\" , pan el2);
getCo nten tPa ne().add( \"Cen ter\" , pan el1);
// Add action liste ner for each digit & operator butt on. for ( i = 0; i < str . length ; i ++)
buttons [ i ].addActionListener( this );
// Add liste ner for \"reset\" butt on. reset .addActionListener( this ); // Add liste ner for \"display\" butt on.
display .addActionListener( this );
// The \"close\" button \"X\".
addWi ndowListe ner( new Win dowCloser()); //In itialize the win dow size. setSize(800, 800); // Show the wi ndow.
// show(); Usi ng show() while JDK vers ion is below 1.5. setVisible( true ); // Fit the certa in size. pack(); }
public void action Performed(Act ion Eve nt e) {
Object target = e.getSource();
Stri ng label = e.getAct ion Comma nd(); if (target == reset ) han dleReset();
else if (\"0123456789.\" .indexOf(label) > 0) han dleNumber(label); else
han dleOperator(label);
}
// Is the first digit pressed? boolea n isFirstDigit = true
public void handleNumber(String key) { if ( isFirstDigit )
display .setText(key);
else if ((key.equals( \".\"))
&& (display .getText().i ndexOf(
0))
display .setText( display .getText() + \".\");
else if (!key.equals( \".\"))
display .setText( display .getText() + key);
isFirstDigit = false J
public void handleReset() { display .setText( \"0\"); isFirstDigit = true ; operator =\"=\";
}
double nu mber = 0.0; String
operator =\"=\";
public void handleOperator(String key) { if ( operator .equals( \"+\"))
\".\")<
nu mber += Double valueOf (display .getText()); else if ( operator . equals(\"-\" ))
nu mber -= Double. valueOf (display .getText());
else if ( operator . equals( \"*\" ))
nu mber *= Double. valueOf (display .getText());
else if ( operator . equals( \"/\" ))
number /= Double. valueOf (display .getText());
else if ( operator . equals(\"=\" ))
number = Double. valueOf ( display .getText()); display .setText(String. valueOf (number)); operator = key; isFirstDigit = true ; }
public static void main( Stri ng[] args) { new jisua n(); }
}
因篇幅问题不能全部显示,请点此查看更多更全内容