博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 一、项目源码

 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的效果吗?通过这次结对编程,请谈谈你的感受和体会

  通过此次结对实验比起以往单个做实验效率提高了许多,并且也充满了许多乐趣,感觉编程也不是那么枯燥的,而且遇到问题是,我们总能讨论解决,虽然偶尔有争吵,不过我们总能达成一致意见。