华东交通大学理工学院课程设计报告书( 2010-- 2011年度第 2 学期)所属课程名称 Java面向对象程序设计题目设计一个多功能计算器分院电信分院专业班级 09信管<1>班学号 20090210450106 蔡炜指导教师黄建华2011年06月23日华东交通大学理工学院课程设计(论文)任务书专业09信管班级 <1>班姓名蔡炜一、课程设计(论文)题目设计一个多功能计算器二、课程设计(论文)工作:自 2011 年06 月 13日起至2011年 06 月 23日止。
三、课程设计(论文)的内容要求:本应用程序继承自框架类(JFrame),此程序使用Frame布局管理器BorderLayout,将单行文本框加入到“North”区域,包含各种按钮的面板Panel p加入到”Center”区域。
包含各种按钮的面板Panel p 采用4行5列的网格布局,然后将数字按钮和运算符按钮以及控制按钮添加到面板中。
同时注册按钮事件监听器。
如:Button b=new Button(); b.addActionListener(事件监听器);事件监听器中的事件处理方法void actionPerformed(ActionEvent evt)完成主要的按钮事件的处理。
事件处理分以下几种情况:数字按钮事件(”0”,”1”,”2”…”8”,”9”)、运算符按钮事件(”+”,”-“,”*”,”/”,”%”)、正负号按钮事件(”+/-“)、小数点按钮事件(”.”)、等号按钮事件(”=”)、求倒按钮事件(”1/x”)、清零按钮事件(“C”)。
在事件处理触发按钮事件时,要进一步分析,是重新开始计算时触发的按钮事件还是计算中间触发的按钮事件。
计算器完成的是一个数学表达式,如:3+2,所以可以采用一个链表(LinkedList类)来存储数字或字符,如3,+,2分别存储在链表中,最后运算时,可以一一取出来进行运算。
学生签名: ( )2011 年06 月 23 日课程设计(论文)评阅意见评阅人职称20 年月日目录第1章课程设计(论文)任务书 (2)第2章程序设计目的 (5)第3章程序实现思路 (6)第4章程序清单或正文 (7)第5章调试与测试 (16)第6章课程设计心得 (17)第7章参考文献 (18)第2章程序设计目的1. 充分的将课本知识与实际应用相结合,做到理论联系实际,融会贯通所学知识。
2. 提高自身的实践能力,为以后做相关编程工作提供经验。
3. 通过对面向对象语言程序代码的阅读、修改、设计,理解和掌握复杂的面向对象如Java语言应用程序的编程,提高实践编程的能力。
4. 能够利用已有资源加工处理处好的程序设计,加强一定的综合处理能力。
5. 通过这次课设让我们更加理解编程工作是多么精细的工作,所以我们要保持良好的程序设计风格,以及学会面向对象程序设计的基本思想。
第3章程序实现思路本程序首先创建了四个面板,每一个都有自己的相关按钮,按照各自的布局方式排列初步形成了一个计算器的图形模板,然后通过注册事件监听器即实现事件处理来完成整个程序流程图第4章程序清单或正文import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;import java.text.DecimalFormat;class Calucator extends JFrame {private JTextField tfResult;private JPanel panel1, panel2, panel3, panel4;private JMenuBar myBar;private JMenu menu1, menu2, menu3;private JMenuItem editItem1, editItem2, editItem3,help1, help2, help3; private JRadioButtonMenuItem seeItem1, seeItem2;private JCheckBoxMenuItem seeItem3;private ButtonGroup bgb;private String back;private boolean IfResult = true, falg = false;private String oper = "=";private double result = 0;private Num numActionListener;private DecimalFormat df;boolean isNew=true;public Calucator(){super("计算器");df = new DecimalFormat("0.#######");this.setLayout(new BorderLayout(10, 5));panel1 = new JPanel(new GridLayout());panel2 = new JPanel(new GridLayout(4, 5, 5, 5));panel3 = new JPanel(new GridLayout(5, 1, 5, 5));panel4 = new JPanel(new BorderLayout(5, 5));myBar = new JMenuBar();menu1 = new JMenu("编辑");menu2 = new JMenu("查看");menu3 = new JMenu("帮助");menu1.setFont(new Font("宋体", Font.PLAIN, 12));menu2.setFont(new Font("宋体", Font.PLAIN, 12));menu3.setFont(new Font("宋体", Font.PLAIN, 12)); editItem1 = new JMenuItem("复制");editItem2=new JMenuItem("粘贴"/);editItem3=new JMenuItem( "退出");// 设置退出菜单项editItem3.addActionListener(new ActionListener() {public void actionPerformed( ActionEvent event ){System.exit( 0 );}} );seeItem1 = new JRadioButtonMenuItem("科学型"); seeItem2 = new JRadioButtonMenuItem("标准型"); seeItem3 = new JCheckBoxMenuItem("数字分组");help1 = new JMenuItem("帮助主题");help2 = new JMenuItem("关于计算器(A)");bgb = new ButtonGroup();//做出来的效果图如下menu1.add(editItem1);menu1.addSeparator();//添加分隔线menu1.add(editItem2);menu1.addSeparator();//添加分隔线menu1.add(editItem3);menu2.add(seeItem1);menu2.addSeparator();//添加分隔线menu2.add(seeItem2);menu2.addSeparator();//添加分隔线menu2.add(seeItem3);menu3.add(help1);menu3.addSeparator();//添加分隔线menu3.add(help2);//添加菜单到菜单条myBar.add(menu1);myBar.add(menu2);myBar.add(menu3);this.setJMenuBar(myBar);numActionListener = new Num();tfResult = new JTextField();tfResult.setEditable(false);//文本域不可编辑tfResult.setBackground(Color.white);//文本域tfResult.setHorizontalAlignment(JTextField.RIGHT); tfResult.setText("0");tfResult.setBorder(BorderFactory.createLoweredBevelBorder()); init();}private void init(){addButton(panel1, "CE", new Clear(), Color.red);addButton(panel2, "7", numActionListener, Color.blue); addButton(panel2, "8", numActionListener, Color.blue); addButton(panel2, "9", numActionListener, Color.blue); addButton(panel2, "/", new Signs(), Color.red);addButton(panel2, "sqrt", new Signs(), Color.blue);addButton(panel2, "4", numActionListener, Color.blue); addButton(panel2, "5", numActionListener, Color.blue);addButton(panel2, "6", numActionListener, Color.blue); addButton(panel2, "*", new Signs(), Color.red);addButton(panel2, "%", new Signs(), Color.blue); addButton(panel2, "1", numActionListener, Color.blue); addButton(panel2, "2", numActionListener, Color.blue); addButton(panel2, "3", numActionListener, Color.blue); addButton(panel2, "-", new Signs(), Color.red);addButton(panel2, "1/x", new Signs(), Color.blue); addButton(panel2, "0", numActionListener, Color.blue); addButton(panel2, "-/+", new Clear(), Color.blue); addButton(panel2, ".", new Dot(), Color.blue);addButton(panel2, "+", new Signs(), Color.red);addButton(panel2, "=", new Signs(), Color.red);JButton btns = new JButton("calucator");btns.setBorder(BorderFactory.createLoweredBevelBorder()); btns.setEnabled(false);btns.setPreferredSize(new Dimension(20, 20));//添加面板3panel3.add(btns);addButton(panel3, "sin", new Signs(), Color.red); addButton(panel3, "cos", new Signs(), Color.red); addButton(panel3, "tan", new Signs(), Color.red); addButton(panel3, "π", new Signs(), Color.red);panel4.add(panel1, BorderLayout.NORTH);panel4.add(panel2, BorderLayout.CENTER);this.add(tfResult, BorderLayout.NORTH);this.add(panel3, BorderLayout.WEST);this.add(panel4);pack();this.setResizable(false);this.setLocation(300, 200);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }//加入按钮并注册监听者private void addButton(JPanel panel, String name, ActionListener action, Color color){JButton bt = new JButton(name);panel.add(bt);bt.setForeground(color);bt.addActionListener(action);}//主方法public static void main(String[] args) {new Calucator().setVisible(true);}//获取结果显示在文本域private void getResult (double x){System.out.println("result"+result+" "+"x"+x);if(oper == "+"){result += x;}else if(oper == "-"){result -= x;}else if(oper == "*"){result *= x;}else if(oper == "/"){result /= x;}else if(oper == "="){result = x;}System.out.println("result"+result+" "+"x"+x);tfResult.setText(df.format(result));System.out.println(df.format(result));}//定义各种符号的类及相应触发后的处理代码class Signs implements ActionListener{public void actionPerformed(ActionEvent e) {String str = e.getActionCommand();if(str.equals("sqrt")){double i = Double.parseDouble(tfResult.getText());if(i>0){tfResult.setText(String.valueOf(df.format(Math.sqrt(i))));}else{tfResult.setText("负数不能开平方根");}}else if(str.equals("%")){tfResult.setText(df.format(Double.parseDouble(tfResult.getText()) / 100));//计算%}else if(str.equals("1/x")){if(Double.parseDouble(tfResult.getText()) == 0){tfResult.setText("除数不能为零");}else{tfResult.setText(df.format(1 / Double.parseDouble(tfResult.getText())));//计算1/x}}else{if(falg){IfResult = false;}if(IfResult){oper = str;System.out.println(oper);}else{getResult(Double.parseDouble(tfResult.getText()));oper = str;IfResult = true;}if(str.equals("π")){tfResult.setText(""+Math.PI);/*isNew=true;*/}//定义三角函数运算if(str.equals("sin")){//sin函数String showstr=tfResult.getText();if(showstr.equals(""))return;double ishow=0;try{ishow=Double.parseDouble(showstr);}catch(NumberFormatException ee){System.out.println("输入数据不合法!");tfResult.setText("输入数据不合法,请重新输入");isNew=true;return;}double rd=Math.sin(ishow*Math.PI/180); //转换为弧度进行计算int ri=(int)rd;if(ri==rd)tfResult.setText(""+ri);elsetfResult.setText(""+rd);isNew=true;}//cos函数else if(str.equals("cos")){String showstr=tfResult.getText();if(showstr.equals(""))return;double ishow=0;try{ishow=Double.parseDouble(showstr);}catch(NumberFormatException ee){System.out.println("输入数据不合法!");tfResult.setText("输入数据不合法,请重新输入");isNew=true;return;}double rd=Math.cos(ishow*Math.PI/180);int ri=(int)rd;if(ri==rd)tfResult.setText(""+ri);elsetfResult.setText(""+rd);isNew=true;}//tan函数else if(str.equals("tan")){String showstr=tfResult.getText();if(showstr.equals(""))return;double ishow=0;try{ishow=Double.parseDouble(showstr);}catch(NumberFormatException ee){System.out.println("输入数据不合法!");tfResult.setText("输入数据不合法,请重新输入");isNew=true;return;}double rd=Math.tan(ishow*Math.PI/180);int ri=(int)rd;if(ri==rd)tfResult.setText(""+ri);elsetfResult.setText(""+rd);isNew=true;}}}}//定义清零类class Clear implements ActionListener{public void actionPerformed(ActionEvent e) {String str = e.getActionCommand();if(str == "CE"){tfResult.setText("0");IfResult = true;result = 0;}else if(str == "-/+"){double i = 0 - Double.parseDouble(tfResult.getText().trim());tfResult.setText(df.format(i));}}}}//实现数字按钮功能class Num implements ActionListener{public void actionPerformed(ActionEvent e) {String srt = e.getActionCommand();if(IfResult){tfResult.setText("");IfResult = false;}//trim()是去除字符串开头和末尾的空格或其他字符tfResult.setText(tfResult.getText().trim() + srt); if(tfResult.getText().equals("0")){tfResult.setText("0");IfResult = true;falg = true;}}}//实现数据加上小数点class Dot implements ActionListener{public void actionPerformed(ActionEvent e) {IfResult = false;if(tfResult.getText().trim().indexOf(".") == -1){tfResult.setText(tfResult.getText() + ".");}}}}第5章调试与测试调试的方式主要是输入特定的数据然后触发相应的事件,运行计算器查看运行后的结果若是合理的就说明是正确的,主要测试四则运算,三角函数的运算,以及开根号的运算。