数据结构实训报告题目: 用C 实现外部流文件的引用一、课程设计题目:二、问题描述:1、外部流文件的引用。
2、输入,输出控件化。
三、问题分析以明确的无歧义的陈述说明课程设计的任务,强调的是程序要做什么?我们小组认为,本题的要求是在于用JAVA 实现对外部数据库的调用,更新,排序以及删除。
在一开始,我们打算用本学期所学习的数据结构方面的知识再结合上学期所学的JAVA 控件知识来实现这道题目(见图),但是在调试过程中遇到了很大的问题,不得不中途换别的方式进行算法实现。
并明确规定:1、输入的形式和输入值的范围;数据库表格的形式输入,并依照数据库表格字段值的规定来规定输入值。
2、输出的形式;用JAVA语言来进行窗口式的调用。
3、程序所能达到的功能;在JAVA界面进行对外部数据库的简单应用。
比如进行查询,更新,排序以及删除。
4、算法涉及的基本理论分析:窗口界面是基于事件的程序,用户对具体图形组件的选择和激活,产生事件。
在程序中创建监听器类并注册事件,并实例化。
5、题目研究和实现的价值。
我们小组认为,本题的研究价值在于,此题目设计多个程序的跨平台应用,通过JAVA程序对数据库的加载和调用,实现后台调用和操作数据库。
实现的价值是,通过这个简单的程序初步认识到编程这项工作在将来的程序开发中的作用和价值。
四、算法设计1、概要设计阐述说明本算法中用到的所有数据结构的定义及其含义、主程序的流程以及各程序模块之间的层次(调用)关系。
因为涉及到外部文件流的引用,所以我们小组进行的方式是用JAVA命令式的程序对数据库进行创建,删除,插入以及查找。
我们用了四个小程序来进行对数据库的调用,分别是见图。
2、详细设计(1)实现概要设计中定义的所有数据类型;货号(char),品名(char),进口(boolean),单价(integer),数量(integer),开单日期(date),生产单位(char)。
(2)所有函数的接口描述;ListSelectionListener,WindowListener,处理窗口时间的监听器类。
(3)所有函数的算法描述(只需要写出伪码算法);函数为调用数据库和对数据库操作以及构造用户图形界面。
(3)对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序),可采用流程图、N –S 图或PAD图进行描述;操作数据库的主程序为两个类,其中try类是对数据库进行加载桥接以及创建,catch类是依照算法的健壮性,对错误情况的处理。
(4)画出函数的调用关系图。
无。
五、算法实现创建数据表程序J_AccessCreateTableimport java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class J_AccessCreateTable{public static void main(String args[]){try{Class.forName("microsoft.jdbc.sqlserver.SQLServerDriver");//加载JDBC-ODBC桥驱动程序Connection c//通过数据源与数据库建立起连接=DriverManager.getConnection("jdbc:odbc:OD");Statement s=c.createStatement();//创建SQL语句对象//创建数据库表:订单s.executeUpdate("Create table 订单("+"货号char(10) CONSTRAINT authIndex PRIMARY KEY, "+"品名char(10), "+"进口boolean, "+"单价integer, "+"数量integer, "+"开单日期char(12) "+"生产单位char(14))");s.close();c.close();System.out.println("创建数据库表:订单");}catch (Exception e){System.err.println("异常:"+e.getMessage());}}增加一个订单程序J_AccessInsertRecordimport java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class J_AccessInsertRecord{public static void main(String args[]){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载JDBC-ODBC桥驱动程序Connection c//通过数据源与数据库建立起连接=DriverManager.getConnection("jdbc:odbc:OD");Statement s=c.createStatement();//创建SQL语句对象s.executeUpdate("insert into 订单valuse(LX,影碟机,FALSE,5900.00,5,1996-6-6,长虹集团)");s.close();c.close();System.out.println("给数据库表\"订单\"增加记录");}catch(Exception e){System.err.println("异常:"+e.getMessage());}}}删除数据表J_AccessDropTableimport java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;public class J_AccessDropTable{public static void main(String args[]){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载JDBC-ODBC桥驱动程序Connection c//通过数据源与数据库建立起连接=DriverManager.getConnection("jdbc:odbc:OD");Statement s=c.createStatement();//创建SQL语句对象s.executeUpdate("drop table 订单");s.close();c.close();System.out.println("删除数据表:订单");}catch (Exception e){System.err.println("异常:"+e.getMessage());}}}数据表查询并且按指定字段名排序J_AccessShowRecordimport java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class J_AccessShowRecord{public static void mb_ShowRecord(ResultSet r){try{st();System.out.println("数据库表共有"+r.getRow()+"行记录");r.beforeFirst();while(r.next()){System.out.println("第"+r.getRow()+"行记录为:");}}catch(Exception e){System.err.println("异常"+e.getMessage());}}public static void main(String args[]){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection c=DriverManager.getConnection("jdbc:odbc:OD");Statement s=c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSet r1=s.executeQuery("select 货号from 订单");ResultSet r2=s.executeQuery("select 品名from 订单");ResultSet r3=s.executeQuery("select 单价from 订单");mb_ShowRecord(r1);mb_ShowRecord(r2);mb_ShowRecord(r3);s.close();c.close();}catch (Exception e){System.err.println("异常:"+e.getMessage());}}}以下为交互式界面图形窗口以及SWING组件的程序import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.table.*;import java.io.*;public class OrderBookJFrame extends JFrame implements ListSelectionListener,WindowListener{public String filename; //文件名public TreeSet<Order> tbook; //订单public JList list; //列表框public DefaultListModel listModel; //默认列表框模型public JTable table; //表格组建public DefaultTableModel tableModel; //默认表格模型public String nam; //品名public String product; //货号public boolean imp; //是否为进口public String dat; //开单日期public String compan; //生产单位public double pric; //单价public double amoun;public OrderBookJFrame(String filename) //构造用户图形界面{super("订单");Dimension dim =getToolkit().getScreenSize(); //获得屏幕分辨率this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2); //窗口居中this.addWindowListener(this);//注册窗口事件监听器this.filename=filename;tbook=new TreeSet<Order>(); //从指定文件中读取对象信息this.readFromFile();JSplitPane splitter_h=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); //分割窗格splitter_h.setDividerLocation(60); //设置分割条的位置this.getContentPane().add(splitter_h);JSplitPane splitter_v=new JSplitPane(JSplitPane.VERTICAL_SPLIT);//垂直分割splitter_v.setDividerLocation(dim.height/4);this.listModel=new DefaultListModel(); //默认列表框模式this.listModel.addElement("全部");this.getFamilyName(); //列表框中加电话薄中所有姓氏this.list=new JList(listModel); //创建列表框this.list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置单选模式this.list.addListSelectionListener(this); //列表框注册选择事件监听器splitter_h.add(new JScrollPane(this.list)); //添加在滚动窗格中splitter_h.add(splitter_v);String[] columnNames={"货号","品名","进口","单价","数量","开单日期","生产单位"}; //表格各列的中文标题this.tableModel=new DefaultTableModel(columnNames,0); //制定列标题,0行this.table=new JTable(tableModel); //创建空表格,有列标题this.list.setSelectedIndex(0); //列表框选中第一项splitter_v.add(new JScrollPane(table));splitter_v.add(new orderJPanel());this.setVisible(true);}public OrderBookJFrame(){this("friends.dat"); //指定默认文件名}public void valueChanged(ListSelectionEvent e) // 选择事件处理方法{if(e.getSource()==this.list) //选中列表框的数据项时触发{String selected=(String)list.getSelectedValue(); //返回列表框选中数据项对象this.searchByName(selected); //返回选中姓氏的对象并更新表格}}public void getFamilyName() // JList 订单中中的所有首字母{if(!tbook.isEmpty()){Iterator it=tbook.iterator(); //返回一个迭代器对象while(it.hasNext()) //使用迭代器遍历一个集合{Order f=(Order)it.next(); //返回后继元素String familyname = f.getName().charAt(0)+"" ; // 获得首字母if(!this.listModel.contains(familyname))this.listModel.addElement(familyname); //列表框模型添加数据项}}}private void searchByName(String familyname) //更新表格,参数指定姓氏{if(!tbook.isEmpty() && familyname!= null && familyname!=""){for(int i=this.tableModel.getRowCount()-1;i>=0;i--) //清空表格this.tableModel.removeRow(i);Iterator it=tbook.iterator();while(it.hasNext()){Order f =(Order)it.next();if(familyname=="全部" || f.getName().charAt(0)==familyname.charAt(0))this.tableModel.addRow(f.toArray()); //表格添加一行,参数数组指定各列值}}}//私有内部类,构造一个面板,包括两个文本行和添加,删除,查找等按钮private class FriendJPanel extends JPanel implements ActionListener{private JTextField text_name; //文本行,输入品名private JTextField text_code; //文本行,输入货号private JTextField text_impo;private JTextField text_price;private JTextField text_amount;private JTextField text_data;private JTextField text_company;public FriendJPanel(){this.setLayout(new GridLayout(3,1));JPanel p1=new JPanel();this.add(p1);p1.add(new JLabel("货号"));this.text_name=new JTextField("电视机",20);p1.add(text_name);JPanel p2=new JPanel();this.add(p2);p2.add(new JLabel("品名"));this.text_code=new JTextField("xy-730",20);p2.add(text_code);this.setLayout(new GridLayout(3,1));JPanel p3=new JPanel();this.add(p3);p2.add(new JLabel("是否为进口"));this.text_code=new JTextField("true",20);p2.add(text_code);JPanel p4=new JPanel();this.add(p4);p2.add(new JLabel("单价"));this.text_code=new JTextField("3400",20);p2.add(text_code);this.setLayout(new GridLayout(3,1));JPanel p5=new JPanel();this.add(p5);p2.add(new JLabel("数量"));this.text_code=new JTextField("1",20);p2.add(text_code);JPanel p6=new JPanel();this.add(p6);p2.add(new JLabel("开单日期"));this.text_code=new JTextField("2010-7-11",20); p2.add(text_code);this.setLayout(new GridLayout(3,1));JPanel p7=new JPanel();this.add(p7);p2.add(new JLabel("生产单位"));this.text_code=new JTextField("松下集团",20); p2.add(text_code);JPanel p8=new JPanel();this.add(p8);JButton button_add=new JButton("添加");p3.add(button_add);button_add.addActionListener(this);JButton button_delete=new JButton("删除");p3.add(button_delete);button_delete.addActionListener(this);JButton button_search=new JButton ("按货号查找");p3.add(button_search);button_search.addActionListener(this);}public void actionPerformed(ActionEvent e) //单击事件处理程序{if(e.getActionCommand().equals("添加")) //单击添加按钮{String name=text_name.getText();String code=text_code.getText();String impo=text_impo.getText();String price=text_price.getText();String amount=text_amount.getText();String data=text_data.getText();String company=text_company.getText();if(name!=""){Order f=new Order(product,nam,imp,pric,amoun,dat,compan);if(!tbook.contains(f)) //订单不能插入重复对象{tbook.add(f); //添加对象String familyname=name.charAt(0)+""; //返回品名的第一个字符if(list.getSelectedValue().equals(familyname))tableModel.addRow(f.toArray());else{if(!listModel.contains(familyname))listModel.addElement(familyname);list.setSelectedValue(familyname,true); //设置列表框中选中项}}elseJOptionPane.showMessageDialog(null,"不能添加空对象或重复对象"+ f.toString(),"提示",JOptionPane.DEFAULT_OPTION);//使用标准对话框显示提示信息elseJOptionPane.showMessageDialog(null,"请输入姓名","提示",JOptionPane.DEFAULT_OPTION);}if(e.getActionCommand().equals("货号码查询"))searchByCode(text_code.getText()); //查找货号if(e.getActionCommand().equals("删除")) //表格当前选中行号{int i=table.getSelectedRow();int yes=JOptionPane.showConfirmDialog(null,"删除"+i+"行?", "询问",JOptionPane.YES_NO_OPTION); //询问对话框,包括yes和no按钮if(yes==0) //单击yes{String name=(String)table.getValueAt(i,0);String code =(String)table.getValueAt(i,0);tbook.remove(newOrder(product,nam,imp,pric,amoun,dat,compan)); //订单中删除对象tableModel.removeRow(i); //表格中删除一行listModel.removeElement(name.charAt(0)+"");//列表框中删除指定姓氏}}}} //OrderJPanel内部类结束private void readFromFile() //从指定文件中读取已有对象{try{FileInputStream fin =new FileInputStream(this.filename); //文件字节输入流ObjectInputStream objin=new ObjectInputStream(fin); //对象字节输入流while(true) //输入流未结束时try{Order f=(Order)objin.readObject(); //读取一个对象tbook.add(f); //添加到订单}catch(ClassNotFoundException e) //输入流结束时抛出该异常{break;}objin.close(); //先关闭对象流fin.close(); //再关闭文件流}catch(IOException e){} //若文件不存在,则不读取}public void writeToFile() //向指定文件写入订单中的所有对象{try{FileOutputStream fout =new FileOutputStream(this.filename);//文件字节输出流ObjectOutputStream objout=new ObjectOutputStream(fout); //对象字节输出流if(!tbook.isEmpty()){Iterator it=tbook.iterator();while(it.hasNext())objout.writeObject((Order)it.next()); //写入一个对象}objout.close();fout.close();}catch(IOException ex){}}public void windowClosing(WindowEvent e) //关闭窗口事件处理方法{//this.writeToFile(); //将订单所有对象写入指定文件System.exit(0); //应用程序终止执行}public void windowOpened(WindowEvent e){}public void windowActivated(WindowEvent e){}public void windowDeactivated(WindowEvent e){}public void windowClosed(WindowEvent e){}public void windowIconified(WindowEvent e){}public void windowDeiconified(WindowEvent e){}public static void main(String args[] ) throws IOException{new OrderBookJFrame(); //默认文件名为“friends.dat”}}六、软件测试这里的测试主要是基于功能的黑盒测试,所以首先提出测试的功能点,然后给出测试数据(包括正确的输入及其输出结果和含有错误的输入及其输出结果。