小学四则运算练习软件
《小学四则运算练习软件》
源码在Github的仓库主页链接地址:https://github.com/cy0325/Problem-software.git
小伙伴的博客链接地址:http://www.cnblogs.com/mmzq/p/8687494.html
需求分析
设计开发一个小学生四则运算练习软件,使之具有以下功能:
1. 由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
2. 题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
3. 程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
4. 程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
5. 程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
6. 测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
7. 程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
软件设计
MyDBConnection类:用于连接数据库。
login类:调用DBOperation类,实现用户注册和登陆。
DBOperation类:对数据库中的user表进行操作,增加用户信息。
TestMysql类:用于连接数据库,并对数据数据库进行操作。
Myframe类:调用数据库中的questionbank表,用于随机出题,之后取出数据库中答案,和用户的答案进行比较,然后给出用户的得分情况,将每一轮的得分放入柱状图中。
Chart类:用户绘柱状图,在Myframe中进行调用。
核心代码
1. 数据库test连接代码,用于存放questinbank表和user表。
1 //登陆本地数据库 2 private static final String url = "jdbc:mysql://123.206.7.198:3307/test"; 3 private static final String user = "qinxh"; 4 private static final String password = "031578"; 5 6 private static ResultSet ret = null; 7 private static final String name = "com.mysql.jdbc.Driver"; 8 public Connection conn = null; 9 public PreparedStatement pst = null; 10 public TestMysql() { 11 try { 12 Class.forName(name);//指定连接类型 13 conn = DriverManager.getConnection(url, user, password);//获取连接 14 15 } catch (Exception e) { 16 e.printStackTrace(); 17 } 18 }
2. test中表questionbank的操作代码,用于存放四则运算题,在题库中,已经放好10000道题。
1 //查询及其他 2 public void changeMySqlDate(String sql) { 3 try { 4 System.out.println("接收到的参数为:"+sql); 5 pst=conn.prepareStatement(sql); 6 pst.executeUpdate(); 7 } catch (SQLException e) { 8 e.printStackTrace(); 9 } 10 } 11 12 13 //插入删除操作 14 public ResultSet selectSqlDate(String sql) { 15 try { 16 System.out.println("接收到的插入删除参数为:"+sql); 17 pst=conn.prepareStatement(sql); 18 ret = pst.executeQuery(); 19 return ret; 20 } catch (SQLException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 return null; 24 } 25 } 26 27 //关闭mysql 28 public void closeMySql() { 29 try { 30 this.conn.close(); 31 } catch (SQLException e) { 32 e.printStackTrace(); 33 } 34 } 35 36 37 //关闭数据表 38 @SuppressWarnings("static-access") 39 public void closeChart() { 40 try { 41 this.pst.close(); 42 this.ret.close(); 43 } catch (SQLException e) { 44 e.printStackTrace(); 45 } 46 }
3. test中表user的操作代码,用于存放用户信息。
1 public void insertData(String name,String password,int scores){ 2 try{ 3 String newType1=new String(name.getBytes(),"GBK");//字节转码 4 String newType2=new String(password.getBytes(),"GBK"); 5 String sql="INSERT INTO user(scores,name,password)VALUES("+scores+",'"+newType1+"','"+newType2+"')"; 6 stmt.executeUpdate(sql);//更新语句 7 }catch(Exception e1){ 8 e1.printStackTrace(); 9 } 10 } 11 public void deleteData(int scores){ 12 String sql="DELETE FROM user WHERE scores="+scores+""; 13 System.out.print(sql); 14 try{ 15 stmt.executeUpdate(sql); 16 //System.out.println("一条记录被删除"); 17 }catch(SQLException e){ 18 e.printStackTrace(); 19 } 20 } 21 public void updateData(int mscores,int scores,String name,String password){//修改 22 String sql="UPDATE user SET scores="+scores+",name='"+name+"',password='"+password+"'where scores="+mscores+"&&name='"+name+"'&&password='"+password+"'"; 23 try{ 24 stmt.executeUpdate(sql); 25 }catch(SQLException e){ 26 e.printStackTrace(); 27 } 28 } 29 public boolean selectPassword(String mpassword){//查询密码 30 String sql="SELECT scores,name,password FROM user"; 31 try{ 32 ResultSet rs=stmt.executeQuery(sql);//返回结果集 33 while(rs.next()){//指针向后移动 34 password=rs.getString("password"); 35 number2++; 36 //System.out.print(rs.getString("password")+" "); 37 if(password.equals(mpassword)&&(number2==number1)){ 38 //System.out.print("number2:"+number2); 39 return true; 40 } 41 } 42 43 }catch(Exception e){ 44 e.printStackTrace(); 45 } 46 return false; 47 } 48 public boolean selectName(String mname){//查询id 49 String sql="SELECT scores,name,password FROM user"; 50 try{ 51 ResultSet rs=stmt.executeQuery(sql);//返回结果集 52 while(rs.next()){//指针向后移动 53 name=rs.getString("name"); 54 number1++; 55 if(name.equals(mname)){ 56 //System.out.print("number1:"+number1); 57 return true; 58 } 59 } 60 }catch(Exception e){ 61 e.printStackTrace(); 62 } 63 return false; 64 } 65 public int getScores(){ 66 return scores; 67 } 68 public String getName(){ 69 return name; 70 } 71 public String getPassword(){ 72 return password; 73 } 74 75 public void setNumber1(){ 76 number1=0; 77 } 78 public void setNumber2(){ 79 number2=0; 80 }
4. 登录界面和注册界面代码,注册后将用户的信息加入数据库test的表user中。
1 public class login implements MouseListener { 2 public static JFrame frame = new JFrame("登录窗口"); 3 private JLabel label1=new JLabel("用户名:"); 4 private JTextField txt1=new JTextField(); 5 private JLabel label2=new JLabel("密 码:"); 6 private JTextField txt2=new JTextField(); 7 private JButton btn1=new JButton("登陆"); 8 private JButton btn2=new JButton("注册"); 9 private JButton btn3=new JButton("退出"); 10 private String text1; 11 private String text2; 12 private int distinguish;//用来记录鼠标悬停在哪个位置 13 MyDBConnection myDB=new MyDBConnection(); 14 public DBOperation myOpr=new DBOperation(myDB); 15 public login(){ 16 17 } 18 19 public void show(){ 20 frame.setLayout(null);//定义空布局 21 frame.setSize(470,300); 22 frame.setLocation(400, 200); 23 24 Font font=new Font("华文行楷",Font.BOLD,20); 25 label1.setFont(font); 26 label1.setForeground(Color.gray);//设置字体颜色 27 label2.setFont(font); 28 29 label2.setForeground(Color.gray); 30 txt1.setOpaque(false);//设置文本框透明 31 txt2.setOpaque(false); 32 33 btn1.setContentAreaFilled(false);//设置button组件透明 34 btn1.setFont(font); 35 btn1.setForeground(Color.gray); 36 btn1.setBorder(BorderFactory.createRaisedBevelBorder());//设置突出button组件 37 btn1.addActionListener(new ActionListener() 38 { 39 //单击按钮执行的方法 40 public void actionPerformed(ActionEvent e) 41 { 42 closeThis(); 43 //创建新的窗口 44 Myframe frame = new Myframe(); 45 //设置在屏幕的位置 46 frame.setTitle("小学四则运算"); 47 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 48 frame.setVisible(true); 49 frame.setVisible(true); 50 } 51 52 }); 53 btn2.setContentAreaFilled(false); 54 btn2.setFont(font); 55 btn2.setBorder(BorderFactory.createRaisedBevelBorder()); 56 btn2.setForeground(Color.gray); 57 btn3.setContentAreaFilled(false); 58 btn3.setFont(font); 59 btn3.setBorder(BorderFactory.createRaisedBevelBorder()); 60 btn3.setForeground(Color.gray); 61 JPanel bj = new JPanel() {//设置背景 62 protected void paintComponent(Graphics g) { 63 Image bg; 64 try { 65 bg = ImageIO.read(new File("src/image/1.jpg")); 66 g.drawImage(bg, 0, 0, getWidth(), getHeight(), null); 67 } catch (IOException e) { 68 e.printStackTrace(); 69 } 70 } 71 }; 72 73 74 label1.setBounds(100,50,100,100); 75 txt1.setBounds(180,90, 150, 20); 76 label2.setBounds(100,80,100,100); 77 txt2.setBounds(180,120, 150, 20); 78 btn1.setBounds(100,200,80,20); 79 btn2.setBounds(190,200,80,20); 80 btn3.setBounds(280,200,80,20); 81 frame.setContentPane(bj); 82 frame.setLayout(null); 83 frame.add(label1); 84 frame.add(txt1); 85 frame.add(label2); 86 frame.add(txt2); 87 frame.add(btn1); 88 frame.add(btn2); 89 frame.add(btn3); 90 btn1.addMouseListener(this);//添加鼠标监听 91 btn2.addMouseListener(this); 92 btn3.addMouseListener(this); 93 frame.setVisible(true); 94 } 95 96 public void mouseClicked(MouseEvent arg0) { 97 text1=txt1.getText();//获取用户输入数据 98 text2=txt2.getText(); 99 if(distinguish==1){ 100 if(myOpr.selectName(text1)){//登录判断 101 if(myOpr.selectPassword(text2)){ 102 JOptionPane.showMessageDialog(null, "登陆成功","提示",2); 103 txt1.setText(""); 104 txt2.setText(""); 105 distinguish=4; 106 frame.setVisible(false);//登录成功则关闭界面 107 }else{ 108 JOptionPane.showMessageDialog(null, "密码错误","提示",2); 109 txt2.setText(""); 110 myOpr.setNumber1();//密码错误将number置0 111 myOpr.setNumber2(); 112 } 113 }else{ 114 JOptionPane.showMessageDialog(null, "此id不存在,请注册","提示",2); 115 txt1.setText(""); 116 txt2.setText(""); 117 } 118 } 119 if(distinguish==2){ 120 String logi=(String) JOptionPane.showInputDialog(null,"请输入你的id:\n","注册",JOptionPane.PLAIN_MESSAGE,null,null,"在这输入"); 121 String pas=(String) JOptionPane.showInputDialog(null,"请输入你的密码:\n","注册",JOptionPane.PLAIN_MESSAGE,null,null,"在这输入"); 122 myOpr.insertData(logi,pas,0); 123 JOptionPane.showMessageDialog(null, "注册成功","提示",2); 124 } 125 if(distinguish==3){ 126 int n = JOptionPane.showConfirmDialog(null, "是否退出?", "byebye",JOptionPane.YES_NO_OPTION); 127 myDB.closeMyConnection(); 128 if(n==JOptionPane.YES_OPTION){ 129 System.exit(1); 130 } 131 } 132 133 } 134 135 public void mouseEntered(MouseEvent arg0) { 136 if (arg0.getSource() == btn1) { 137 distinguish=1;//鼠标悬停在btn1处则把distinguish置1 138 btn1.setForeground(Color.red);//改变颜色 139 btn1.setBorder(BorderFactory.createLoweredBevelBorder());//组件凹陷 140 btn2.setForeground(Color.gray); 141 btn2.setBorder(BorderFactory.createRaisedBevelBorder()); 142 btn3.setForeground(Color.gray); 143 btn3.setBorder(BorderFactory.createRaisedBevelBorder()); 144 } 145 if (arg0.getSource() == btn2) { 146 distinguish=2; 147 btn1.setForeground(Color.gray); 148 btn1.setBorder(BorderFactory.createRaisedBevelBorder()); 149 btn2.setForeground(Color.red); 150 btn2.setBorder(BorderFactory.createLoweredBevelBorder()); 151 btn3.setForeground(Color.gray); 152 btn3.setBorder(BorderFactory.createRaisedBevelBorder()); 153 } 154 if (arg0.getSource() == btn3) { 155 distinguish=3; 156 btn1.setForeground(Color.gray); 157 btn1.setBorder(BorderFactory.createRaisedBevelBorder()); 158 btn2.setForeground(Color.gray); 159 btn2.setBorder(BorderFactory.createRaisedBevelBorder()); 160 btn3.setForeground(Color.red); 161 btn3.setBorder(BorderFactory.createLoweredBevelBorder()); 162 } 163 164 } 165 public void mouseExited(MouseEvent arg0) {//鼠标退出三个button组件后恢复 166 distinguish=0; 167 label1.setForeground(Color.gray); 168 label2.setForeground(Color.gray); 169 txt1.setOpaque(false); 170 txt2.setOpaque(false); 171 btn1.setContentAreaFilled(false); 172 btn1.setForeground(Color.gray); 173 btn1.setBorder(BorderFactory.createRaisedBevelBorder()); 174 btn2.setContentAreaFilled(false); 175 btn2.setBorder(BorderFactory.createRaisedBevelBorder()); 176 btn2.setForeground(Color.gray); 177 btn3.setContentAreaFilled(false); 178 btn3.setBorder(BorderFactory.createRaisedBevelBorder()); 179 btn3.setForeground(Color.gray); 180 } 181 182 public static void closeThis(){ 183 frame.dispose(); 184 } 185 186 public void mousePressed(MouseEvent arg0) { 187 188 } 189 public void mouseReleased(MouseEvent arg0) { 190 191 192 } 193 public String getText1(){ 194 return text1; 195 } 196 public String getText2(){ 197 return text2; 198 } 199 public int getDistinguish(){ 200 return distinguish; 201 } 202 203 }
5. 答题界面,出题并判断对错得出成绩。
1 public class Myframe extends JFrame { 2 private JTextField answer; 3 private JLabel lun = new JLabel("第 1 轮");; 4 private JLabel scorelb = new JLabel("得分:"); 5 private static JLabel question = new JLabel("____________"); 6 private JLabel num = new JLabel("1"); 7 private JLabel time = new JLabel("计时:00:00"); 8 private JComboBox languae = new JComboBox(); 9 private JLabel score = new JLabel("0"); 10 private JButton nextbtn = new JButton("下一题"); 11 private JButton drawlb = new JButton("成绩图表"); 12 private final JButton startbtn = new JButton("开始测试"); 13 long startTime; 14 int ans=0,tans=0,count =1, clun=1; 15 int sum=0; 16 Boolean flag=false; 17 static String sans=new String("");; 18 static String qus=new String(""); 19 static TestMysql ls; 20 static ResultSet rs; 21 static ResultSet as; 22 static Random r = new Random(); 23 static int s=r.nextInt(10000)+1; 24 ArrayList<Integer> scorelist=new ArrayList<>(); //存放每一轮的得分 25 private JPanel panel = new JPanel() 26 { 27 //设置背景 28 protected void paintComponent(Graphics g) { 29 Image bg; 30 try { 31 bg = ImageIO.read(new File("src/image/4.jpg")); 32 g.drawImage(bg, 0, 0, getWidth(), getHeight(), null); 33 } catch (IOException e) { 34 e.printStackTrace(); 35 } 36 } 37 }; 38 /** 39 * Launch the application. 40 */ 41 public static void main(String[] args) { 42 EventQueue.invokeLater(new Runnable() { 43 public void run() { 44 try { 45 login window=new login(); 46 window.show(); 47 } catch (Exception e) { 48 e.printStackTrace(); 49 } 50 } 51 }); 52 } 53 54 /** 55 * Create the frame. 56 */ 57 public Myframe() { 58 startTime = new Date().getTime(); 59 setBounds(100, 100, 821, 643); 60 //设置面板 61 panel.setBackground(Color.WHITE); 62 panel.setBorder(new EmptyBorder(5, 5, 5, 5)); 63 setContentPane(panel); 64 panel.setLayout(null); 65 //设置第几轮 66 lun.setForeground(Color.BLUE); 67 lun.setHorizontalAlignment(SwingConstants.CENTER); 68 lun.setFont(new Font("华文行楷", Font.BOLD, 42)); 69 lun.setBackground(Color.BLUE); 70 lun.setBounds(339, 80, 139, 71); 71 panel.add(lun); 72 //设置题号 73 num.setToolTipText(""); 74 num.setHorizontalAlignment(SwingConstants.CENTER); 75 num.setBorder(new LineBorder(new Color(0, 204, 51), 3, true)); 76 num.setFont(new Font("宋体", Font.BOLD, 17)); 77 num.setBackground(new Color(0, 255, 255)); 78 num.setBounds(234, 209, 45, 34); 79 panel.add(num); 80 //设置运算题 81 question.setForeground(new Color(51, 204, 255)); 82 question.setFont(new Font("华文楷体", Font.BOLD, 32)); 83 question.setBounds(298, 205, 276, 53); 84 panel.add(question); 85 //设置答案 86 answer = new JTextField(); 87 answer.setFont(new Font("华文楷体", Font.BOLD, 32)); 88 answer.setBounds(588, 205, 128, 53); 89 panel.add(answer); 90 answer.setColumns(10); 91 //设置得分 92 scorelb.setFont(new Font("微软雅黑", Font.BOLD, 21)); 93 scorelb.setBounds(252, 339, 72, 46); 94 panel.add(scorelb); 95 score.setForeground(Color.RED); 96 score.setFont(new Font("宋体", Font.BOLD, 22)); 97 score.setHorizontalAlignment(SwingConstants.CENTER); 98 score.setBounds(298, 346, 56, 34); 99 panel.add(score); 100 //设置计时器 101 time.setFont(new Font("微软雅黑", Font.BOLD, 21)); 102 time.setBounds(255, 429, 186, 46); 103 panel.add(time); 104 //设置语言 105 languae.setEditable(true); 106 languae.setBounds(582, 68, 72, 24); 107 languae.addItem("中文"); 108 languae.addItem("英文"); 109 panel.add(languae); 110 //设置"下一题"按钮 111 nextbtn.setBackground(new Color(204, 204, 255)); 112 nextbtn.setFont(new Font("宋体", Font.BOLD, 17)); 113 nextbtn.setBounds(479, 334, 113, 46); 114 panel.add(nextbtn); 115 //下一题事件监听 116 nextbtn.addActionListener(new ActionListener() { 117 public void actionPerformed(ActionEvent e) { 118 boolean isend; 119 isend=nextbtn.getText().equals("答题结束"); 120 if(! isend) 121 { 122 count = count+1; 123 num.setText(""+count); 124 if(count==21) 125 { 126 startTime = new Date().getTime(); 127 count =1; 128 num.setText(""+count); 129 clun=clun+1; 130 lun.setText("第 "+clun+" 轮"); 131 scorelist.add(sum); 132 nextbtn.setText("提交"); 133 int value=JOptionPane.showConfirmDialog(null, "当前得分:"+sum+",是否进入下一轮?", "提示信息", JOptionPane.YES_NO_OPTION); 134 if (value==JOptionPane.YES_OPTION) { 135 System.out.println("你选择了是"); 136 nextbtn.setText("下一题");} 137 else if (value==JOptionPane.NO_OPTION) { 138 nextbtn.setText("答题结束"); 139 } 140 sum=0; 141 } 142 test(); 143 answer.setText(""); 144 } 145 else{ 146 147 } 148 } 149 }); 150 151 //设置"成绩图表"按钮 152 drawlb.setBackground(new Color(204, 204, 255)); 153 drawlb.setFont(new Font("宋体", Font.BOLD, 17)); 154 drawlb.setBounds(479, 432, 113, 46); 155 panel.add(drawlb); 156 //成绩图表事件监听 157 drawlb.addActionListener(new ActionListener() { 158 public void actionPerformed(ActionEvent e) { 159 Chart demo = new Chart(scorelist); 160 demo.setVisible(true); 161 } 162 }); 163 //设置"开始测试"按钮 164 startbtn.setForeground(new Color(255, 0, 51)); 165 startbtn.setBackground(new Color(255, 204, 204)); 166 startbtn.setFont(new Font("楷体", Font.BOLD, 20)); 167 startbtn.setBounds(164, 58, 128, 41); 168 panel.add(startbtn); 169 170 //开始测试事件监听 171 startbtn.addActionListener(new ActionListener() { 172 public void actionPerformed(ActionEvent e) { 173 startTime = new Date().getTime(); 174 this.timer(); 175 test(); 176 } 177 //计时器 178 public void timer() { 179 new Thread() { 180 public void run() { 181 while (true) { 182 try { 183 Thread.sleep(1000); 184 long seconds = (new Date().getTime() - startTime) / 1000; 185 long mm = seconds / 60; 186 long ss = seconds % 60; 187 188 time.setText("计时: " + (mm < 10 ? "0" + mm : "" + mm) + ":" + (ss < 10 ? "0" + ss : "" + ss)); 189 } catch (InterruptedException e) { 190 e.printStackTrace(); 191 } 192 } 193 } 194 }.start(); 195 } 196 }); 197 } 198 199 //获取题和答案 200 public void test() 201 { 202 String str = answer.getText(); 203 if(str.equals("")) str = ""+0; 204 ans=Integer.parseInt(str.trim()); 205 //判断答案是否正确 206 if(tans==ans&&ans!=0) 207 { 208 flag=true; 209 } 210 else 211 flag=false; 212 //如果答案正确,则加5分 213 if(flag) 214 { 215 sum = sum+5; 216 score.setText(String.valueOf(sum)); 217 } 218 else 219 score.setText(String.valueOf(sum)); 220 221 //从数据库题目表中获取问题 222 s=r.nextInt(10000)+1; 223 ls=new TestMysql(); 224 rs=ls.selectSqlDate("select content from questionbank where id="+s); 225 try { 226 while(rs.next()) 227 { 228 System.out.println(rs.getString("content")); 229 qus=rs.getString("content"); 230 question.setText(qus); 231 } 232 } catch (SQLException e1) { 233 // TODO Auto-generated catch block 234 e1.printStackTrace(); 235 } 236 237 //从数据库题目表中获取正确答案,用于判断答案是否正确 238 as=ls.selectSqlDate("select result from questionbank where id="+s); 239 try { 240 while(as.next()) 241 { 242 System.out.println(as.getString("result")); 243 sans=as.getString("result"); 244 tans = Integer.parseInt(sans); 245 //System.out.println(tans); 246 } 247 } catch (NumberFormatException e1) { 248 // TODO Auto-generated catch block 249 e1.printStackTrace(); 250 } catch (SQLException e1) { 251 // TODO Auto-generated catch block 252 e1.printStackTrace(); 253 } 254 } 255 }
6. 根据几轮的成绩绘制柱状图。
1 public class Chart extends JFrame{ 2 3 //绘制柱形统计图 4 ArrayList<Integer> ran=new ArrayList<Integer>(); 5 public Chart(ArrayList<Integer> scores) 6 { 7 super(); 8 getContentPane().setForeground(Color.CYAN); 9 setForeground(Color.CYAN); 10 setBackground(Color.CYAN); 11 for(int i=0;i<scores.size();i++) 12 { 13 ran.add(scores.get(i)); 14 System.out.println(scores.get(i)); 15 } 16 17 setTitle("绘制柱形图"); 18 setSize(600, 400); 19 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 20 } 21 @Override 22 public void paint(Graphics g){ 23 int Width = getWidth(); 24 int Height = getHeight(); 25 int leftMargin = 20;//柱形图左边界 26 int topMargin = 50;//柱形图上边界 27 Graphics2D g2 = (Graphics2D) g; 28 g2.setColor(Color.WHITE);//绘制白色背景 29 g2.fillRect(0, 0, Width, Height-100);//绘制矩形图 30 g2.setColor(Color.black); 31 for(int i=0;i<=10;i++) 32 { 33 //绘制灰色横线和百分比 34 g2.drawString((100-10*i)+"", 15, topMargin+30*i); 35 g2.drawLine(5, topMargin+30*i, Width, topMargin+30*i);//绘制灰色横线 36 } 37 g2.setColor(Color.BLUE); 38 for(int i=0;i<=ran.size();i++) 39 { 40 //绘制柱形图 41 int step = (i+1)*40;//设置每个柱形图的水平间隔为40 42 //绘制矩形 43 g2.fillRoundRect(leftMargin+step*2-5,(100-ran.get(i))*3+50, 40, 300-(100-ran.get(i))*3, 40, 10); 44 //列出测试轮数 45 g2.drawString("第"+(i+1)+"轮", leftMargin+step*2, 380); 46 } 47 } 48 }
程序运行
1. 题库中存放10000道四则运算题目。
2. 注册,点击“注册”按钮,输入用户名和密码,注册成功。
注册成功之后,可在数据库中看到用户名和密码已经存入。
3. 登陆,输入用户名和密码,点击“登陆”按钮。
4. 登陆成功之后,进入答题界面。
5. 点击“开始测试”按钮,进入“第一轮”答题,计时开始。
6. 点击“下一题”按钮后,题号加1,换下一个题;如果用户输入的答案正确,则得分加5,否则不变。
7. 每20道题为一轮,当做完一轮时,“下一题”按钮变为“提交”,并弹出提示对话框,如下图所示。若用户选择“是”,则进入下一轮;若选择“否”,则“下一题”按钮“答题结束”,再点此按钮时无响应。
8. 答题结束后,点击“成绩图表”按钮可查看前几轮答题的成绩柱状图,如下图所示。
结对过程
在本次结对项目中,我和我的小伙伴先一起讨论完成此项目的流程,我们各自提出自己的观点,通过分析各自观点的可行性和优缺点,最后达成一致,我们确定了项目的设计流程和实现方案。我们根据各自的擅长将任务分为两部分,我的小伙伴负责连接数据库,将题目存放到数据库中,并实现注册和登陆;而我负责搭建答题界面,并实现该软件的答题,加分,计时等功能。就这样,一个很庞大的项目变得简单化、条理化。两人在实施计划过程中频繁交流,遇到问题时一起解决,下面附上我和我的小伙伴结对编程时的丑照。
项目PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
120 |
150 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
80 |
100 |
Development |
开发 |
800 |
600 |
Analysis |
需求分析 (包括学习新技术) |
100 |
80 |
Design Spec |
生成设计文档 |
60 |
60 |
Design Review |
设计复审 (和同事审核设计文档) |
40 |
30 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
60 |
50 |
Design |
具体设计 |
240 |
200 |
Coding |
具体编码 |
600 |
700 |
Code Review |
代码复审 |
60 |
60 |
Test |
测试(自我测试,修改代码,提交修改) |
240 |
300 |
Reporting |
报告 |
120 |
140 |
Test Report |
测试报告 |
30 |
25 |
Size Measurement |
计算工作量 |
30 |
30 |
Postmortem & Process Improvement Plan |
事后总结 ,并提出过程改进计划 |
30 |
20 |
我的小伙伴
我的小伙伴是个很认真、负责的菇凉,因为我们本身就是好朋友,所以交流起来很方便,不会因为意见不同而发生争吵,也不会斤斤计较,完成项目的整个过程中我们都是很友好的状态。我们有着共同的目标,那就是齐心协力完成好这次作业。在此过程中我们也遇到很多问题,但是我们都没有推卸责任,而是积极探讨、一起解决,解决问题后两个人就特别激动。
浅谈个人体会
通过本次项目,我体会到合作共赢的精髓,感受到结对编程真的能够带来1+1>2的效果。一个庞大的项目让一个人来完成,无论是精力、时间,还是知识储备都是一个大的挑战,有句俗话说得好:“三个臭皮匠顶一个诸葛亮”,如果一个人去完成这个项目,可能会很困难,但是,当两个人的力量汇聚到一起时会变得轻松许多,因为这将使两个人扬长避短,各自发挥优势,聚集两个人的智慧共同克服难题,比如,我们在最后绘制柱状图时,图的实际高度和正确高度总是有一定差别,自己想了很久都没改合适,最后我们通过搜索相关方法,一起研究和尝试,最终克服了难题。对于彼此不懂的地方我们相互讲解,这也是一个学习、成长的过程,让我进一步学会人与人之间如何更好的沟通交流,提升了自己的团队合作能力。