【软件工程】结对项目-四则运算 “软件”之升级版

作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2232

GitHub远程仓库的地址:https://github.com/RichardSkr/Simple-arithmetic-device

 

 

1.开发环境

  IDE :IntelliJ IDEA 2018.2.5 x64。

  JDK:JDK_U801.

  系统:Ubuntu x64.

  编程语言:Java语言

 

 

2.需求分析

  • 基本要求:

    1)生成题目,单个题目最多不能超过4个运算符,操作数小于100。

    2)用户可以输入答案

    3)若用户输入答案正确,则提示正确;若答案错误,则提示错误,并要提示正确答案是多少。

  • 扩展要求(选择方向):

1)程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66,或保持分数形式:8/3;

2)可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8;

3)用户答题结束以后,程序可以显示用户答题所用的时间;

4)用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数;

5)程序可以出单个整数阶乘的题目:如:4!=24;

6)程序可以设置皮肤功能,可以改变界面的颜色即可。


 

3.详细设计

   1)程序可以出带括号的正整数四则运算,支持分数。

1     int open_parenthesis = rand.nextInt(num.size() - 1);    //左括号下标
2     int closed_parenthesis = rand.nextInt(num.size() - open_parenthesis - 1) + 2 + open_parenthesis;  //右括号下标
3     this.operator.add(open_parenthesis, "(");
4     this.operator.add(closed_parenthesis, ")");

   设计思路:在运算符集合范围内随机生成左括号下标,在左括号和运算符集合末尾范围内随机生成右括号下标,然后在运算符集合中,添加括号到对应的位置。

  

2)可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8;

  ExerciseBean类中:

1   this.num.add(10 - rand.nextInt(20));

     ExerciseUtils类中添加:

1   if (exerciseList.get(index).num.get(j) < 0) {
2        exercise +="(" + exerciseList.get(index).num.get(j) + ")";
3   }

    设计思路:在随机生成的整型数值中可以有负数,输出题目时判断是否小于0,若小于0则输出带括号的负数。

 

3)用户答题结束以后,程序可以显示用户答题所用的时间;

1  Timer timer = new Timer();//计时器
2  timer.schedule(new TimerTask() {
3    public void run() {
4         time++;
5         }
6  }, 0,1000);

    设计思路:用计时器获得用户答题持续时间。

 

4)用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数;

  界面类中:

1     int exerciseCount = 0;//定义出题数变量
2     /**
3      * 设置出题数
4      */
5     private void setExerciseCount(int exerciseCount){
6         this.exerciseCount = exerciseCount;
7     }

    ExerciseUtils类中:

 1     /**
 2      * 获取题目集合
 3      */
 4     public static List<ExerciseBean> getExerciseList(int exerciseCount) {
 5         List<ExerciseBean> exerciseList = new ArrayList<ExerciseBean>();
 6 
 7         for (int i = 0; i < exerciseCount; i++) {
 8             Random rand = new Random();
 9             if (rand.nextInt(3) == 0){
10                 exerciseList.add(new ExerciseFactorialBean());
11             }else {
12                 exerciseList.add(new ExerciseBean());
13             }
14         }
15         return exerciseList;
16     }

    设计思路:定义出题数变量,用该变量限定出题量。

 

5)程序可以出单个整数阶乘的题目:如:4!=24;

   定义ExerciseFactorialBean类:
 1 package bean;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Random;
 5 
 6 public class ExerciseFactorialBean extends ExerciseBean {
 7     private int maxFactorial;
 8     public ExerciseFactorialBean(){
 9         setMaxFactorial(6);
10         createExercise();
11     }
12     private void createExercise() {
13         Random rand = new Random();
14         this.num = new ArrayList<>();
15         this.operator = new ArrayList<>();
16         this.num.add(rand.nextInt(maxFactorial)+1);
17         this.operator.add("!=");
18     }
19 
20     /**
21      * 设置阶乘最大范围
22      */
23     private void setMaxFactorial(int maxFactorial){
24         this.maxFactorial = maxFactorial;
25     }
26     @Override
27     public String getAnswer() {
28         int factorial = num.get(0);
29         int answer = 1;
30         for (int i = 0; i < factorial; i++){
31             answer *= (i+1);
32         }
33         return answer + "";
34     }
35 }

    修改ExerciseUtils类:

1  Random rand = new Random();
2  if (rand.nextInt(3) == 0){
3    exerciseList.add(new ExerciseFactorialBean());
4  }else {
5     exerciseList.add(new ExerciseBean());
6  }

    设计思路:定义一个ExerciseBean的子类ExerciseFactorialBean,重写createExercise()和getAnswer()方法,在工具类中的习题集合中添加阶乘类

 

6)程序可以设置皮肤功能,可以改变界面的颜色即可。

1 VBoxInstance.colorBtn.setOnMouseClicked(event -> {
2   changeColor();
3   mainVBox.setBackground(new Background(new BackgroundFill(color,null,null)));
4   VBoxInstance.colorBtn.setStyle(MainWork2.colorStyle);
5 });

    设计思路:在点击颜色按钮时,改变主面板和按钮的背景色。


 

4.调试结果

限定出题数

 

判断答案是否正确

 获取总分数

 

改变颜色


 

5.结对项目过程

 姓名:陈俊朗

 学号:201606120066

 结对成员博客地址:http://www.cnblogs.com/tuyt124/

 分工:

  1)成员1:随机生成括号算法、生成阶乘题目算法、获取答案算法

  2)成员2:图形化界面设计、生成计时器、更改背景颜色功能

 结对项目学习照片:

 


 

6.总结

  结对编程效率会比个人编程更高,成员之间可以互相监督、互相学习,解决问题的想法会更多更有效。相互督促可以使我们都能集中精力,更加认真的工作,我们对业务的理解深度相差无几,设计在我们共同讨论中产生,这样我们在进行Code Review的时候比起传统的方式就会更有效。比如我们其中一个人,按照我们共同完成的活动图去编程,完成一小段逻辑后,另外一个人会马上给出意见,说出代码存在的潜在问题,这个潜在的问题,很可能是因为我们当时对业务理解存在偏差造成的。很可能这个时候我们要对设计进行改动以适应业务。如果是一个人在编程,恐怕很难找到这样的问题,传统的Code Review也很难做到这一点。任何一段代码都至少被两双眼睛看过,两个脑袋思考过,代码的质量会得到有效提高。

 


 

7.时间表

PSP2.1 Personal Software Process Stages Time Senior Student(h) Time(h)
Planning 计划 3 2
· Estimate 估计这个任务需要多少时间 10 20
Development 开发 8 11
· Analysis 需求分析 (包括学习新技术) 2 1
· Design Spec 生成设计文档 2 1
· Design Review 设计复审 1 1
· Coding Standard 代码规范 0.5 0.5
· Design 具体设计 4 2.5
· Coding 具体编码 12 15
· Code Review 代码复审 1 2
· Test 测试(自我测试,修改代码,提交修改) 1 1.5
Reporting 报告 1 3
· 测试报告 0 0
· 计算工作量 1 1
· 并提出过程改进计划 0 1

 

 

posted @ 2018-10-29 13:52  海芋  阅读(205)  评论(0编辑  收藏  举报