小学四则运算练习软件

《小学四则运算练习软件》

源码在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     } 
View Code

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     }  
View Code

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:
","注册",JOptionPane.PLAIN_MESSAGE,null,null,"在这输入");   
121            String pas=(String) JOptionPane.showInputDialog(null,"请输入你的密码:
","注册",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 } 
View Code

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  }
View Code

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 }
View Code

程序运行

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的效果。一个庞大的项目让一个人来完成,无论是精力、时间,还是知识储备都是一个大的挑战,有句俗话说得好:“三个臭皮匠顶一个诸葛亮”,如果一个人去完成这个项目,可能会很困难,但是,当两个人的力量汇聚到一起时会变得轻松许多,因为这将使两个人扬长避短,各自发挥优势,聚集两个人的智慧共同克服难题,比如,我们在最后绘制柱状图时,图的实际高度和正确高度总是有一定差别,自己想了很久都没改合适,最后我们通过搜索相关方法,一起研究和尝试,最终克服了难题。对于彼此不懂的地方我们相互讲解,这也是一个学习、成长的过程,让我进一步学会人与人之间如何更好的沟通交流,提升了自己的团队合作能力。

原文地址:https://www.cnblogs.com/rucr/p/8710014.html