201571030103/201571030105 软件工程结对项目
Git地址:https://github.com/djhdijd/bean1.git
一.需求分析:
设计开发一个小学生四则运算练习软件,使之具有以下功能:
(1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
(2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
二.程序设计
三.程序运行结果:
点击提交答案后,答题结果存放在Grade.txt文本文档中。
四.关键代码及说明
//带参构函数,传入一个整数,生成小于该整数的分数对象 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 |