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+=" \t正确";  
                right++;  
                score+=5;  
            }else{  
                resultStr+=" \t错误 正确答案:"+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计划5080
Estimate估计这个任务需要多少时间,并规划大致工作步骤4060
Developmet开发600800
Analysis需求分析(包括学习新技术)3040
Design Spec生成设计文档2025
Design Revie设计复审(和同事审核设计文档)2030
Coding Standard代码规范120240
Design具体设计6080
Coding具体编码300420
Code Review代码复审3040
Test测试(自我测试,修改代码,提交修改)2030
Reporting报告3040
Test Report测试报告2020
Size Measurement计算工作量2030
Postmortem & Process Improvement Plan事后总结,并提出过程改机计划4045

 
 
汉堡评价小伙伴:
本次实验中,开始我们都有很多问题,针对这些问题我们进行了积极地讨论,我的小伙伴他提多了很多自己的想法,后期还对我们的代码和界面进行了优化,这对我们来说不仅是完成了一次作业,而且让我们对合作有了进一步的理解,我们试着去接受对方的想法,通过本次实验我们的水平也有所提高。
 
结对编程真的能够带来1+1>2的效果吗?
对于这个问题,我想答案是肯定的,一个人的能力毕竟有限,但合作的力量就不一样了,出现问题时一个人可能解决不了,但是两个人积极讨论就能解决了,每个人都有自己擅长的领域,也有自己的不足,两个人取长补短,就能达到1+1>2的效果。

 

 

 

 

 

 

转载于:https://www.cnblogs.com/yanlong0017/p/8719222.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐