Java程序设计案例教程模块.ppt
,模块九单机版考试系统的整合与测试,目标 该考试系统对各专业课程的问卷进行整理入库,以便在需要的时候能够及时、方便、快速的对学生进行各级测试,从而使考试过程趋于简单化,减少教师在这方面的工作负担。,学习本模块涉及哪些重要内容?,本模块导读本模块是单机版考试系统的整合。主要介绍的是学生单机考试程序的设计过程,提供了试题选取,查看分数,计时器,试题显示读取试题,计算分数等功能。该考试系统对各专业课程的问卷进行整理入库,以便在需要的时候能够及时、方便、快速的对学生进行各级测试,从而使考试过程趋于简单化,减少教师在这方面的工作负担。在以往的教学中,教师通过考试来检验学生的学习成果,而这就需要教师进行大量的工作,编写试题,排版,印刷,还要对学生的考卷进行解析,不仅耗费了大量的时间也花费了大量的精力。这种繁重的工作严重的影响了教师的工作效率,这些都成为教学现代化发展的严重阻碍。在此情况下,急需一个应用计算机来进行标准化考试的系统来实现教务工作的自动化或半自动化管理。,学习本模块涉及哪些重要内容?,本模块要点单机版考试系统的设计单机版考试系统的开发单机版考试系统的发布单机版考试系统的测试,任务一单机版考试系统的设计,子任务1 设计内容 本系统适用各级院校的考试项目,其主要功能分为:身份验证可以检测用户的身份。试题选择在此可以对考试题进行选择,找到你所要的试题类型。查分系统用于教师或学生对所答题进行核对。计时系统对考试的时间进行规定,可以根据所需来自己制定试题显示对考生多进行的考试内容惊醒显示的区域。本系统适合各级院校的标准考试,可以有效的提高教师的工作效率。整个系统的开发过程严格遵循软件工程的要求,做到模块化设计。,任务一单机版考试系统的设计,子任务2 设计要求 根据本系统的需要本系统可以进行任何标准化考试,提供了试题选取,查看分数,计时器,试题显示读取试题,计算分数等功能。此考试系统,对各专业课程的问卷进行整理入库,以便在需要的时候能够及时、方便、快速的对学生进行各级测试,从而使考试过程趋于简单化,减少教师在这方面的工作负担。用户可以选择一套标准化考试试题 每套试题的考试用时由试题文件或试题数据库给出。开始读取试题后,计时器开始计划时,用户提交答案后,可以读取下一道题目。一个提示栏显示所剩余的考试时间,当规定时间用尽后,用户将不能再读取任何题目。,任务一单机版考试系统的设计,子任务2 总体设计 试题文件文件内容必须遵守如下的书写规范:试题文件的第一行是全部试题的答案,答案之间不可以有空格。第二行是试题文件的考试用时,如0:36:45第道题目之间用“*”开头的字符串分割。最后一行是endend试题文件信息表设置需如下字段:TXTID试题文件编号,文本类型。TXT试题文件名字,文本类型。TIME试题文件考试用时,数字类型。,任务二单机版考试系统的开发,子任务1 身份验证Login类 成员变量成员变量的定义见表9-1。,表9-1 主要成员变量,任务二单机版考试系统的开发,子任务1 身份验证Login类 成员方法成员方法的定义见表9-2。,表9-2 主要成员方法,任务二单机版考试系统的开发,子任务1 身份验证Login类 部分代码段trystmt=con.createStatement();ps=con.prepareStatement(select PWD from LoginRecord where ID=?);ps.setString(1,ID);rs=ps.executeQuery();if(rs.next()if(rs.getString(PWD).equals(PWD)new JavaTest();System.out.println(OK);,任务二单机版考试系统的开发,子任务1 身份验证Login类 elseJOptionPane.showMessageDialog(null,你输入的密码错误!,登录失败,JOptionPane.ERROR_MESSAGE);elseJOptionPane.showMessageDialog(null,你输入的用户名错误!,登录失败,JOptionPane.ERROR_MESSAGE);catch(final SQLException e)System.err.println(SQLException:+e.getMessage();finallyif(stmt!=null)try,任务二单机版考试系统的开发,子任务1 身份验证Login类 stmt.close();catch(final SQLException e)if(con!=null)trycon.close();catch(final SQLException e),任务二单机版考试系统的开发,子任务2 考试系统JavaTest类 成员变量成员变量的定义见表9-3。,表9-3 主要成员变量,任务二单机版考试系统的开发,子任务2 考试系统JavaTest类 成员方法成员方法的定义见表9-4。,表9-4 主要成员方法,任务二单机版考试系统的开发,子任务2 考试系统JavaTest类 部分代码import java.awt.*;import java.awt.event.*;import javax.swing.*;public class JavaTest extends JFrame implements ActionListenerTestArea testPanel=null;Container con=null;private JMenu File=new JMenu(文件);private JMenu Edit=new JMenu(编辑);private JMenu Help=new JMenu(帮助);,任务二单机版考试系统的开发,子任务2 考试系统JavaTest类 部分代码JMenuItem Open=new JMenuItem(打开);JMenuItem Exit=new JMenuItem(退出);public JavaTest()super(标准化模拟考试);testPanel=new TestArea();con=getContentPane();con.add(testPanel,BorderLayout.CENTER);addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)System.exit(0);,任务二单机版考试系统的开发,子任务2 考试系统JavaTest类 部分代码 setVisible(true);setBounds(60,40,660,460);con.validate();validate();/添加菜单栏JMenuBar JMB=new JMenuBar();File.add(Open);File.add(Exit);JMB.add(File);JMB.add(Edit);,任务二单机版考试系统的开发,子任务2 考试系统JavaTest类 部分代码JMB.add(Help);setJMenuBar(JMB);Open.addActionListener(this);Exit.addActionListener(this);/添加结束,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 成员变量,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 成员方法成员方法的定义见表9-6。,表9-6 主要成员方法,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 public TestArea()list=new Choice();String currentdir=System.getProperty(user.dir);System.out.println(currentdir);File dir=new File(currentdir);FileName fileTxt=new FileName(txt);String fileName=dir.list(fileTxt);for(int i=0;ifileName.length;i+)list.add(fileNamei);,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 testplay=new JTextArea(15,12);testplay.setLineWrap(true);testplay.setWrapStyleWord(true);testplay.setFont(new Font(TimesRoman,Font.PLAIN,14);testplay.setForeground(Color.blue);messagearea=new JTextArea(8,8);messagearea.setForeground(Color.blue);messagearea.setLineWrap(true);messagearea.setWrapStyleWord(true);countTime=new Thread(this);String s=A,B,C,D;,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 box=new JCheckBox4;for(int i=0;i4;i+)boxi=new JCheckBox(si);pauseorcontinuetime=new JButton(暂停计时);pauseorcontinuetime.addActionListener(this);commitresult=new JButton(提交该题答案);readnext=new JButton(读取第一题);readnext.setForeground(Color.blue);commitresult.setForeground(Color.blue);,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 viewscore=new JButton(查看分数);viewscore.setForeground(Color.blue);commitresult.setEnabled(false);commitresult.addActionListener(this);readnext.addActionListener(this);viewscore.addActionListener(this);list.addItemListener(this);readtests=new ReadTestquestion();JPanel pAddbox=new JPanel();for(int i=0;i4;i+)pAddbox.add(boxi);,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 Box boxH1=Box.createVerticalBox(),boxH2=Box.createVerticalBox(),baseBox=Box.createHorizontalBox();boxH1.add(new JLabel(选择试题文件);boxH1.add(list);boxH1.add(new JScrollPane(messagearea);boxH1.add(viewscore);timeShow=new JTextField(20);timeShow.setHorizontalAlignment(SwingConstants.RIGHT);timeShow.setEditable(false);JPanel p1=new JPanel();,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 p1.add(new JLabel(剩余时间:);p1.add(timeShow);p1.add(pauseorcontinuetime);boxH1.add(p1);boxH2.add(new JLabel(试题内容:);boxH2.add(new JScrollPane(testplay);JPanel p2=new JPanel();p2.add(pAddbox);p2.add(commitresult);p2.add(readnext);boxH2.add(p2);baseBox.add(boxH1);,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 baseBox.add(boxH2);setLayout(new BorderLayout();add(baseBox,BorderLayout.CENTER);welcomeLabel=new JLabel(欢迎考试,提高英语水平,JLabel.CENTER);welcomeLabel.setFont(new Font(隶书,Font.PLAIN,24);welcomeLabel.setForeground(Color.blue);add(welcomeLabel,BorderLayout.NORTH);public void itemStateChanged(ItemEvent e),任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 timeShow.setText(null);iclosetime=false;ipausetime=false;pauseorcontinuetime.setText(暂停计时);String name=(String)list.getSelectedItem();readtests.setFilename(name);readtests.settestover(false);time=readtests.getTime();if(countTime.isAlive()iclosetime=true;countTime.interrupt();,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 countTime=new Thread(this);messagearea.setText(null);testplay.setText(null);readnext.setText(读取第一题);commitresult.setEnabled(false);readnext.setEnabled(true);welcomeLabel.setText(欢迎考试,你选择的试题:+readtests.getFilename();public void actionPerformed(ActionEvent e)if(e.getSource()=readnext),任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 readnext.setText(读取下一题);commitresult.setEnabled(true);String contentTest=readtests.getTestContent();testplay.setText(contentTest);messagearea.setText(null);readnext.setEnabled(false);trycountTime.start();catch(Exception event),任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 if(e.getSource()=commitresult)readnext.setEnabled(true);commitresult.setEnabled(false);String answer=?;for(int i=0;i4;i+)if(boxi.isSelected()answer=boxi.getText();boxi.setSelected(false);break;,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 readtests.setSelection(answer);if(e.getSource()=viewscore)int score=readtests.getScore();String messages=readtests.getMessages();messagearea.setText(分数:+score+n+messages);if(e.getSource()=pauseorcontinuetime)if(ipausetime=false)pauseorcontinuetime.setText(继续计时);ipausetime=true;else if(ipausetime=true),任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 pauseorcontinuetime.setText(暂停计时);ipausetime=false;countTime.interrupt();public synchronized void run()while(true)if(time=0)iclosetime=true;countTime.interrupt();,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 commitresult.setEnabled(false);readnext.setEnabled(false);timeShow.setText(用时尽,考试结束);else if(readtests.gettestover()iclosetime=true;timeShow.setText(考试效果:分数*剩余时间(秒)=+1.0*readtests.getScore()*(time/1000);countTime.interrupt();commitresult.setEnabled(false);readnext.setEnabled(false);,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 else if(time=1)time=time-1000;long leftTime=time/1000;long leftHour=leftTime/3600;long leftMinute=(leftTime-leftHour*3600)/60;long leftSecond=leftTime%60;timeShow.setText(+leftHour+小时+leftMinute+分+leftSecond+秒);,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 tryThread.sleep(1000);catch(InterruptedException ee)if(iclosetime=true)return;while(ipausetime=true)trywait();catch(InterruptedException ee)if(ipausetime=false),任务二单机版考试系统的开发,子任务3 考试区域TestArea类 文本文件方式部分代码 notifyAll();,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 数据库方式部分代码import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.io.*;import java.sql.*;public class TestArea extends JPanel implements ActionListener,ItemListener,RunnableChoice list=null;JTextArea testplay=null,messagearea=null;JCheckBox box;,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 数据库方式部分代码JButton commitresult,readnext,viewscore;ReadTestquestion readtests=null;JLabel welcomeLabel=null;Thread countTime=null;long time=0;JTextField timeShow=null;boolean iclosetime=false,ipausetime=false;JButton pauseorcontinuetime=null;,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 数据库方式部分代码private static final String DBDRIVER=sun.jdbc.odbc.JdbcOdbcDriver;private static final String DBURL=jdbc:odbc:DBQTEST;public TestArea()list=new Choice();Connection con=null;Statement stmt=null;ResultSet rs=null;tryClass.forName(DBDRIVER);con=DriverManager.getConnection(DBURL);,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 数据库方式部分代码System.out.println(与数据库建立连接成功!sas);catch(final ClassNotFoundException e)System.err.println(ClassNotFoundException:+e.getMessage();System.exit(1);catch(final SQLException e)System.err.println(SQLException:+e.getMessage();System.exit(1);try,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 数据库方式部分代码stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);rs=stmt.executeQuery(select*from TXT);rs.last();int n=rs.getRow();String txtname=new Stringn;int j=0;rs.beforeFirst();while(rs.next()txtnamej=rs.getString(3);,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 数据库方式部分代码j+;for(int i=0;itxtname.length;i+)System.out.println(txtnamei);list.add(txtnamei);catch(final SQLException e1)System.err.println(SQLException:+e1.getMessage();finallyif(stmt!=null)try,任务二单机版考试系统的开发,子任务3 考试区域TestArea类 数据库方式部分代码stmt.close();catch(final SQLException e)if(con!=null)trycon.close();catch(final SQLException e),任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类成员变量成员变量的定义见表9-7。,表9-7 主要成员变量,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类成员方法,表9-8 主要成员方法,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类文本文件方式部分代码import java.io.*;import java.util.*;public class ReadTestquestionString filename=,correctAnswer=,testContent=,selection=;int score=0;long time=0;boolean testover=false;File f=null;FileReader in=null;,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类文本文件方式部分代码BufferedReader read=null;public void setFilename(String name)filename=name;score=0;selection=;tryif(in!=null,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类文本文件方式部分代码read=new BufferedReader(in);correctAnswer=(read.readLine().trim();String temp=(read.readLine().trim();StringTokenizer token=new StringTokenizer(temp,:);int hour=Integer.parseInt(token.nextToken();int minute=Integer.parseInt(token.nextToken();int second=Integer.parseInt(token.nextToken();time=1000*(second+minute*60+hour*60*60);catch(Exception e)testContent=没有选择试题;,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类文本文件方式部分代码 public String getFilename()return filename;public long getTime()return time;public void settestover(boolean b)testover=b;public boolean gettestover()return testover;,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类文本文件方式部分代码 public String getTestContent()tryString s=null;StringBuffer temp=new StringBuffer();if(read!=null)while(s=read.readLine()!=null)if(s.startsWith(*)break;temp.append(n+s);,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类文本文件方式部分代码if(s.startsWith(endend)in.close();read.close();testover=true;testContent=new String(temp);elsetestContent=new String(没有选择试题);catch(Exception e)testContent=试题内容为空,考试结束!;,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类文本文件方式部分代码return testContent;public void setSelection(String s)selection=selection+s;public int getScore()score=0;int length1=selection.length();int length2=correctAnswer.length();int min=Math.min(length1,length2);for(int i=0;imin;i+)try,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类文本文件方式部分代码if(selection.charAt(i)=correctAnswer.charAt(i)score+;catch(StringIndexOutOfBoundsException e)i=0;return score;public String getMessages()int length1=selection.length();int length2=correctAnswer.length();int length=Math.min(length1,length2);,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类文本文件方式部分代码String message=正确答案:+correctAnswer.substring(0,length)+n+你的回答:+selection+n;return message;数据库方式部分代码 import java.io.*;import java.util.*;import java.sql.*;public class ReadTestquestion,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码String filename=,correctAnswer=,testContent=,first=,second=,third=,fourth=,selection=;int score=0;long time=0;int record=0;boolean testover=false;private static final String DBDRIVER=sun.jdbc.odbc.JdbcOdbcDriver;private static final String DBURL=jdbc:odbc:DBQTEST;,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码Connection con=null;ResultSet rs=null;public void setFilename(String name)filename=name;score=0;selection=;tryClass.forName(DBDRIVER);con=DriverManager.getConnection(DBURL);catch(final ClassNotFoundException e),任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码System.err.println(ClassNotFoundException:+e.getMessage();System.exit(1);catch(final SQLException e)System.err.println(SQLException:+e.getMessage();System.exit(1);try stmt=con.prepareStatement(select*from txt where txt.TXT=?);stmt.setString(1,filename);rs=stmt.executeQuery();if(rs.next(),任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码time=1000*rs.getInt(TIME);catch(final SQLException e1)System.err.println(SQLException:+e1.getMessage();catch(Exception e)testContent=试题内容为空,考试结束!;trystmt=con.prepareStatement(select*from tests INNER JOIN txt on txt.TXTID=tests.TXTID where txt.TXT=?);,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码stmt.setString(1,filename);rs=stmt.executeQuery();catch(final SQLException e1)System.err.println(SQLException:+e1.getMessage();public String getFilename()return filename;public long getTime()return time;public void settestover(boolean b),任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码testover=b;public boolean gettestover()return testover;public String getTestContent()try String s=null;StringBuffer temp=new StringBuffer();if(rs.next()temp.append(rs.getRow()+.);s=rs.getString(title);,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码temp.append(s);s=rs.getString(first);temp.append(n+s);s=rs.getString(second);temp.append(n+s);s=rs.getString(third);temp.append(n+s);s=rs.getString(fourth);temp.append(n+s);testContent=new String(temp);,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码correctAnswer+=rs.getString(result);elsetestContent=new String(试题内容为空,考试结束!);catch(Exception e)testContent=请选择试题文件!;return(testContent);public void setSelection(String s)selection=selection+s;,任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码public int getScore()score=0;int length1=selection.length();int length2=correctAnswer.length();int min=Math.min(length1,length2);for(int i=0;imin;i+)try if(selection.charAt(i)=correctAnswer.charAt(i)score+;catch(StringIndexOutOfBoundsException e),任务二单机版考试系统的开发,子任务4 读取试题ReadTestquestion类数据库方式部分代码i=0;return score;public String getMessages()int len