zoukankan      html  css  js  c++  java
  • 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

     

     

  • 相关阅读:
    IOS Charles(代理服务器软件,可以用来拦截网络请求)
    Javascript中addEventListener和attachEvent的区别
    MVC中实现Area几种方法
    Entity Framework Code First 中使用 Fluent API 笔记。
    自定义JsonResult解决 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
    Code First :使用Entity. Framework编程(8) ----转发 收藏
    Code First :使用Entity. Framework编程(6) ----转发 收藏
    Code First :使用Entity. Framework编程(5) ----转发 收藏
  • 原文地址:https://www.cnblogs.com/drunyuan/p/8709224.html
Copyright © 2011-2022 走看看