关于计算器的Java课程设计总结报告.docx
关于计算器的Java课程设计总结报告 Java课程设计总结报告 学生学号姓名 专业班级 所属学期20 15 -20 16 学年第 2 学期 一、课程设计总结报告 (注:内容请参考教材:Java应用开发与实践,人民邮电出版社,刘乃琦,苏畅主编此书中第20章或21章或22章课程设计报告的写法。) 计算器需求分析 1.系统目标 一个具有连算功能的计算器程序。用户可以利用鼠标点击数值或操作符按键完成计算的输入,上面一个文本框显示计算过程,下面一个文本框显示输入的数字。当按下运算符号时,如果前面已经按下过运算符号,上面一个文本框显示按过的所有按钮,下面一个文本框显示上一个运算符号以及两个数之间的运算结果。 2.主体功能 a.按下数字键在文本框上会显示数字,这是计算器最基本的功能。 b.按下数字键加上“+-*/%”加上数字键进行加、减、乘、除、求余计算。 c.按下“+-”键,计算器下一个文本框上的数字置反。 d.按下“sqrt”键,计算器下一个文本框上的数字进行开根号运算。 e.按下“1/x”键,计算器下一个文本框上的数字进行求倒数运算 f.按下清除“C”键,上下文本框上的数据被全部清除,按下清除“CE”键,下面一个文本框上的数据被全部清除,按下清除“backspace”键,下面一个文本框上的数据被清除一位 g.按下一个数字按钮加上“MS”,就将此数据保存,同时做下“M”记号;按下“MR”,就读取此数据在下一个文本框中;按下“MC”,就清除数据;按下“M+”,就将当前文本框的数据加上储存的数据。 计算器总体设计 1.系统功能模块划分 a主界面模块 b方法模块 c事件相应模块 2.系统功能图 计算器详细设计 1.设置窗体为calculator 继承JFrame 类和 ActionListener 接口,并实现public void actionPerformed(ActionEvent e) 方法 public void actionPerformed(ActionEvent e) Object t = e.getSource();/用来获取事件对象 if (t=fuzhi) copycontent=text.getText(); / 例如事件对象为fuzhi 就发生如上操作,以此类推 / 2.设置程序的主框架 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); setBounds(100, 100, 450, 300); setTitle("计算器"); this .setResizable(false ); contentPane =getContentPane();/获得内容面板 contentPane .setLayout(new BorderLayout(0, 0);/设为边界布局 panel1 = new JPanel(); contentPane .add(panel1, BorderLayout.NORTH ); panel1.setLayout(new GridLayout(0, 1, 0, 0);/设为网格布局,一列多行 text1 = new JTextField(); text1.setHorizontalAlignment(SwingConstants.RIGHT );/右对齐 text1.setEditable(false );/不可编辑 计算器 标题栏 菜单栏 文本框 按键 标题:计算器 编辑 查看 帮助 text1 text 复制 粘贴 标准型 作者 关于 1-9、+/-、.、M 、CE 、C 、+、-、*、/、sqrt 、%、 1/x 、=、MC 、MR 、MS 、M+ panel1.add(text1); text1.setColumns(10);/设为10列 text = new JTextField(); text.setHorizontalAlignment(SwingConstants.RIGHT);/右对齐 text.setEditable(false);/不可编辑 panel1.add(text); text.setColumns(10);/设为10列 JPanel panel2 = new JPanel(); contentPane.add(panel2);/默认为contentPane的中间 panel2.setLayout(new BorderLayout(0, 0); JPanel p1 = new JPanel(); FlowLayout fl_p1 = (FlowLayout) p1.getLayout();/设为流水布局 fl_p1.setHgap(60);/列距为60 panel2.add(p1, BorderLayout.NORTH); JPanel p2 = new JPanel(); panel2.add(p2, BorderLayout.WEST); p2.setLayout(new GridLayout(0, 1, 5, 5); JPanel p3 = new JPanel(); panel2.add(p3, BorderLayout.CENTER); p3.setLayout(new GridLayout(0, 5, 5, 5); 3.设置main方法 public static void main(String args) try calculator frame = new calculator(); frame.setVisible(true); catch (Exception e) e.printStackTrace(); 4.设置数字按键并添加事件监控器及其响应代码 boolean clear = true;/ 是否点击符号+-*/=%sqrt+/-1/x,如果点击了就为false,按下数字时就去除text中的数据 boolean isResult = false;/ 是否有计算结果,有结果就为true,就不能使用退格键 int a = 0;/ 是否按了+-*/%,按了之后没按数字而是再按这些就不会执行接下来按得按键 num1 = new JButton("1");/设置数字按键"1" num1.addActionListener(this);/为"1"添加事件监控器 if(t=num1) if(clear=false) text.setText("");/设置文本框为空 text.setText(text.getText()+"1");/再将"1"写进文本框 clear=true;/表示此时可以继续输入数字 isResult=false;/此时不为计算结果,因此设isResult为false a=0;/此时没有按+-*/%,因此设a为0 /"1"的响应代码 / 其它数字按键都以此类推 / 5.设置小数点并添加事件监控器及其响应代码 boolean click = true;/ 是否点击了“.” dian = new JButton(".");/设置小数点 dian.addActionListener(this);/添加事件监控器 if(t=dian) click=true; for(int i=0;i<text.getText().length();i+) if(text.getText().charAt(i)='.') click=false;/已经存在".",就设click为false break; /若text中已经存在".",则不再输入点"." if(click=true)/click为true,表示text中尚未存在"." if(Integer.parseInt(text.getText()=0) text.setText("0.");/增加容错性,就算按了一个以上0,按了点之后还是会变回"0." else text.setText(text.getText()+".");/text中的值不为0,则直接在后面加上"." isResult=false;/此时不为计算结果,因此设isResult为false /"."的响应代码 6.设置正负号并添加事件监控器及其响应代码 zhengfuhao = new JButton("+/-");/设置正负号 zhengfuhao.addActionListener(this);/添加事件监控器 if(t=zhengfuhao) if(Double.parseDouble(text.getText()!=0) text.setText(-Double.parseDouble(text.getText()+""); /只要text中的值不为0,就直接取它的相反数 clear=false;/表示按了"+/-"再按数字键就会覆盖当前text中的内容 /"+/-"的响应代码 7.设置开根号并添加事件监控器及其响应代码 sqrt = new JButton("sqrt");/设置开根号 sqrt.addActionListener(this);/添加事件监控器 if(t=sqrt) first=Double.parseDouble(text.getText(); if(first<0) text.setText("负数不能开根号"); /不能进行"sqrt"运算,并输出"负数不能开根号" else text1.setText("sqrt("+first+")");/在text1上输出例如:sqrt(5) text.setText(String.valueOf(Math.sqrt(first);/输出结果 clear=false;/表示按了"sqrt"之后再按数字键就会覆盖当前text中的内容 isResult=true;/此时为计算结果,因此设isResult为true /"sqrt"的响应代码 8.设置倒数并添加事件监控器及其响应代码 yichux = new JButton("1/x");/设置倒数 yichux.addActionListener(this);/添加事件监控器 if(t=yichux) first=Double.parseDouble(text.getText(); if(first=0) text.setText("除数不能为零");/不能进行"1/x"运算,并输出"除数不能为零" else text1.setText("1/"+first);/在text1上输出例如:1/5 text.setText(""+1/first);/输出结果 clear=false;/表示按了"1/x"之后再按数字键就会覆盖当前text中的内容 isResult=true;/此时为计算结果,因此设isResult为true /倒数的响应代码 9.设置+-*/%并添加事件监控器及其响应代码 int a = 0;/ 是否按了+-*/%,按了之后没按数字而是再按这些就不会执行接下来按得按键 String fuhao;/ 记住按了什么符号,有+-*/% String x1 = null, x2 = null;/ 记忆输入的符号+-*/% jia = new JButton("+");/设置"+" jia.setForeground(Color.RED);/ 将字体改为红色 jia.addActionListener(this);/添加事件监控器 jian = new JButton("-"); jian.setForeground(Color.RED);/将字体改为红色 jian.addActionListener(this); cheng = new JButton("*"); cheng.setForeground(Color.RED);/将字体改为红色 cheng.addActionListener(this); chu = new JButton("/"); chu.setForeground(Color.RED);/将字体改为红色 chu.addActionListener(this); dengyu = new JButton("="); dengyu.addActionListener(this); qiuyu = new JButton("%"); qiuyu.addActionListener(this); public void f()/运算公式,将结果在text中显示出来 if(x1.equals("+") first=first+second; text.setText(first+""); if(x1.equals("-") first=first-second; text.setText(first+""); if(x1.equals("*") first=first*second; text.setText(first+""); if(x1.equals("/") if(second=0) text.setText("除数不能为零"); /如果除数为0就输出"除数不能为零" text1.setText("");/将text1清空 else first=first/second; text.setText(first+""); if(x1.equals("%") int q=(int)(first/second) ; first=first-(second*q) ;/操作数中有浮点数 text.setText(first+""); if(a=0)/如果前一个是+-*/%=,再按这个按钮就无效 if(t=jia) a+;/计数,a若大于等于1就不会进入if(a=0) fuhao="+"/在按"="时使用 x1=x2; x2="+" /为了记住最后两个符号 if(x1=null&&x2!=null)/如果只有一个符号 first=Double.parseDouble(text.getText();/就将当前文本框的值给first text1.setText(first+x2);/并且将数字和符号一起显示在text1上 if(x1!=null&&x2!=null)/如果有两个以上及符号 isResult=true;/此时为计算结果,因此设isResult为true second=Double.parseDouble(text.getText(); text1.setText(text1.getText()+second+x2);/只要按下符号就会将符号与数字一同显示在text1上 f();/调用f() clear=false;/表示按了"+"之后再按数字键就会覆盖当前text中的内容 / 这之间的"-"、"*"、"/"、"%"都以此类推 / if(t=dengyu) a+;/计数,a若大于等于1就不会进入if(a=0) text1.setText("");/将text1清空 x1=x2=null;/将x1,x2重置为空 isResult=true;/此时为计算结果,因此设isResult为true second=Double.parseDouble(text.getText(); switch(fuhao)/进行运算 case"+": text.setText(first+second+""); break; case"-": text.setText(first-second+""); break; case"*": text.setText(first*second+""); break; case"/": if(second=0) text.setText("除数不能为零"); else text.setText(first/second+""); break; case"%": int q=(int)(first/second) ; text.setText(String.valueOf(first-(second*q) );/操作数中有浮点数 break; clear=false;/按下数字按键时要清空前一次的数据 a=0;/为了按等于号之后可以按+-之类的符号,例如2+3=+2 fuhao=null;/不管同时按下几个=都为原来的结果 10.设置计算器的存储计算功能按键并添加事件监控器及其响应代码 boolean m = false;/ 若m为true则M显示 MC = new JButton("MC");/设置MC MC.setForeground(Color.RED); /将字体变为红色 MC.addActionListener(this); MR = new JButton("MR"); MR.setForeground(Color.RED);/将字体变为红色 MR.addActionListener(this); MS = new JButton("MS"); MS.setForeground(Color.RED);/将字体变为红色 MS.addActionListener(this); M1 = new JButton("M+"); M1.setForeground(Color.RED);/将字体变为红色 M1.addActionListener(this); M = new JButton(""); url1=this.getClass().getResource("/M.jpg"); url2=this.getClass().getResource("/kongbai.jpg"); M.setIcon(new ImageIcon(url2);/默认布局为kongbai.jpg M.addActionListener(this); if(t=MS)/保存需要存储的数据 save=Double.parseDouble(text.getText();/将要存储的数据存入save m=true;/有“M”标志出现,表示有数据被计算器存储的标志 clear=false; if(t=MR) if(m=true)/读出存储的数据 text1.setText(""); text.setText(""+save); clear=false; if(t=MC)/删除存储的数据 m=false;/没有“M”标志出现 clear=false; if(m=false) M.setIcon(new ImageIcon(url2);/显示图片kongbai.jpg if(m=true) M.setIcon(new ImageIcon(url1); /显示图片M.jpg if(t=M1) if(m=true)/将当前text中的数据和存储的数据相加 text1.setText(text1.getText()+"+"+save); text.setText(Double.parseDouble(text.getText()+save+""); 11.设置计算器的删除功能按键并添加事件监控器及其响应代码 backspace = new JButton("");/设置退格键 backspace.setForeground(Color.RED);/将字体变为红色 backspace.addActionListener(this); ce = new JButton("CE"); ce.setForeground(Color.RED);/将字体变为红色 ce.addActionListener(this); c = new JButton("C"); c.setForeground(Color.RED);/将字体变为红色 c.addActionListener(this); if(t=backspace) if(isResult=false)/退格,清除一个数字 String s=text.getText(); text.setText(""); for(int i=0;i<s.length()-1;i+) char s1=s.charAt(i); text.setText(text.getText()+s1); /退格,例如:143变为14 if(t=c)/清除全部数据 text1.setText(""); text.setText(""); x1=x2=null; fuhao="" if(t=ce)/清除text中的数据 text.setText(""); 12.设置菜单栏并添加事件监控器及其响应代码 String copycontent = ""/ 复制内容 JMenuBar menuBar = new JMenuBar();/ 设置JMenuBar setJMenuBar(menuBar); JMenu bianji = new JMenu("编辑"); menuBar.add(bianji); fuzhi = new JMenuItem("复制"); KeyStroke copyks=KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.CTRL_MASK); fuzhi.setAccelerator(copyks);/设置退出菜单选项加上快捷键 bianji.add(fuzhi); fuzhi.addActionListener(this);/事件监控器 zhantie = new JMenuItem("粘贴"); KeyStroke pasteks=KeyStroke.getKeyStroke(KeyEvent.VK_V,Event.CTRL_MASK); zhantie.setAccelerator(pasteks);/设置退出菜单选项加上快捷键 bianji.add(zhantie); zhantie.addActionListener(this);/事件监控器 JMenu chakan = new JMenu("查看"); menuBar.add(chakan); JRadioButtonMenuItem biaozhunx = new JRadioButtonMenuItem("标准型"); chakan.add(biaozhunx); chakan.addActionListener(this);/事件监控器 JMenu bangzhu = new JMenu("帮助"); menuBar.add(bangzhu); about = new JMenuItem("关于"); bangzhu.add(about); about.addActionListener(this);/事件监控器 me = new JMenuItem("作者"); bangzhu.add(me); me.addActionListener(this);/事件监控器 if(t=fuzhi)