• 201571030143/201571030114《小学四则运算练习软件》结对项目报告


    一、项目源码

      GitHub的链接地址:https://github.com/Lei-surely/Project3

    二、项目报告

    1.需求分析

      (1)程序能够从题库随机选择20道混合运算,用户输入答案,程序检查答案是否正确,每道题正确计5分,测试结束后给出总分;

      (2)题库文件生成采用实验二的方式自动生成;

      (3)程序提供三种练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;

      (4)程序允许进行多轮测试,并用柱状图显示多轮测试分数;

      (5)测试有计时功能,测试时动态显示用户开始答题后的消耗时间;

      (6)程序人机交界面是GUI界面,界面支持中文简体,用户可以进行语种选择。

    2.软件设计

      程序设计的类图如下:

                        

      (1)MainTest()类:调用四则运算模块,即MyFrame()类。

      (2)MyFrame()类:点击开始测试按钮,调用CalTest()类,生成题库;点击提交按钮,调用Submit()类,统计结果按钮调用Chart()类,显示多轮答题结果的柱状图。

      (3)Submit()类:显示本轮测试的正确答案以及用户提交的答案以及测试的正确率,并让用户选择是进行下一轮还是返回统计结果界面。

      (4)CalTest():运算式生成,实现了随机生成一百以内的混合运算。

    3.核心代码展示

      (1)计算四则运算界面监听器

     1 //注册监听
     2         private void registerListener() {
     3             //计时
     4             Timer timer = new Timer(1000, new ActionListener() {
     5                 public void actionPerformed(ActionEvent e) {
     6                     Date now2 = new Date(now.getTime() + 1000);
     7                     now = now2;
     8                     SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
     9                     lbl.setText(formatter.format(now));
    10                 }
    11             });
    12             btn_begin.addActionListener(new ActionListener() {
    13                 public void actionPerformed(ActionEvent arg0) {
    14                     //开始测试函数调用
    15                     begin();
    16                     timer.start();
    17                 }                
    18             });
    19             btn_tj.addActionListener(new ActionListener() {
    20                 public void actionPerformed(ActionEvent arg0) {
    21                     timer.stop();
    22                     try {
    23                         submit();
    24                     } catch (IOException e) {
    25                         e.printStackTrace();
    26                     }
    27                 }
    28             });
    29             btn_js.addActionListener(new ActionListener() {
    30                 @Override
    31                 public void actionPerformed(ActionEvent arg0) {
    32                     //统计结果函数
    33                     counts();
    34                 }                
    35             });
    36         }

      (2)显示测试结果

     1  //显示测试结果
     2     public void result() {
     3         File file = new File("result.txt");
     4         if (file.exists() && file.isFile()) {
     5             try {
     6                 BufferedReader input = new BufferedReader(new FileReader(file));
     7                 String text;
     8                 while ((text = input.readLine()) != null)
     9                     my_answer.setText(my_answer.getText() + text + "
    ");
    10             } catch (IOException ioException) {
    11             System.err.println("File Error!");
    12            }        
    13         }
    14     }
    15     
    16     //比较结果
    17     public int compare() throws IOException {
    18         //封装数据源
    19         BufferedReader br_a = new BufferedReader(new FileReader("answer.txt"));
    20         BufferedReader br_r = new BufferedReader(new FileReader("result.txt"));
    21         //封装目的地
    22         ArrayList<String> answer = new ArrayList<String>();
    23         ArrayList<String> result = new ArrayList<String>();
    24         //读取数据写到集合中
    25         String line1 = null;
    26         String line2 = null;
    27        
    28         while((line1 = br_a.readLine())!= null){
    29             answer.add(line1);
    30         }
    31         while((line2 = br_r.readLine())!= null){
    32             result.add(line2);
    33         }
    34         //遍历进行比较并计算正确率
    35         int i=0;
    36         int count=0;
    37         for(i=0;i<answer.size();i++) 
    38         {
    39             String s1=answer.get(i);
    40             String s2=result.get(i);
    41             if(s1.equals(s2)) 
    42             {
    43                 count++;                        
    44             }                
    45         }
    46         NumberFormat numberFormat = NumberFormat.getInstance();    
    47         numberFormat.setMaximumFractionDigits(2);  
    48         String s3 = numberFormat.format((float) count / (float)answer.size() * 100);   
    49         correct.setText("您做对了"+count+"道, "+"正确率为:"+String.valueOf(s3)+"%");
    50         int b=count*5;
    51         return b;
    52     }

      (3)绘制柱状图

     1 public void paint(Graphics g){ 
     2     SubFrame subframe= new SubFrame("结果");
     3     subframe.setVisible(false);
     4     int a=0;
     5     try {
     6         a = subframe.compare();
     7     } catch (IOException e) {
     8     e.printStackTrace();
     9     }
    10     String s=String.valueOf(a);
    11                 
    12     int Width = getWidth();  
    13     int Height = getHeight();  
    14     int leftMargin = 20;//柱形图左边界   
    15     Graphics2D g2 = (Graphics2D) g;   
    16     int height = Height/11;//将当前的高度平分为11个单位  
    17     g2.setColor(Color.LIGHT_GRAY);//绘制灰色背景  
    18     g2.fillRect(0, 0, Width, Height);//绘制矩形图  
    19     g2.setColor(Color.GRAY);  
    20                 
    21     for(int i=0;i<=10;i++){  
    22         g2.drawString(String.valueOf(100-(10*i)), 20, height*i+44);//写下分数
    23         g2.drawLine(0, height*i+44, Width, height*i+44);//绘制横线  
    24     }  
    25     g2.setColor(Color.DARK_GRAY);
    26     for(int i=0;i<count_array.size();i++) {
    27         //绘制柱形图  
    28         int f = Integer.parseInt(count_array.get(i));
    29       //设置每隔柱形图的水平间隔为30
    30       int step = (i+1)*30;  
    31        //绘制矩形  
    32       g2.fillRoundRect(leftMargin+step*2, Height-(Height/110)*f-5, 30, (Height/110)*f-3,30, 0);    
    33         g2.drawString("第"+(i+1)+"轮", leftMargin+step*2,Height-(Height/110)*f-10);  
    34     }
    35 }                  

     4.程序运行界面

      (1)运行程序,点击开始测试按钮,开始计算,计时区域开始计时。

         

      (2)计算结束后,点击提交按钮,跳转到显示结果页面,点击显示结果按钮后,显示正确结果以及用户测试结果,并计算出正确率。

        

      (3)点击再来一轮后。页面返回开始测试页面,开始新一轮的计算,多轮计算后,统计结果并用柱状图显示出来

          

    5.结对编程过程(下图是我和小伙伴在一起编程时拍的照片)

                       

    6.PSP

    PSP2.1

    任务内容

    计划共完成需要的时间(min)

    实际完成需要的时间(min)

    Planning

    计划

    30

    40

    ·       Estimate

    ·  估计这个任务需要多少时间,并规划大致工作步骤

    30

    40

    Development

    开发

    600

    720

    ··       Analysis

      需求分析 (包括学习新技术)

    60

    90

    ·       Design Spec

    ·  生成设计文档

    30

    45

    ·       Design Review

    ·  设计复审 (和同事审核设计文档)

    20

    30

    ·       Coding Standard

      代码规范 (为目前的开发制定合适的规范)

    15

    20

    ·       Design

      具体设计

    40

    65

    ·       Coding

      具体编码

    400

    480

    ·       Code Review

    ·  代码复审

    30

    30

    ·       Test

    ·  测试(自我测试,修改代码,提交修改)

    25

    30

    Reporting

    报告

    30

    30

    ··       Test Report

    ·  测试报告

    15

    15

    ·       Size Measurement

      计算工作量

    10

    10

    ·       Postmortem & Process Improvement Plan

    ·  事后总结 ,并提出过程改进计划

    10

    15

    7.对小伙伴的评价

      由于我和小伙伴平时关系很好,因此这次结对编程项目合作的非常融洽,在整个分析、设计以及编程的过程中,我们两个人都是一起商量,一起编程的。她是一个非常有主见的人,在设计过程中我们先进行整体框架的搭建,她有几个比较好的想法,我们会进行讨论,然后择优而选。在遇见有分歧的想法时,我们会先把每个人的想法进行分析,指出对方没有考虑的部分,最后达成共识,也还算顺利的完成了这次的结对编程。总之,和小伙伴的合作还是非常愉快的呢,期待我们下一次的合作!

    8.结对编程真的能够带来1+1>2的效果吗?我的感受和体会如下:

      通过这次编程,我觉得能够带来1+1>2的效果,之前一个人做的时候,遇到不懂得问题时,就会陷入迷茫。当两个人一起编程时,有不懂的还可以一起讨论,说出自己的意见,也为整个编程过程节约了时间,但是这个的前提是有一个负责任的小伙伴,要有团队意识。在编程的过程中,我们有时遇到一个问题会卡住好长时间,但最终经过两个人的努力,解决了问题。最后在代码复审的时候两个人的效率也是很高的,出错的概率小,在我们的共同努力下,完成了这次编程,可见团队的合作在软件开发的过程中还是很重要的。

  • 相关阅读:
    switch 语句注意事项
    line-height 和 font-size的关系
    HTTP 缓存
    hashchange事件的认识
    面向对象的写法,见到就添,持续更新。。。
    chrome浏览器开发者工具之同步修改至本地
    history对象的一些知识点
    你不知道的函数节流,提高你的JS性能!
    玩媒体查询,就是这么简单粗暴!
    css中clip-path属性的运用
  • 原文地址:https://www.cnblogs.com/Ztian/p/8685672.html
Copyright © 2020-2023  润新知