【软件工程】结对项目-四则运算 “软件”之升级版
作业要求来自于: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 |