- Github地址 :https://github.com/Ahmatjan-IT/sizeyunsuanGUI
- 队友博客地址:http://www.cnblogs.com/dyh666/p/8719185.html
一丶需求分析
- 本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具有以下功能:
- 由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
- 题库自动生成;
- 程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
- 程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
- 程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
- 测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
- 程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
二丶软件设计:使用类图
三丶核心功能代码
1 import java.util.ArrayList; 2 3 public class SetAQuestion { 4 int n; 5 int next,time; 6 String topic; 7 GetRandomDigit grd=null; 8 ArrayList<Topic> al; 9 Topic question; 10 ArithmeticResult ar; 11 public void setAQuestion(int n){ 12 this.n=n; 13 init(); 14 setQuestion(); 15 } 16 17 18 public void init(){ 19 grd=new GetRandomDigit(); 20 al=new ArrayList<Topic>(); 21 ar=new ArithmeticResult(); 22 } 23 24 public ArrayList<Topic> getQuestion(){ 25 return al; 26 } 27 28 public void setQuestion(){ 29 //出题的数量 30 int[] questionTopic;; 31 int[] questionOprator; 32 for(int i=0;i<n;i++){ 33 //出题的长度 34 time=grd.Time(); 35 questionTopic=new int[time]; 36 questionOprator=new int[time-1]; 37 for(int t=0;t<time;t++){ 38 questionTopic[t]=grd.randomDigit(); 39 if(t<time-1){ 40 questionOprator[t]=grd.oprator(); 41 } 42 } 43 topic=""; 44 int bracketsIndex=-1; 45 if(PQ()){ 46 bracketsIndex=grd.BracketsIndex(time); 47 } 48 for(int t=0;t<time;t++){ 49 if(bracketsIndex==t){ 50 topic=topic+"("; 51 } 52 53 topic=topic+questionTopic[t]; 54 if(bracketsIndex+1==t && bracketsIndex!=-1){ 55 topic=topic+")"; 56 } 57 if(t<time-1){ 58 topic=topic+getType(questionOprator[t]); 59 } 60 } 61 topic=topic+"="; 62 double a=ar.Result(topic); 63 if(a<0||a%1!=0||a>500){ 64 i--; 65 continue; 66 } 67 question=new Topic(topic,(int)a); 68 al.add(question); 69 } 70 } 71 72 String getType(int type){ 73 if(type==1){ 74 return "+"; 75 }else if(type==2){ 76 return "-"; 77 }else if(type==3){ 78 return "×"; 79 }else{ 80 return "÷"; 81 } 82 } 83 84 boolean PQ(){ 85 int PQ=grd.probabilityQuestion(); 86 if(PQ<=120){ 87 return true; 88 }else{ 89 return false; 90 } 91 } 92 }
1 import java.awt.GridLayout; 2 import java.awt.event.ActionEvent; 3 import java.awt.event.ActionListener; 4 5 import javax.swing.JButton; 6 import javax.swing.JFrame; 7 import javax.swing.JLabel; 8 import javax.swing.JPanel; 9 import javax.swing.JTextField; 10 11 @SuppressWarnings("serial") 12 public class MyPanel extends JFrame{ 13 JLabel name,pass,kong; 14 JTextField nameText,passText; 15 JPanel jp1,jp2; 16 JButton ok,quit; 17 public MyPanel(){ 18 init(); 19 addAction(); 20 this.setTitle("欢迎登陆"); 21 this.setSize(600,200); 22 this.setLocationRelativeTo(null); 23 this.setVisible(true); 24 this.setResizable(false); 25 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 26 this.setLayout(new GridLayout(2,1)); 27 28 } 29 30 private void init(){ 31 name=new JLabel("姓名"); 32 pass=new JLabel("密码"); 33 kong=new JLabel(" "); 34 nameText=new JTextField(20); 35 passText=new JTextField(20); 36 jp1=new JPanel(); 37 jp2=new JPanel(); 38 ok=new JButton("登陆"); 39 quit=new JButton("退出"); 40 addFrame(); 41 } 42 43 private void hideFrame(){ 44 this.setVisible(false); 45 } 46 47 private void addFrame(){ 48 jp1.add(name); 49 jp1.add(nameText); 50 jp1.add(kong); 51 jp1.add(pass); 52 jp1.add(passText); 53 jp2.add(ok); 54 jp2.add(quit); 55 this.add(jp1); 56 this.add(jp2); 57 } 58 59 private void addAction(){ 60 quit.addActionListener(new ActionListener() { 61 62 @Override 63 public void actionPerformed(ActionEvent e) { 64 // TODO Auto-generated method stub 65 System.exit(0); 66 } 67 }); 68 ok.addActionListener(new ActionListener() { 69 70 @Override 71 public void actionPerformed(ActionEvent e) { 72 // TODO Auto-generated method stub 73 String name=nameText.getText().toString(); 74 String pass=passText.getText().toString(); 75 if(name.equals("admin")&&pass.equals("admin")){ 76 hideFrame(); 77 new QuestionPanel(); 78 } 79 } 80 }); 81 } 82 } 83 84 85 86 87 88 import java.awt.BorderLayout; 89 import java.awt.FlowLayout; 90 import java.awt.GridLayout; 91 import java.awt.event.ActionEvent; 92 import java.awt.event.ActionListener; 93 import java.util.ArrayList; 94 95 import javax.swing.JButton; 96 import javax.swing.JFrame; 97 import javax.swing.JLabel; 98 import javax.swing.JPanel; 99 import javax.swing.JTextField; 100 @SuppressWarnings("serial") 101 public class QuestionPanel extends JFrame{ 102 JPanel jp1,jp2,jp3; 103 JButton ok,endQuestion; 104 JLabel timesLabel; 105 JTextField times; 106 JPanel[] question; 107 JLabel[] questionLabel; 108 JTextField[] questionText; 109 SetAQuestion saq; 110 ArrayList<Topic> al; 111 public QuestionPanel(){ 112 init(); 113 addPanel(); 114 addAction(); 115 this.setTitle("欢迎使用四则运算答题界面"); 116 this.setSize(860,350); 117 this.setLocationRelativeTo(null); 118 this.setVisible(true); 119 this.setResizable(false); 120 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 121 this.setLayout(new BorderLayout()); 122 } 123 124 private void addPanel(){ 125 for(int i=0;i<25;i++){ 126 question[i].add(questionLabel[i]); 127 question[i].add(questionText[i]); 128 jp2.add(question[i]); 129 } 130 jp1.add(timesLabel); 131 jp1.add(times); 132 jp1.add(ok); 133 jp3.add(endQuestion); 134 this.add(jp1,BorderLayout.NORTH); 135 this.add(jp2, BorderLayout.CENTER); 136 this.add(jp3, BorderLayout.SOUTH); 137 } 138 139 private void init(){ 140 jp1=new JPanel(); 141 jp2=new JPanel(); 142 jp3=new JPanel(); 143 saq=new SetAQuestion(); 144 ok=new JButton("开始答题"); 145 timesLabel=new JLabel("答对题目数量"); 146 endQuestion=new JButton("提交"); 147 endQuestion.setEnabled(false); 148 times=new JTextField(6); 149 times.setEnabled(false); 150 jp2.setLayout(new GridLayout(5, 5)); 151 question=new JPanel[25]; 152 questionLabel=new JLabel[25]; 153 questionText=new JTextField[25]; 154 for(int i=0;i<25;i++){ 155 question[i]=new JPanel(); 156 question[i].setLayout(new FlowLayout(FlowLayout.RIGHT)); 157 questionLabel[i]=new JLabel("? * ? = "); 158 questionText[i]=new JTextField(4); 159 } 160 } 161 private void addAction(){ 162 ok.addActionListener(new ActionListener() { 163 164 @Override 165 public void actionPerformed(ActionEvent e) { 166 // TODO Auto-generated method stub 167 saq.setAQuestion(25); 168 al=saq.getQuestion(); 169 for(int i=0;i<25;i++){ 170 questionLabel[i].setText(al.get(i).getTopic()); 171 questionText[i].setText(""); 172 } 173 ok.setEnabled(false); 174 endQuestion.setEnabled(true); 175 } 176 }); 177 endQuestion.addActionListener(new ActionListener() { 178 179 @Override 180 public void actionPerformed(ActionEvent e) { 181 // TODO Auto-generated method stub 182 int result=0; 183 for(int i=0;i<25;i++){ 184 int questionResult=Integer.parseInt(questionText[i].getText()); 185 if(questionResult==al.get(i).getResult()){ 186 result++; 187 } 188 } 189 times.setText(String.valueOf(result)); 190 191 endQuestion.setEnabled(false); 192 ok.setEnabled(true); 193 ok.setText("再来一次"); 194 } 195 196 }); 197 } 198 }
四丶程序运行
1.登陆页面
2.点击开始答题进行答题
3.点击再来一次重新答题
.
五丶结对过程
六丶PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
30 |
20 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
30 |
20 |
Development |
开发 |
1200 |
1100 |
·· Analysis |
需求分析 (包括学习新技术) |
50 |
50 |
· Design Spec |
· 生成设计文档 |
50 |
50 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
100 |
100 |
· Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
50 |
50 |
· Design |
具体设计 |
200 |
100 |
· Coding |
具体编码 |
500 |
600 |
· Code Review |
· 代码复审 |
50 |
50 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
200 |
100 |
Reporting |
报告 |
44 |
30 |
·· Test Report |
· 测试报告 |
14 |
2 |
· Size Measurement |
计算工作量 |
10 |
8 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 |
20 |
20 |
七丶汉堡评价
我和我的小伙伴是一个宿舍的,我们平时也是很好的朋友,我俩的编程水平都很一般。这次我俩共同合作,又在好朋友的帮助下顺利完成了这次实验内容。从需求分析到PSP,我们共同提出意见,互相采纳各自的优点内容。他虽然编程水平不高,但他是一个非常有想法的人,包括对实验整体框架有独特的想法。这次的结对实验,很有趣,我们可以发现各自的优缺点,取长补短。非常希望之后还会有这类的合作项目。
八丶结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会。
1+1>2的效果这次很深刻地体现出来了,结对编程真的能够带来1+1>2的效果!之前一个人做的时候很迷茫,有很多不会的地方。这次有了合作伙伴,我俩各有自己的意见,互相采纳,互相帮助。有一些不会的地方通过我们一起讨论顺利的解决了。总之,结对编程可以提高我们的团队意识,提高了完成任务的效率。