zoukankan      html  css  js  c++  java
  • 201571030114/201571030143《小学四则运算练习软件》结对项目报告

    一:源码

           github地址https://github.com/Lei-surely/Project3

    二:项目报告 

    1:需求分析

    (1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;

    (2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:

                                    

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

    (4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:

                                         

    (5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;

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

    (7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。

    2. 软件设计:

                

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

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

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

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

    3. 核心功能代码展示:

         (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)显示测试结果

    private void registerListener() {
            btn_again.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    onceagain();                
                }    
            });
            
            btn_xianshi.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    File file = new File("answer.txt");
                    if (file.exists() && file.isFile()) {
                        try {
                            BufferedReader input = new BufferedReader(new FileReader(file));
                            String text;
                            while ((text = input.readLine()) != null)
                                r_answer.setText(r_answer.getText() + text + "
    ");
                        } catch (IOException ioException) {
                        System.err.println("File Error!");
                       }        
                    }                     
                    result();//显示测试结果函数调用
                    try {
                        compare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }                
                }            
            });
            btn_exit.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    onceagain();
                    
                }
                
            });
        }
    //显示测试结果
     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)绘制柱状图

    //绘制矩形  
    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);  

    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,一个人的时候出现了问题只能自己解决要花费很长的时间,结对编程两个人知识互补,问题很快就能得到解决。并且结对编程大大降低了出错率,为后面的代码测试和审查节省了好多时间,在结对编程的过程中两个人共同学习和解决问题,知识的提升也是大于二的。

  • 相关阅读:
    iview table的render()函数基本的用法
    【整理】iview Tree数据格式问题,无限递归树处理数据
    【整理】用JSON-server模拟REST API
    【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function
    【整理】 vue-cli 打包后显示favicon.ico小图标
    【整理】treeGrid 树形表格
    【整理】iview中刷新页面的时候更新导航菜单的active-name
    [整理] webpack+vuecli打包生成资源相对引用路径与背景图片的正确引用
    在.vue文件中让html代码自动补全的方法(支持vscode)
    解决VSCode中使用vetur插件格式化vue文件时,js代码会自动加上冒号和分号
  • 原文地址:https://www.cnblogs.com/Lei-surely/p/8688204.html
Copyright © 2011-2022 走看看