Github地址:https://github.com/mazhongshan/demo2
1.需求分析:
(1)随机选择20道混合运算;
(2)用户输入答案,给出结果;
(3)程序检查答案结果,正确计5分,错误不计分;
(4)20道测试题结束给出总分;
(5)带括号算式,真分数算式;
(6)程序允许用户进行多轮测试,给出多轮测试分数柱状图;
(7)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次结果,并询问用户可否进行新一轮测试;
(8)测试有记时功能,动态显示答题后的消耗时间;
(9)程序人机交互界面是GUI界面;
2.功能设计:
(1)算式引用实验二的代码;
(2)生成的题库显示在QuestionBank.docx 中;并随机产生20道算式;
(3)调用包JfreeChart-1.0.13包;来生成柱状图;
(4)倒计时用Thread.sleep和循环来完成;
(5)多轮测试弹出框用JOptionPane类来完成;
3.设计实现:
(1)随机产生的20道算式放在ArrayList集合中,然后传参调入Gu类中;
(2)倒计时时间设置为30分钟,以消耗的形式动态展现;
(3)随机产生的算式得出的结果放在counter中,然后以传参形式放在Score类中,形成柱状图;
4.核心代码:
Gu类(界面)
package cn.longteng.demo; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.FileNotFoundException; import java.util.ArrayList; import javax.swing.*; public class Gu extends JFrame { static JFrame j; static JPanel jp, p1, p2; JLabel[] lab = new JLabel[20]; JLabel[] lab3 = new JLabel[20]; static JTextField[] txt = new JTextField[20]; static JButton btn; static JLabel lab1; String[] str = new String[200]; int[] num = new int[200]; String[] sr = new String[20]; static int[] nm = new int[20]; static long time = 1800; static Main m = new Main(); static int[] res=new int[20]; static int counter=0; static String[] srs=new String[20]; static int n; static int w; static ArrayList<Integer> lis=new ArrayList(); public Gu() { } public void Jiemian(){ j = new JFrame("小学生在线混合运算题库"); j.setSize(1366, 735); jp = new JPanel(); jp.setLayout(new BorderLayout()); p1 = new JPanel(); p1.setLayout(new BorderLayout()); p2 = new JPanel(); p2.setLayout(new GridLayout(10, 5, 10, 40)); btn = new JButton("提交"); lab1 = new JLabel(); for (int k = 0; k < 20; k++) { lab[k] = new JLabel(""); txt[k] = new JTextField(" "); lab3[k] = new JLabel(" "); } for (int i = 0; i < 20; i++) { p2.add(lab3[i]); p2.add(lab[i]); p2.add(txt[i]); } p1.add(lab1, BorderLayout.WEST); p1.add(btn, BorderLayout.EAST); j.add(jp); jp.add(p1, BorderLayout.NORTH); jp.add(p2, BorderLayout.CENTER); j.setVisible(true); j.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); } public void SetLab(Main s) { try { s.Num(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.str = Main.ts; this.num = Main.s; int i = 0; for (int l = 0; l < 200; l = l + 10) { while (i < 20) { sr[i] = str[l]; nm[i] = num[l]; lab[i].setText(sr[i]); i++; break; } } } public void Time() { while(time >0) { long mm = time / 60 % 60; long ss = time % 60; lab1.setText("剩余答题时间:" + mm + ":" + ss); time--; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void Chann(){ btn.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getSource()==btn){ for(int x=0;x<20;x++){ srs[x]=txt[x].getText().replaceAll(" ",""); if(srs[x].equals("")){ res[x]=0; } else{ res[x]=Integer.parseInt(srs[x].replaceAll(" ", "")); if(res[x]==nm[x]){ counter+=5; } } } lis.add(counter); n=JOptionPane.showConfirmDialog(j, "是否提交?","系统提示",JOptionPane.INFORMATION_MESSAGE); if(n==JOptionPane.YES_OPTION){ j.dispose(); w++; new Score(); } else{ return; } } } }); } public void Ch(){ if(time==0){ for(int k=0;k<20;k++){ srs[k]=txt[k].getText().replaceAll(" ",""); if(srs[k].equals("")){ res[k]=0; }else{ res[k]=Integer.parseInt(srs[k].replaceAll(" ", "")); if(res[k]==nm[k]){ counter+=5; } } } lis.add(counter); j.dispose(); w++; new Score(); } } }
Score类
package cn.longteng.demo; import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JOptionPane; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.BarRenderer3D; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; public class Score extends JFrame{ ChartPanel frame1; static JFrame frame; static Gu gu=new Gu(); static Main m = new Main(); static ArrayList<Integer> lis=new ArrayList(); public Score(){ CategoryDataset dataset=getData(gu); JFreeChart chart=ChartFactory.createBarChart3D("小学生在线测试分数结果", "测试的次数", "分数", dataset, PlotOrientation.VERTICAL, true, false,false); CategoryPlot plot=chart.getCategoryPlot(); CategoryAxis domainAxis=plot.getDomainAxis(); domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14)); //水平底部标题 domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题 domainAxis.setUpperMargin(0.2); //设置距离图片右端距离 domainAxis.setLowerMargin(0.1); //透明度 // plot.setForegroundAlpha(1.0f); ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状 rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15)); chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15)); chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体 BarRenderer3D renderer = new BarRenderer3D();//3D属性修改 plot.setRenderer(renderer);//将修改后的属性值保存到图中 renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true); renderer.setBaseItemLabelPaint(Color.BLUE);// frame1=new ChartPanel(chart,true); frame=new JFrame("小学生在线混合运算测试统计图"); frame.setLayout(new GridLayout(2,2,10,10)); frame.add(getChartPanel()); //添加柱形图 frame.setBounds(300, 50, 600, 650); frame.setVisible(true); Clos(); } public CategoryDataset getData(Gu g) { // TODO Auto-generated method stub DefaultCategoryDataset dataset = new DefaultCategoryDataset(); this.lis=g.lis; for(int i=0;i<g.w;i++){ dataset.addValue(lis.get(i),"","第"+i+"轮测试"); } return dataset; } public ChartPanel getChartPanel(){ return frame1; } public static void Clos(){ frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ int i=JOptionPane.showConfirmDialog(null, "是否再次测试","系统提示",JOptionPane.INFORMATION_MESSAGE); if(i==JOptionPane.YES_OPTION){ Gu g = new Gu(); g.Jiemian(); g.SetLab(m); g.Chann(); frame.dispose(); //g.Time(); g.Ch(); } else { System.exit(0); } } }); } }
5.测试结果截图:
结对时照片及评价:虽然我们两个编程能力不好,但是我们两个都积极的参与到其中了,尤其是我们两个在柱状图这一块,讨论的尤其激烈。我的小伙伴很固执(我只能呵呵一笑),最后还是采用了他的方法,果然在后期编程中很轻松。我觉得这小子还是一个有想法的人。
6.PSP:
PSP2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成的时间(min) |
planning | 计划 |
20 |
40 |
Estimate | 估计这个任务需要多少时间 |
30 |
45 |
Development | 开发 |
100 |
120 |
Analysis | 需求分析 |
8 |
10 |
Design Spec | 生成设计文档 |
8 |
19 |
Design Review | 设计审查 |
5 |
5 |
Coding Standard | 代码规范 |
14 |
9 |
Design | 具体设计 |
20 |
31 |
Coding | 具体编码 |
60 |
110 |
Code Review | 代码复审 |
38 |
15 |
Test | 测试(自我测试,修改代码,提交修改) |
8 |
20 |
Reporting | 报告 |
16 |
14 |
Test Report | 测试报告 |
10 |
13 |
Size Measurement | 计算工作量 |
4 |
6 |
Postmortem & Process Improvement |
事后总结 | 10 | 12 |
7.总结:
本次实验中同过结对编程,学到了很多东西,在以往的学习中没有体会到结对编程的快乐,两个人坐在一起,讨论,争辩,最后采用方法。在交流与学习的过程中,既掌握了知识,又学到了他人的一些思想与方法,这是我觉得本次实验中学到的最重要的东西。尼补了以往结对编程的空白。我也相信在以后的编程中,这种结对编程的方法与思想会一直持续下去。