• 201571030103/201571030105 软件工程结对项目


    Git地址:https://github.com/djhdijd/bean1.git

    一.需求分析:

          设计开发一个小学生四则运算练习软件,使之具有以下功能:

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

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

     

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

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

     

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

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

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

    二.程序设计

    三.程序运行结果:

     

     点击提交答案后,答题结果存放在Grade.txt文本文档中。

    四.关键代码及说明

       其中真分数在输入输出时采用如下格式,真分数五分之三表示为3/5,真分数二又八分之三表示为2’3/8。
     
        //带参构函数,传入一个整数,生成小于该整数的分数对象
        public Number(int upperLimit)
        {
            Random random=new Random();
            Integer integer=random.nextInt(upperLimit);//因为生成部分的分数部分小,所以整数部分应该是生成自然数上1
            this.setInteger(integer);
            Integer denominator=random.nextInt(upperLimit)+1;//随机数生成的~upperLimit,为了排除分母为0的情况
            this.setDenominator(denominator);
            Integer molecule=random.nextInt(denominator)+1;//随机生成分子,同分母,排数分子为0的情况
            this.setMolecule(molecule);
        }
    public class MainFrame extends JFrame
    {
      
             MainMenuBar mainMenuBar=new MainMenuBar(this);//菜单
             ButtonLabel generatingItemButton=new ButtonLabel(Param.generatingItem);//生成按钮
             ButtonLabel beginButton=new ButtonLabel(Param.begin);//开始按钮
            TimeProgressBar timeProgressBar=new TimeProgressBar(this);
             JTextArea subjectArea=new JTextArea();//题目框
             JTextArea answerArea=new JTextArea();//答题区
            public ButtonLabel submitButton=new ButtonLabel(Param.submit);//提交按钮
          
             //构造函数
             public MainFrame()
             {
                 beginButton.setBounds(130, 20, 100, 30);
                 this.add(beginButton);
          
            //进度条
            timeProgressBar.setBounds(400, 20, 250, 30);
            this.add(timeProgressBar);
            
            
                 subjectArea.setEditable(false);
                 //给试题框出现滚动条
                 JScrollPane jssubjectArea=new JScrollPane(subjectArea);
                 jssubjectArea.setBounds(20, 100, 600, 150);
                 this.add(jssubjectArea);
          
            answerArea.setEditable(false);
                 //给答题框加设滚动条
                 JScrollPane jsanswerArea=new JScrollPane(answerArea);
                 jsanswerArea.setBounds(20, 300, 600, 150);
                 generatingItemButton.addMouseListener(new MouseAdapter() {
    
                     public void mousePressed(MouseEvent arg0) {                
                    subjectArea.setText("");
                    File answersFile = new File("file/Answers.txt");
                    FileWriter answersFw;
                         for(int i=0;i<Param.number;i++){
                             Formula formula = new Formula(Param.range);
                             String aFormula = formula.getAFormula();
                             subjectArea.append((i+1)+"."+aFormula+"
    ");
                        //将答案写入到答案文件中
                        try 
                        {
                            answersFw = new FileWriter(answersFile, true);
                            BufferedWriter answersBw = new BufferedWriter(answersFw);            
                            answersBw.write((i + 1) + "." + formula.getAnswser().toString());
                            answersBw.newLine();
                            answersBw.flush();
                            answersBw.close();
                        } 
                        catch (IOException e) 
                        {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } 
                    }
                    //讲题目写入到文件中
                    File exercisesFile = new File("file/Exercises.txt");
                    String stirng=subjectArea.getText();
                    FileWriter exercisesFw;
                    try 
                    {
                        exercisesFw = new FileWriter(exercisesFile, true);
                        BufferedWriter exercisesBw = new BufferedWriter(exercisesFw);
                        exercisesBw.write(stirng);
                        exercisesBw.flush();
                        exercisesBw.close();
                    }
                    catch (IOException e)
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                         }
                    
                     }
                 });
          
                 beginButton.addMouseListener(new MouseAdapter(){
                     @Override
                     public void mousePressed(MouseEvent arg0) {                
                    timeProgressBar.restart();
                    answerArea.setEditable(true);
                     }
                 });
                 submitButton.addMouseListener(new MouseAdapter(){
                     @Override
                     public void mousePressed(MouseEvent arg0) {
                    File yourFile = new File("file/YourFile.txt");
                    String string = answerArea.getText();
                    FileWriter yourFileFw;
                    try 
                    {
                        yourFileFw = new FileWriter(yourFile, true);
                        BufferedWriter yourFileBw = new BufferedWriter(yourFileFw);
                        yourFileBw.write(string);
                        yourFileBw.flush();
                        yourFileBw.close();
                    } 
                    catch (IOException e) 
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    answerArea.setEditable(false);
                    timeProgressBar.stop();
                    
                    //将对错情况写入到文件里
                    //先删除文件
                    File gradeFile = new File("file/Grade.txt");
                    if (gradeFile.exists()) 
                    {
                        gradeFile.delete();
                   }
                //定义答案文件和答题文件的输入流
                    File answersFile = new File("file/Answers.txt");
                    FileReader answersRd;
                    try 
                    {
                        answersRd = new FileReader(answersFile);
                        BufferedReader answersBufferRd = new BufferedReader(answersRd);
                        FileReader yourFileRd = new FileReader(yourFile);
                        BufferedReader yourFileBufferRd = new BufferedReader(yourFileRd);
                        String thisLineAnswer = "";
                        String yourAnswer = "";
                        List<Integer> error = new ArrayList<Integer>();
                        List<Integer> right = new ArrayList<Integer>();
                        int num = 1;
                        while ((thisLineAnswer = answersBufferRd.readLine()) != null) {
                            yourAnswer = yourFileBufferRd.readLine();
                            if (yourAnswer.equals(thisLineAnswer)) 
                            {
                                right.add(num);
                            } 
                            else 
                            {
                                error.add(num);
                            }
                            num++;
                        }
                        answersBufferRd.close();
                        yourFileBufferRd.close();
                      //将答题结果写入到Grade文件中
                        FileWriter gradeFw = new FileWriter(gradeFile, true);
                        BufferedWriter gradeBw = new BufferedWriter(gradeFw);
                        gradeBw.write("Correct:"+right.size()+"(");
                        for (int x=0;x<right.size();x++)
                        {
                            gradeBw.write(right.get(x)+",");
                        }
                       
                        gradeBw.write(")");
                        gradeBw.newLine();
                        gradeBw.write("Wrong:"+error.size()+"(");
                        for (int y=0;y<error.size();y++)
                        {
                            gradeBw.write(error.get(y)+",");
                        }
                        
                       
                        gradeBw.write(")");
                        gradeBw.newLine();
                        //关闭流
                        gradeBw.flush();
                        gradeBw.close();
                    } catch (FileNotFoundException e)
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e){
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                     }
                 });
             
             }
             public static void main(String[] args) 
             {
                // TODO Auto-generated method stub
                try 
                {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } 
                catch (ClassNotFoundException | InstantiationException
                        | IllegalAccessException | UnsupportedLookAndFeelException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                new MainFrame();
            }
    
             
    }

    五.请使用汉堡评价法给你的小伙伴一些点评

     

    在做这个结对编程的时候和小伙伴是比较好相处的,虽然在实验中,遇到了很多的困难,如对文件的写操作以及对列表值的增加等,但通过查阅书籍,网页,请教同学,在很多地方都达成了共识,有共同的语言。在我们的努力下,终于完成了这次作业,但由于能力有限,没有完成柱状图的绘制。


    六.结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会

         

    我认为结对编程是可以带来1+1>2的效果的。在这次结对编程中,我们齐心协力,共同解决实验过程中遇到的问题,一起改bug,效率确实是1+1>2的。

         

    七.PSP

    PSP2.1任务内容计划完成的时间(min)实际完成需要的时间(min)
    PLanning 计划 15 20
    Estimate 估计这个任务需要多少时间,并规划大致工作步骤 10 10
    Developmet 开发 220 240
    Analysis 需求分析(包括学习新技术) 10 10
    Design Spec 生成设计文档 5 6
    Design Revie 设计复审(和同事审核设计文档) 10 15
    Coding Standard 代码规范 5 10
    Design 具体设计 10 15
    Coding 具体编码 200 240
    Code Review 代码复审 10 10
    Test 测试(自我测试,修改代码,提交修改) 15 10
    Reporting 报告 15 25
    Test Report 测试报告 3 5
    Size Measurement 计算工作量 5 5
    Postmortem & Process Improvement Plan 事后总结,并提出过程改机计划 3 3

     

     

  • 相关阅读:
    Docker实践之03-Dockerfile指令详解
    Docker实践之02-使用镜像及定制
    通过Hack方式实现SDC中Stage配置联动刷新
    多级部门查询性能问题解决方案
    Docker实践之01-入门介绍
    从阿里腾讯2朵云产品中学到的用户体验
    HttpClient在多线程环境下踩坑总结
    一次对JDK进行"减肥"的记录
    北京西站如何进站接人
    多实例集群部署下的图片上传和访问
  • 原文地址:https://www.cnblogs.com/drunyuan/p/8709224.html
Copyright © 2020-2023  润新知