《小学四则运算练习软件》
源码在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 }
View Code
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 | 需求分析 (包括学习新技术) | ||
Design Spec | 生成设计文档 | 60 | |
Design Review | 设计复审 (和同事审核设计文档) | 40 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 50 | |
Design | 具体设计 | 240 | 200 |
Coding | 具体编码 | 700 | |
Code Review | 代码复审 | ||
Test | 测试(自我测试,修改代码,提交修改) | 300 | |
Reporting | 报告 | 140 | |
Test Report | 测试报告 | 25 | |
Size Measurement | 计算工作量 | ||
Postmortem & Process Improvement Plan | 事后总结 ,并提出过程改进计划 | 20 |
我的小伙伴
我的小伙伴是个很认真、负责的菇凉,因为我们本身就是好朋友,所以交流起来很方便,不会因为意见不同而发生争吵,也不会斤斤计较,完成项目的整个过程中我们都是很友好的状态。我们有着共同的目标,那就是齐心协力完成好这次作业。在此过程中我们也遇到很多问题,但是我们都没有推卸责任,而是积极探讨、一起解决,解决问题后两个人就特别激动。
浅谈个人体会
通过本次项目,我体会到合作共赢的精髓,感受到结对编程真的能够带来1+1>2的效果。一个庞大的项目让一个人来完成,无论是精力、时间,还是知识储备都是一个大的挑战,有句俗话说得好:“三个臭皮匠顶一个诸葛亮”,如果一个人去完成这个项目,可能会很困难,但是,当两个人的力量汇聚到一起时会变得轻松许多,因为这将使两个人扬长避短,各自发挥优势,聚集两个人的智慧共同克服难题,比如,我们在最后绘制柱状图时,图的实际高度和正确高度总是有一定差别,自己想了很久都没改合适,最后我们通过搜索相关方法,一起研究和尝试,最终克服了难题。对于彼此不懂的地方我们相互讲解,这也是一个学习、成长的过程,让我进一步学会人与人之间如何更好的沟通交流,提升了自己的团队合作能力。