Java程序课程设计报告基于Java的计算器的设计与开发 .doc
2009级Java程序课程设计报告报告题目:基于Java的计算器的设计与开发学 院 : 专 业 : 计算机科学与技术 班 级 : 学 号 : 学生姓名 : 指导教师 : 二一一年 一 月Java程序课程设计任务书一、 主要任务与目标 1. 掌握java语言2. 创建一个简单的计算器,具有简单人机交互界面,易于操作,便于进行数据之间的简单运算。 二、具体要求(包括技术要求等):1)能够实现基本的加、减、乘、除四则运算及开方,乘方运算;2)如输入数据时,出现错误,可以修改; 3)运算结果能正确显示;可以清零;4)拥有登陆注册功能;5)可以查看历史记录;学习并掌握以下技术:Java、awt,swing等熟练使用以下开发工具:Jdk,JCreate 等实现计算器的上述的功能。三、计划进度112月28日12月29日:搜集资料、查阅文献,确定选题212月30日-12月31日:需求分析,系统设计,系统功能模块完善31月1日-1月3日:编程实现系统、系统测试与修改41月4日- 1月6日:课程设计报告撰写51月 7日- 1月 8日:课程设计报告答辩四、主要参考文献1 耿祥义,张跃平.java大学实用教程(第二版).电子工业出版社.2008年5月学生(签字)2010年12月 28日 指导教师 2010年12月28 日目 录JAVA程序课程设计任务书II目 录III第1章 引言11.1 课程设计内容11.3 任务分工1第2章 计算器定义22.1 计算器登陆注册界面概述22.1.1 计算器功能概述22.1.2 计算结果的储存与查看功能概述22.2 本章小结2第3章 计算器的具体实现33.1界面设计33.1.1用户登陆界面图33.1.3 计算器主界面83.2计算功能实现93.4 本章小结14第4章 结束语14致谢15参考文献15附录 源代码15第1章 引言1.1 课程设计内容这是我组设计的计算器会有一些独特的功能,本项目用到了Java中的GUI界面和swing组件以及awt布局,所以简单易用,它能完成如下的几个功能:(1)数据计算处理功能 点击按钮中的数字键和运算符键就能进行简单的加、乘、乘、除四则运算及三角函数,开方,乘方运算 ;如果输入有误时可以按C撤销后重新输入新数据,有储存修改键;(2)查询功能 查询功能可以迅速方便地查找到相应时段的执行的操作及结果。(3)计算器使用权限功能对个人的操作实现口令。用户在使用计算器前需通过登录界面登录,以保护计算器的数据安全。未有登录资料的先进行注册。(4)时间显示功能 在计算器上显示现在的时间,便于把握时间;1.3 任务分工:职位组长,总监整个计算器设计制作过程,制定相应计划与分布任务,负责撰写任务书,报告书,登陆注册界面的设计,整体编码框架的设定;:负责报告书的排版,创建计算器主界面的编码,计算器;:负责数据计算功能的编码,实现,计算器主界面的设计;:负责注册登录界面的功能的编码,储存与查看功能的编码,计算器整体功能的编码的完善与调试;第2章 计算器定义2.1 计算器登陆注册界面概述这是对计算器使用权限功能的添加,这是以后软件开发的一个重点发展方向。用户在使用计算器前需通过登录界面登录,以保护计算器的数据安全和使用权限的设定。未有登录资料的必须先进行注册;2.1.1 计算器功能概述一个计算器如果只有数据计算处理功能,或者是点击按钮中的数字键和运算符键就能进行简单的加、乘、乘、除四则运算是远远不够的,这太普通了,因此加入三角函数,开方,乘方运算 ,并且如果输入有误时可以按C撤销后重新输入新数据,有储存修改键;最主要是加入了查询功能:查询功能可以迅速方便地查找到相应时段的执行的操作及结果。还有就是计算器使用权限的设定,即登陆注册界面,用户在使用计算器前需通过登录界面登录,以保护计算器的数据安全。未有登录资料的先进行注册。2.1.2 计算结果的储存与查看功能概述计算结果有了,但是一般的计算器不能查询之前进行的操作和结果,不得不重新计算,这就带来了不少麻烦,我组设计制作的计算器拥有直接查看历史记录的功能,还附有各个操作的时间,便于确认;2.2 本章小结这一章介绍了当前进销存管理系统应该具备的功能模块,并提供了市面上比较流行的进销存管理系统作为参考。在这一章中,我们可以了解什么是进销存管理系统,当前进销存管理系统的市场需求,还有一个进销存管理系统应该的开发目标。第3章 计算器的具体实现界面是系统之间最直接的交互界面,界面的友好性体现了软件设计的质量, 并在很大程度上决定了软件是否成功。3.1界面设计1.界面设计界面设计要求用GUI,界面设计中有用到swing组件的TextField和Button,用到awt中的BorderLayout和GridLayout布局管理方式。3.1.1用户登陆界面图如图3.1.1和3.1.2所示图3.1.1 用户登录模块框图图3.1.2 用户登录界面loginDialog与compareUserData函数的作用是用户登录界面创建和检测用户登的合法性,并确认用户输入了合法的登录名和口令。部分代码:private void loginDialog() login = new JDialog(); login.setTitle("登录"); login.setLayout(new FlowLayout(); login.add(new JLabel("用户名:"); final JTextField name = new JTextField(10); login.add(name); login.add(new JLabel("密 码:"); final JPasswordField password = new JPasswordField(10); password.setEchoChar('*'); login.add(password); JButton confirm = new JButton("登录"); confirm.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) if (compareUserData(name.getText().trim(), new String(password.getPassword() login.setVisible(false); f.setVisible(true); else JOptionPane.showMessageDialog(login, "用户名或密码错误!", "错误提示", JOptionPane.ERROR_MESSAGE); ); login.add(confirm); final JDialog regDialog = new JDialog(login, "注册", true); registerDialog(regDialog); JButton register = new JButton("注册"); register.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) regDialog.setVisible(true); ); login.add(register); login.setSize(200, 130); login.setResizable(false); login.setLocationRelativeTo(null); login.setVisible(true);private boolean compareUserData(String name, String password) try RandomAccessFile out = new RandomAccessFile("user.dat", "rw");String fname, fpassword = null;while (out.getFilePointer() < out.length() fname = out.readUTF();out.readUTF();fpassword = out.readUTF();if (fname.equals(name) && fpassword.equals(password) return true;out.close(); catch (IOException e) e.printStackTrace(); return false; 3.1.2 用户注册界面 如图3.1.3所示 图3.1.3 用户注册界面此registerDialog函数的作用就是注册界面的创建及信息的填写;部分代码:private void registerDialog(final JDialog regDialog) Box box1 = Box.createVerticalBox();box1.add(new JLabel("用户名:", JLabel.RIGHT);box1.add(Box.createVerticalStrut(10);box1.add(new JLabel("性别:", JLabel.RIGHT);box1.add(Box.createVerticalStrut(10);box1.add(new JLabel("密码:", JLabel.RIGHT), -1);box1.add(Box.createVerticalStrut(10);box1.add(new JLabel("确认密码:", JLabel.RIGHT);Box box2 = Box.createVerticalBox();final JTextField nameTextField = new JTextField(10);box2.add(nameTextField);box2.add(Box.createVerticalStrut(8);final CheckboxGroup cbg = new CheckboxGroup();Box box21 = Box.createHorizontalBox();final Checkbox cb1 = new Checkbox("男", cbg, true); box21.add(cb1); box21.add(new Checkbox("女", cbg, false); box2.add(box21);box2.add(Box.createVerticalStrut(8);final JPasswordField pass1 = new JPasswordField(10);box2.add(pass1);box2.add(Box.createVerticalStrut(8);final JPasswordField pass2 = new JPasswordField(10);box2.add(pass2);Box baseBox = Box.createHorizontalBox();baseBox.add(box1);baseBox.add(box2);regDialog.setLayout(new FlowLayout();regDialog.add(baseBox);JButton confirm = new JButton("确定");JButton cancel = new JButton("取消");regDialog.add(confirm);regDialog.add(cancel);regDialog.setSize(200, 200);regDialog.setResizable(false);regDialog.setLocationRelativeTo(null);confirm.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) String sex = null;if (cbg.getSelectedCheckbox() = cb1) sex = "男"else sex = "女"if (saveUserData(nameTextField.getText().trim(), sex, new String(pass1.getPassword(), new String(pass2.getPassword()regDialog.setVisible(false);elseJOptionPane.showMessageDialog(regDialog, "输入有误,请检查", "错误提示",JOptionPane.ERROR_MESSAGE););cancel.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) regDialog.setVisible(false);); 3.1.3 计算器主界面图5.2 计算器主界面为了能够在同一页面中管理多个页面,本系统的主界面采用了框架技术。3.2计算功能实现通过ActionEvent事件的处理进行计算功能的实现;部分代码: public void actionPerformed(ActionEvent e) String s = e.getActionCommand(); (省略) else if (s.equals("CE") /如果是CE则清除文本框 tResult.setText("0"); else if (s.equals("BackSpace") if(!tResult.getText().trim().equals("0") /如果文本框中有内容 StringBuffer temp = new StringBuffer(tResult.getText().trim(); if(temp.length() > 1) tResult.setText(temp.delete(temp.length()-1, temp.length().toString(); else tResult.setText("0"); else if (s.equals("C") /如果是C删除当前计算 tResult.setText("0"); tf.setText(""); num1.replace(0, num1.length(), "0"); num2.replace(0, num2.length(), "0"); isExist = false; operate = ' ' else if (s.equals("") tResult.setText("" + Math.PI); else if (s.equals("sin") String temp = tResult.getText().trim(); double dtemp = Math.PI / 180.0 * Double.parseDouble(temp); tResult.setText(""+Math.sin(dtemp); save("sin" + "(" + temp + ") = " + Math.sin(dtemp); else if (s.equals("cos") String temp = tResult.getText().trim(); double dtemp = Math.PI / 180.0 * Double.parseDouble(temp); tResult.setText(""+Math.cos(dtemp); save("cos" + "(" + temp + ") = " + Math.cos(dtemp); else if (s.equals("tan") String temp = tResult.getText().trim(); double dtemp = Math.PI / 180.0 * Double.parseDouble(temp); tResult.setText(""+Math.tan(dtemp); save("tan" + "(" + temp + ") = " + Math.tan(dtemp); else if (s.equals("log") String temp = tResult.getText().trim(); double dtemp = Double.parseDouble(temp); tResult.setText(""+Math.log10(dtemp); save("log" + "(" + temp + ") = " + Math.log(dtemp); else if (s.equals("MC") /如果是MC则清除缓冲区 String temp = "0" memory.replace(0, memory.length(), temp); bM.setText(" "); else if (s.equals("MR") /如果按键为MR则恢复缓冲区的数到文本框 tResult.setText(memory.toString(); else if (s.equals("MS") /如果按键为MS则将文本框的数存入缓冲区 String s1 = tResult.getText().trim(); memory.replace(0, memory.length(), s1); bM.setText("M"); else if (s.equals("M+") /如果按键为MS则将文本框值与缓冲区的数相加但不显示结果 String temp1 = tResult.getText().trim(); double dtemp = Double.parseDouble(temp1); String temp2 = memory.toString(); if (temp2.length() = 0) temp2 = "0" dtemp += Double.parseDouble(temp2); temp1 = String.valueOf(dtemp); memory.replace(0, memory.length(), temp1); bM.setText("M"); else if (s.equals("1/x") /如果按键为1/x则将文本框中的数据为它的倒数 String temp = tResult.getText().trim(); double dtemp = Double.parseDouble(temp); tResult.setText(""+1/dtemp); else if (s.equals("sqrt") /如果按键为sqrt则将文本框中的内容求平方根 String temp = tResult.getText().trim(); double dtemp = Double.parseDouble(temp); tResult.setText(""+Math.sqrt(dtemp); save("sqrt" + "(" + temp + ") = " + Math.sqrt(dtemp); else if (s.equals("x2") /如果按键为x2则将文本框中的内容求平方 String temp = tResult.getText().trim(); double dtemp = Double.parseDouble(temp) * Double.parseDouble(temp); tResult.setText(""+dtemp); save(temp + "2 = " + Math.sin(dtemp); else if (s.equals("+/-") String temp = tResult.getText().trim(); double dtemp = -Double.parseDouble(temp); if (dtemp != 0) tResult.setText(""+dtemp); else if (s.equals("+") | s.equals("-") | s.equals("*") | s.equals("/") /加减乘除按键求结果 if (operate = ' ') num1 = num1.replace(0, num1.length(), tResult.getText().trim(); isClear = true; tf.setText(num1.toString() + s); else if (!isExist) num2 = num2.replace(0, num2.length(), tResult.getText().trim(); String rlt = null; double a = Double.parseDouble(num1.toString().trim(); double b = Double.parseDouble(num2.toString().trim(); switch(operate) case '+': rlt = "" + (a + b); break; case '-': rlt = "" + (a - b); break; case '*': rlt = "" + (a * b); break; case '/': rlt = "" + (a / b); break; tResult.setText(rlt); tf.setText("" + num1.toString() + operate + num2.toString(); num1.replace(0, num1.length(), rlt); isClear = true; operate = s.charAt(0); else if (s.equals("=") /按键=显示结果 if (!isExist) num2 = num2.replace(0, num2.length(), tResult.getText().trim(); isExist = true; if (operate != ' ') String rlt = null; double a = Double.parseDouble(num1.toString().trim(); double b = Double.parseDouble(num2.toString().trim(); switch(operate) case '+': rlt = "" + (a + b); break; case '-': rlt = "" + (a - b); break; case '*': rlt = "" + (a * b); break; case '/': rlt = "" + (a / b); break; tResult.setText(rlt); /存入文件 save(" " + a + " " + operate + " " + b + " = " + rlt); tf.setText("" + num1.toString() + operate + num2.toString(); num1.replace(0, num1.length(), rlt); isClear = true; else if(s.equals(".") /单击“小数点”的处理 /当前结果中不存在"." if(tResult.getText().trim().indexOf('.') = -1) StringBuffer tmp = new StringBuffer(tResult.getText().trim(); tResult.setText(tmp.append(s).toString(); else /数字键的处理 if (!Character.isDigit(tResult.getText().charAt(0) tResult.setText(""); if (isClear) isClear = false; tResult.setText(""); if (isExist) isExist = false; tf.setText(""); operate = ' ' tResult.setText(""); StringBuffer tmp = new StringBuffer(tResult.getText().trim(); if (tmp.toString().equals("0") tmp.setLength(0); tResult.setText(tmp.append(s).toString(); /end actionPerformed3.3 计算结果的储存功能与查看功能1通过save函数来实现结果的储存功能;部分代码:private void save(String s) final SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss :");String time = sdf.format(new Date(System.currentTimeMillis(); try File file = new File("data.txt"); if (!file.exists() file.createNewFile(); char ch = new char(int)file.length(); FileReader in = new FileReader(file); in.read(ch); in.close(); FileWriter out = new FileWriter(file); String tmp = new String(ch); out.write(tmp.trim() + System.getProperty("line.separator"); out.write(time + s).trim() + System.getProperty("line.separator"); out.close(); catch(IOException e) e.printStackTrace(); 2通过“查看”选项中的“历史记录”来查看历史结果,此showRecord函数的作用就是把储存在data.txt中的历史记录显示在一面板中;部分代码如下: private void showRecord() JDialog dialog = new JDialog(f, "历史记录", true); JTextArea area = new JTextArea(); area.setEditable(false); dialog.add(new JScrollPane(area); dialog.setSize(640, 480); dia