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+"\r\n");
                    //将答案写入到答案文件中
                    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

 

 

posted @ 2018-04-03 23:04  雨栀微云  阅读(188)  评论(0编辑  收藏  举报