github 源码地址:https://github.com/yanlong001/demo3
小伙伴学号:201571030308
需求分析:
(1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
(2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
核心代码展示:
界面
int a=0,b=0; String op=""; double result=0; DecimalFormat df=new DecimalFormat("#.00"); /** * 出题方法 * @param e */ public void updateQuestion(ActionEvent e){ if(isFirst){ startTime=System.currentTimeMillis(); } if(isOver==true){ listDisp.clear(); listScore.clear(); labResult.setVisible(false); listScore.setVisible(false); } isOver=false; a=(int)(Math.random()*9+1); b=(int)(Math.random()*9+1); int c=(int)(Math.random()*4); switch (c) { case 0: op="+"; result=a+b; break; case 1: op="-"; result=a-b; break; case 2: op="*"; result=a*b; break; case 3: op="/"; result=(a*1.0)/b; //若两个数除不尽,则按四舍五入保留2位小数 if(String.valueOf(result).length()>10){ result=Double.parseDouble(df.format((a*1.0)/b)); } break; } labA.setText(String.valueOf(a)); labB.setText(String.valueOf(b)); labOp.setText(op); label5.setText("="); txtAnswer.setText(""); isFirst=false; } /** * 判断结果 * @param e */ public void judge(ActionEvent e){ try{ double value=Double.parseDouble(txtAnswer.getText()); String resultStr=(total+1)+"、 "+a+op+b+"="+value; if(value==result){ resultStr+=" 正确"; right++; score+=5; }else{ resultStr+=" 错误 正确答案:"+result; error++; } listDisp.add(resultStr); total++; }catch(NumberFormatException ignored){ } } /** * 统计分数 * @param e */ public void scorePerformed(ActionEvent e){ isOver=true; listScore.clear(); listScore.setVisible(true); String exitStr="本次共答题"+total+"道"; listScore.add(exitStr); listScore.add("累计用时:"+(System.currentTimeMillis()-startTime)/1000+"秒"); listScore.add("答对:"+right+"个"); listScore.add("答错:"+error+"个"); listScore.add("得分:"+score+"分"); getContentPane().add(listScore); score=0; right=0; error=0; total=0; } //产生算是 /** * 校验输入是否位数字 * @param numberStr * @return */ public boolean isNumber(String numberStr){ boolean isNumber=true; try{ Double.parseDouble(numberStr); }catch(NumberFormatException e){ isNumber=false; } return isNumber; } }
出题并运算
import java.awt.Color; import java.awt.Font; import java.awt.Label; import java.awt.List; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.text.DecimalFormat; import javax.swing.JFrame; @SuppressWarnings("serial") public class Gui extends JFrame{ Label labRule=new Label();//规则描述标签 Label labA=new Label();//第一个数字标签 Label labOp=new Label();//加减乘除标签 Label labB=new Label();//第二个数字标签 Label label5=new Label();//等于号“=”标签 Label labWarn=new Label();//输入合法性校验提示标签 Label labQues=new Label();//答题列表标签 Label labResult=new Label();//判分标签 TextField txtAnswer=new TextField();//输入答案输入框 int total=0;//记录答题总数 int right=0;//记录答题正确数量 int error=0;//记录答题错误数量 int score=0;//记录答题总分 boolean isOver=false;//一轮结束后标识 boolean isFirst=true;//程序第一次运行标识 long startTime;//每一轮运行开始时间 List listDisp=new List();//答题列表展示框 List listScore=new List();//分数展示框 public static void main(String[] args){ Gui score=new Gui(); } public Gui(){ init(); setSize(450,630); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); } public void init(){ setLayout(null); setSize(450,630); labRule.setText("规则:每组十道题,每题10分,按ENTER键开始,小数保留2位"); labRule.setBounds(36, 10, 390, 72); labRule.setFont(new Font("Dialog",Font.PLAIN,12)); getContentPane().add(labRule); labA.setText("x"); labA.setBounds(36,82,36,36); labA.setFont(new Font("Dialog",Font.PLAIN,24)); getContentPane().add(labA); labOp.setText("+"); labOp.setFont(new Font("Dialog",Font.PLAIN,24)); labOp.setBounds(72, 82, 45, 36); getContentPane().add(labOp); labB.setText("y"); labB.setFont(new Font("Dialog",Font.PLAIN,24)); labB.setBounds(118, 82, 33, 36); getContentPane().add(labB); label5.setText("="); label5.setFont(new Font("Dialog",Font.PLAIN,24)); label5.setBounds(168, 82, 24, 36); getContentPane().add(label5); labWarn.setFont(new Font("Dialog",Font.PLAIN,12)); labWarn.setBackground(Color.RED); labWarn.setBounds(320, 82, 80, 36); labWarn.setVisible(false); getContentPane().add(labWarn); labQues.setText("答题列表:"); labQues.setFont(new Font("Dialog",Font.PLAIN,12)); labQues.setBounds(36, 148, 100, 20); getContentPane().add(labQues); labResult.setText("分数统计:"); labResult.setFont(new Font("Dialog",Font.PLAIN,12)); labResult.setBounds(36,420,100,20); labResult.setVisible(false); getContentPane().add(labResult); txtAnswer.setFont(new Font("Dialog",Font.PLAIN,24)); txtAnswer.setBounds(216, 82, 100, 36); getContentPane().add(txtAnswer); listDisp.setFont(new Font("Dialog",Font.PLAIN,16)); listDisp.setBounds(36, 174, 282, 230); getContentPane().add(listDisp); listScore.setFont(new Font("Dialog",Font.PLAIN,16)); listScore.setBounds(36,450,282,135); MyKey myKey=new MyKey();// 答案输入框,键盘按键监听类 txtAnswer.addKeyListener(myKey); } class MyKey implements KeyListener{ @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { if(e.getSource()==txtAnswer){ if(e.getKeyCode()==KeyEvent.VK_ENTER){ if(isOver || isFirst){ updateQuestion(null); }else if("".equals(txtAnswer.getText())){ labWarn.setText("请输入答案!"); labWarn.setVisible(true); }else{ labWarn.setVisible(false); if(!isNumber(txtAnswer.getText())){ labWarn.setText("请输入数字!"); labWarn.setVisible(true); }else if(total<19){ judge(null); updateQuestion(null); }else{ judge(null); labResult.setVisible(true); scorePerformed(null); } } } } } @Override public void keyReleased(KeyEvent e) { } }
运行截图:
结对:
psp:
PSP2.1 | 任务内容 | 计划完成的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
PLanning | 计划 | 50 | 80 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 40 | 60 |
Developmet | 开发 | 600 | 800 |
Analysis | 需求分析(包括学习新技术) | 30 | 40 |
Design Spec | 生成设计文档 | 20 | 25 |
Design Revie | 设计复审(和同事审核设计文档) | 20 | 30 |
Coding Standard | 代码规范 | 120 | 240 |
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 300 | 420 |
Code Review | 代码复审 | 30 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | 30 | 40 |
Test Report | 测试报告 | 20 | 20 |
Size Measurement | 计算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改机计划 | 40 | 45 |
汉堡评价小伙伴:
本次实验中,开始我们都有很多问题,针对这些问题我们进行了积极地讨论,我的小伙伴他提多了很多自己的想法,后期还对我们的代码和界面进行了优化,这对我们来说不仅是完成了一次作业,而且让我们对合作有了进一步的理解,我们试着去接受对方的想法,通过本次实验我们的水平也有所提高。
结对编程真的能够带来1+1>2的效果吗?
对于这个问题,我想答案是肯定的,一个人的能力毕竟有限,但合作的力量就不一样了,出现问题时一个人可能解决不了,但是两个人积极讨论就能解决了,每个人都有自己擅长的领域,也有自己的不足,两个人取长补短,就能达到1+1>2的效果。