资源描述
精选优质文档-倾情为你奉上Java课程设计报告计算器设计与实现 班级:信101学号: 姓名:杨 赛 指导老师:李红强引言Java不依赖平台的特点使它受到广泛的关注,Java已成为网络时代最重要的语言之一。Java具有平台无关性,面向对象,多线程,安全,动态等特点。Java语言和其他语言相比,最大的优势在于能够在所有的计算机上运行,这也是Java风靡全球的主要原因。Java的面向对象编程是一种先进的编程思想,可以更容易的解决复杂的问题。面向对象编程主要体现在以下三个方面:封装,继承,多态。因此Java不仅可以用来开发大型的桌面应用程序,而且特别适用于Internet的应用开发。目前,Java语言不仅是一门被广泛使用的编程语言,而且成为软件设计开发者应当掌握的一门基础语言。Java语言面向对象编程,并涉及网络,多线程等重要的基础知识。因为很多新的技术领域都涉及到Java语言,国内外许多大学已经将Java语言列入了本科教学计划,而IT行业对Java人才的需求也不断的增长。在IT行业发达的国家,有将近60%的软件开发人员使用Java的基础培训工作。一些软件公司对其开发人员周期性的进行Java的基础培训工作。因此,学习和掌握Java已经成为共识。在学完了Java程序设计基础课程后,我们这小组进行Java课程设计的教程,在熟练运用Eclipse环境下,来完成这个实用性计算器。1.2 课程设计内容实用型计算器的特点是通过用户注册,登录并实用计算器,计算过程对数据有自动保存。通过集中式的信息数据库,将用户信息与使用情况都存储起来,达到数据共享,降低成本,提高效率,改进服务的目的,进而实现该计算器实用性的优势。实用性计算器包含以下内容:(1)计算功能该功能用于计算各种四则运算、三角函数、进制转换、求余数、求对数等日常实用频率较高的功能。(2)统计汇总的功能 该功能对计算器运行数据进行存储,提供用户对数据查询。(3)查询功能 该计算器的存储功能提供给用户对历史信息的查询,可以按照时间查询。 第2章 实用型计算器的设计这一章是实用型计算器的设计,从系统需求分析开始,介绍开发环境和用到的开发工具,系统主要的功能设计,系统的数据流程图。 主要功能要求本计算器针对在校大学生对计算的要求及市场上计算器现状,做出更实用便捷的计算器。本计算器主要实现如下功能:q 系统采用人机对话方式,界面美观友好,信息查询灵活、方便、快捷、准确,数据存储安全可靠。q 通过注册账号并登录实现用户个人实用信息的存储并查询。q 系统操作简单,界面简洁明了。q 数据计算自动完成,提高计算效率。q 用户信息存储清晰明了,便于查询。q 以时间为数据存储开头,存储用户计算的数据。q 系统最大限度地实现了易维护性和易操作性。q 系统运行稳定、安全可靠。系统模块化分析计算器主界面布局 计算器主界面主要用了Flowlayout布局和Gridlayout布局的结合,更加简洁明了。 1)注册模块流程图添加注册面板用户在登陆界面中注册账号单击注册按钮填写个人信息判断两次密码输入是否一直输出错误信息完成注册,返回登入界面否是图1 :用户注册模块图2)查询模块流程图用户在主窗口左边的菜单上点查看显示参看选项选择查询选项显示查询数据关闭查询界面,显示计算器主界面图2:查询模块图3) 计算模块流程图输入计算数字输入计算符号进行计算在计算器文本框中显示计算结果将计算结果存到历史记录文件中图3:计算模块图实用型计算器各模块介绍各功能模块实现的功能为:登录模块:对登录用户进行判断是否合法,方便对用户查询计算历史记录查询的管理。合法情况下,用户才能进入并实用计算器。注册模块:对新用户进行简单的注册,方便使用计算器和历史记录查询。计算模块:对数据进行相应的计算处理,得出计算结果并将计算结果以系统时间为数据开头存储到历史记录文件中。信息查询模块:对用户使用计算器计算的历史记录保存,方便用户查询。 表3-1 各模块名称功能汇总表序号模块名基本功能1登录模块登录用户2注册模块提供新用户注册服务2计算模块对数据进行计算,并将结果保存到历史记录文件中3信息查询对用户使用计算器计算的历史记录进行查询和用户信息查询计算器的具体实现界面是系统之间最直接的交互界面,界面的友好性体现了软件设计的质量, 并在很大程度上决定了软件是否成功。界面设计用户登陆界面图如图4所示图4 用户登录模块框图此JavaScript函数的作用是检测用户登陆的合法性,并确认用户输入了合法的登录名和口令。注册用户界面图5注册用户界面简单的用户信息注册,为用户节约不必要的时间。系统主界面图6 系统主界面为了操作的简单明了,我们采用了Flowlayout布局和Gridlayout布局,简洁明了。以系统时间为数据头存储,方便查询。3.2程序设计及调试运行 利用JSP“一次编写,各处运行”的编程优点,按功能模块结构设计菜单,布置各明细模块工作界面,编写各个模块的程序代码,进行编译连接运行,经过反复调试修改,以达到系统功能要求。这个过程具有大量的工作量,应仔细对每个程序细节进行分析思考、编写程序并调试,做到程序简洁清楚,尽量避免可能潜在的程序错误,并在必要的地方加以注释,以便于程序阅读和修改。运行结果演示:将文件A保存到同一个文件夹中。利用javac命令对文件进行编译,使用命令如下:Javac Calculator.java之后,利用java命令执行程序,使用命令如下:Java Calculator初始登入界面登入界面用于可以用来登入,或进行进入注册界面注册界面,用来实现新用户的注册功能登入以后的计算界面第4章 结束语针对大学生学习生活中对数据的计算需求的特点,及结合市场上现有计算器的不足之处,我们小组结合现状研究出了更实用的计算器,为了方便日常生活。 经过两个礼拜的奋斗,我们小组终于将这个实用型计算器做了出来,但是由于能力有限及时间非常短暂,我们的产品还有以下不足之处:1) 界面过于朴素,美观程度不够2) 在一些较复杂计算按钮不能生动地在文件域内显示3) 有些复杂的计算方式没有加进去4) 计算器过于普通,不够生动附录 源代码import java.awt.*;import java.util.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;import java.io.*;import java.text.*;public class Calculator implements ActionListener static JTextField txt; /声明文本框对象 static JFrame f;static JDialog login, addUser; /登入和注册对话框static double yi, jieg,temp; /声明中间变量和结果变量static int fh = 5; /选择计算模式,用于选择双目运算static String s; public Calculator() try UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName(); catch (Exception e) System.out.println ( 无法设置界面风格 ); f = new JFrame(计算器); /创建一个标题名为计算器的窗口 f.setSize(420, 350); /设置窗口的大小(宽度和高度) f.setLocation(300, 300); /设置在屏幕出现的默认位置 /*Java计算器 菜单的创建*/ JMenuBar mBar = new JMenuBar(); /创建菜单条对象 JMenu mView= new JMenu(查看(V); /创建查看菜单 JMenuItem mRecord=new JMenuItem(历史纪录(H); /创建历史记录菜单项 JMenuItem uInform=new JMenuItem(用户信息(U); /创建用户信息菜单项JPanel p = new JPanel(); /创建JPanel面板(中间容器)JPanel p1 = new JPanel();JPanel p2 = new JPanel();JPanel p3 = new JPanel();JPanel p4 = new JPanel();JPanel p5 = new JPanel();JPanel p6 = new JPanel();JPanel p7 = new JPanel();txt = new JTextField(30);/ 创建文本框txt.setHorizontalAlignment(JTextField.RIGHT);/设置文本框的属性为右对齐JButton bt00=new JButton(Sin); /创建标题名为Sin的按钮组件,进行sin函数计算JButton bt = new JButton(Cos); JButton bt1 = new JButton(Tan); JButton bt2 = new JButton(Log); /创建标题名为Log的按钮组件,进行底为10的对数计算函数计算JButton bt3 = new JButton(Len); /创建标题名为Len的按钮组件,进行底为e的对数计算函数计算JButton bt4 = new JButton(二进制);JButton bt5 = new JButton(Back); /创建标题名为Back的按钮,对于输出的数字进行退格JButton bt6 = new JButton(C); /初始化计算器按钮,进行复位功能JButton bt7 = new JButton(7);JButton bt8 = new JButton(8);JButton bt9 = new JButton(9);JButton bt0 = new JButton(/);JButton bt11 = new JButton(Sqrt); /求数字的平方根按钮JButton bt12 = new JButton(4);JButton bt13 = new JButton(5);JButton bt14 = new JButton(6);JButton bt15 = new JButton(*);JButton bt16 = new JButton(Mod); /求余数计算按钮JButton bt17 = new JButton(1);JButton bt18 = new JButton(2);JButton bt19 = new JButton(3);JButton bt10 = new JButton(-);JButton bt21 = new JButton(1/x); /求倒数计算按钮JButton bt22 = new JButton(0);JButton bt23 = new JButton(+/-);JButton bt24 = new JButton(.);JButton bt25 = new JButton(+);JButton bt26 = new JButton(=);mRecord.addActionListener(this);uInform.addActionListener(this);bt00.addActionListener(this);/为各个按钮添加监视器bt.addActionListener(this);bt1.addActionListener(this);bt2.addActionListener(this);bt3.addActionListener(this);bt4.addActionListener(this);bt5.addActionListener(this);bt6.addActionListener(this);bt7.addActionListener(this);bt8.addActionListener(this);bt9.addActionListener(this);bt0.addActionListener(this);bt11.addActionListener(this);bt12.addActionListener(this);bt13.addActionListener(this);bt14.addActionListener(this);bt15.addActionListener(this);bt16.addActionListener(this);bt17.addActionListener(this);bt18.addActionListener(this);bt19.addActionListener(this);bt10.addActionListener(this);bt21.addActionListener(this);bt22.addActionListener(this);bt23.addActionListener(this);bt24.addActionListener(this);bt25.addActionListener(this);bt26.addActionListener(this);/*计算器界面布局*/f.setLayout(new BorderLayout(12, 2);/ 边界布局f.add(p, BorderLayout.NORTH);f.add(p1, BorderLayout.WEST);f.add(p2); mView.add(mRecord); /在查看菜单里面添加历史记录菜单项 mView.add(uInform); /在查看菜单里面添加用户信息菜单项 mBar.add(mView); /在菜单条上添加查看菜单 f.setJMenuBar(mBar); /在窗体上添加菜单条p.setLayout(new FlowLayout();p2.setLayout(new GridLayout(5, 1, 10, 10);/ 网格布局参数依次为(行数,列数,宽度,高度)p2.add(p3);p2.add(p4);p2.add(p5);p2.add(p6);p2.add(p7);p3.setLayout(new GridLayout(1, 3, 10, 10);p3.add(bt4);p3.add(bt5);p3.add(bt6);p4.setLayout(new GridLayout(1, 5, 10, 10);p4.add(bt7);p4.add(bt8);p4.add(bt9);p4.add(bt0);p4.add(bt11);p5.setLayout(new GridLayout(1, 5, 10, 10);p5.add(bt12);p5.add(bt13);p5.add(bt14);p5.add(bt15);p5.add(bt16);p6.setLayout(new GridLayout(1, 5, 10, 10);p6.add(bt17);p6.add(bt18);p6.add(bt19);p6.add(bt10);p6.add(bt21);p7.setLayout(new GridLayout(1, 5, 10, 10);p7.add(bt22);p7.add(bt23);p7.add(bt24);p7.add(bt25);p7.add(bt26);p.add(txt);p1.setLayout(new GridLayout(5, 1, 10, 10);p1.add(bt00);p1.add(bt);p1.add(bt1);p1.add(bt2);p1.add(bt3); loginDialog(); /启动登入界面 public void actionPerformed(ActionEvent arg0) if (arg0.getActionCommand().equals(历史纪录(H) showRecord(); if (arg0.getActionCommand().equals(用户信息(U) showUseInform(); if (arg0.getActionCommand().equals(1) if (txt.getText().equals(0)txt.setText(1);elsetxt.setText(txt.getText() + 1);if (arg0.getActionCommand().equals(2) if (txt.getText().equals(0)txt.setText(2);elsetxt.setText(txt.getText() + 2);if (arg0.getActionCommand().equals(3) if (txt.getText().equals(0)txt.setText(3);elsetxt.setText(txt.getText() + 3);if (arg0.getActionCommand().equals(4) if (txt.getText().equals(0)txt.setText(4);elsetxt.setText(txt.getText() + 4);if (arg0.getActionCommand().equals(5) if (txt.getText().equals(0)txt.setText(5);elsetxt.setText(txt.getText() + 5);if (arg0.getActionCommand().equals(6) if (txt.getText().equals(0)txt.setText(6);elsetxt.setText(txt.getText() + 6);if (arg0.getActionCommand().equals(7) if (txt.getText().equals(0)txt.setText(7);elsetxt.setText(txt.getText() + 7);if (arg0.getActionCommand().equals(8) if (txt.getText().equals(0)txt.setText(8);elsetxt.setText(txt.getText() + 8);if (arg0.getActionCommand().equals(9) if (txt.getText().equals(0)txt.setText(9);elsetxt.setText(txt.getText() + 9);if (arg0.getActionCommand().equals(0) if (txt.getText().equals(0)txt.setText(0);elsetxt.setText(txt.getText() + 0);if (arg0.getActionCommand().equals(.) if (txt.getText().indexOf(.) != -1)txt.setText(txt.getText();elsetxt.setText(txt.getText() + .);if (arg0.getActionCommand().equals(Sin) /先输入数字后按三角函数键 yi = Double.valueOf(txt.getText(); temp=yi;double jie = Math.sin(yi/180*Math.PI);txt.setText(String.valueOf(jie);s=sin(+String.valueOf(temp)+)=+String.valueOf(jie);save(s);s=null; if (arg0.getActionCommand().equals(Cos) yi = Double.valueOf(txt.getText();temp=yi;double jie = Math.cos(yi/180*Math.PI);txt.setText(String.valueOf(jie);s=cos(+String.valueOf(temp)+)=+String.valueOf(jie);save(s);s=null;if (arg0.getActionCommand().equals(Tan) yi = Double.valueOf(txt.getText();temp=yi;double jie = Math.tan(yi/180*Math.PI);txt.setText(String.valueOf(jie);s=tan(+String.valueOf(temp)+)=+String.valueOf(jie);save(s);s=null;if (arg0.getActionCommand().equals(Log) /求10为底数对数yi = Double.valueOf(txt.getText();temp=yi;double jie = Math.log(yi)/Math.log(10.0);txt.setText(String.valueOf(jie);s=log(+String.valueOf(temp)+)=+String.valueOf(jie);save(s);s=null;if (arg0.getActionCommand().equals(Len) /求e为底数的对数yi = Double.valueOf(txt.getText();temp=yi;double jie = Math.log(yi);txt.setText(String.valueOf(jie);s=cos(+String.valueOf(temp)+)=+String.valueOf(jie);save(s);s=null;if (arg0.getActionCommand().equals(+/-) /正负转换if (!(txt.getText().equals(0)yi = Double.valueOf(txt.getText();yi=-yi;txt.setText(String.valueOf(yi);if (arg0.getActionCommand().equals(Back)/ 退格int i = txt.getText().length();txt.setText(txt.getText().substring(0, i - 1);if (arg0.getActionCommand().equals(二进制) /去二进制数yi = Double.valueOf(txt.getText();long a=(long)(yi);txt.setText(String.valueOf(Long.toBinaryString(a);s=二进制转化(+String.valueOf(yi)+)=+String.valueOf(Long.toBinaryString(a);save(s);s=null;if (arg0.getActionCommand().equals(C)/ 清空txt.setText();yi = 0;fh =5;if (arg0.getActionCommand().equals(/) /除法yi = Double.valueOf(txt.getText();fh = 3;txt.setText();if (arg0.getActionCommand().equals(*) /乘法yi = Double.valueOf(txt.getText();fh = 2;txt.setText();if (arg0.getActionCommand().equals(+) /加法yi = Double.valueOf(txt.getText();fh = 0;txt.setText();if (arg0.getActionCommand().equals(-) /減法yi = Double.valueOf(txt.getText();fh = 1;txt.setText();if (arg0.getActionCommand().equals(Mod) /取余yi = Double.valueOf(txt.getText();fh = 4;txt.setText();if (arg0.getActionCommand().equals(Sqrt)/ 平方根yi = Double.valueOf(txt.getText();temp=yi;double jie = Math.sqrt(yi);txt.setText(String.valueOf(jie);s=Sqrt(+String.valueOf(temp)+)=+String.valueOf(jie);save(s);s=null;if (arg0.getActionCommand().equals(1/x) /求倒数double dou = Double.valueOf(txt.getText();txt.setText(String.valueOf(1.0 / dou);if (arg0.getActionCommand().equals(=) /等号double er = Double.valueOf(txt.getText();switch (fh) case 0: jieg = (yi + er); s=String.valueOf(yi)+String.valueOf(er)+=+String.valueOf(jieg);save(s);s=null;break;case 1:jieg = (yi - er);s=String.valueOf(yi)+-+String.valueOf(er)+=+String.valueOf(jieg);save(s);s=null;break;case 2:jieg = (yi * er);s=String.valueOf(yi)+*+String.valueOf(er)+=+String.valueOf(jieg);save(s);s=null;break;case 3:jieg = (yi / er);s=String.valueOf(yi)+/+String.valueOf(er)+=+String.valueOf(jieg);save(s);s=null;break;case 4:jieg=(yi % er);s=String.valueOf(yi)+%+String.valueOf(er)+=+String.valueOf(jieg);save(s);s=null;break;fh=5;txt.setText(String.valueOf(jieg); /*登陆注册界面*/ void loginDialog() login = new JDialog(); login.setTitle(登录); login.setLayout(new FlowLayout(); ImageIcon image=new ImageIcon(logo.jpg); /设置显示图片的绝对路径 login.add(new JLabel(image);/添加图片标签 login.add(new JLabel(用户名:); final JTextField name = new JTextField(15); login.add(name); login.add(new JLabel(密 码:); final JPasswordField password = new JPasswordField(15); 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) login.setVisible(false); regDialog.setVisible(true); ); login.add(register); login.setSize(350, 150); 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; /*注册用户的信息*/ 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(150, 200);regDialog.setResizable(false);regDialog.setLocationRelativeTo(null);confirm.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) String sex = null;if (cbg.getSelectedCheckbox() = cb1)sex = Sex:Boy;elsesex = Sex:Girl;if (saveUserData(nameTextField.getText().trim(), sex, new String(pass1.getPassword(), new String(pass2.getPassword() regDialog.setVisible(false); login.setVisible(true);elseJOptionPane.showMessageDialog(regDialog, 输入有误,请检查, 错误提示,JOptionPane.ERROR_MESSAGE););cancel.addActionListener(new ActionListener() public void actionPerformed(ActionEvent arg0) regDialog.setVisible(false);login.setVisible(true);); /*用户信息的储存*/ private boolean saveUserData(String name, String sex, String password1, String password2) if (!password1.equals(password2) return false; try RandomAccessFile out = new RandomAccessFile(user.dat, rw);out.seek(out.length();out.writeUTF(name);out.writeUTF(sex);out.writeUTF(password1);out.close(); catch (IOException e) e.printStackTrace();return false; return true; private void showUseInform() JDialog dialog = new JDialog(f, 用户信息, true); JTextArea area = new JTextArea(); area.setEditable(false); dialog.add(new JScrollPane(area); dialog.setSize(640, 480); dialog.setLocationRelativeTo(null); try File file = new File(user.dat); if (!file.exists() file.createNewFile(); char ch = new char(int)file.length(); FileReader in = new FileReader(file); in.read(ch); in.close(); area.setText(new String(ch); catch(IOException e) e.printStackTrace(); dialog.setVisible(true); private void showRecord() JDialog dialog = new JDialog(f, 历史记录, true); JTextArea
展开阅读全文