一、项目源码
https://github.com/ijinping/demo2
二、项目报告
1、需求分析
(1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
(2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
三.实现程度
因为小组基础能力较差,只是初步实现了试题随机生成,以及校验功能,未能实现程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,在此向老师做深刻检讨,会尽快努力补齐以前遗留知识问题。
四.程序流程图
五.核心代码展示
<界面设计>
public void init(){
setLayout(null);
setSize(450,630);
labRule.setText("规则:每组二十道题,每题5分,按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);
}
<题目生成>
public void keyReleased(KeyEvent e) {
}
}
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;
}
<判断结果>
public void judge(ActionEvent e){
try{
double value=Double.parseDouble(txtAnswer.getText());
String resultStr=(total+1)+"、 "+a+op+b+"="+value;
if(value==result){
resultStr+=" \t正确";
right++;
score+=5;
}else{
resultStr+=" \t错误 正确答案:"+result;
error++;
}
listDisp.add(resultStr);
total++;
}catch(NumberFormatException ignored){
}
}
<统计分数>
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;
}
<校验输入是否位数字>
public boolean isNumber(String numberStr){
boolean isNumber=true;
try{
Double.parseDouble(numberStr);
}catch(NumberFormatException e){
isNumber=false;
}
return isNumber;
}
六.程序运行
七.结对伙伴
八.此次结对作业的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的效果吗?通过这次结对编程,请谈谈你的感受和体会
通过此次结对实验比起以往单个做实验效率提高了许多,并且也充满了许多乐趣,感觉编程也不是那么枯燥的,而且遇到问题是,我们总能讨论解决,虽然偶尔有争吵,不过我们总能达成一致意见。