zoukankan      html  css  js  c++  java
  • 【软件工程】结对项目-四则运算 “软件”之升级版

    作业要求来自于: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

     

  • 相关阅读:
    连接池
    Socket编程实践(2) --Socket编程导引
    自己定义JSTL函数
    用new和delete运算符进行动态分配和撤销存储空间
    Unix网络编程学习笔记之第12章 IPv4与IPv6的互操作性
    矩阵十题【五】 VOJ1049 HDU 2371 Decode the Strings
    Unity3d / 3ds max 模型分享站点
    浙大PAT考试1077~1080(2014上机复试题目)
    Java反射学习总结五(Annotation(注解)-基础篇)
    关于http和https淘宝支付宝跨域解决方法研究
  • 原文地址:https://www.cnblogs.com/Richard-V/p/9868928.html
Copyright © 2011-2022 走看看