码迷,mamicode.com
首页 > 其他好文 > 详细

感谢为了我们写代码疯狂提需求的小学生家长!!!心累

时间:2018-09-19 00:35:59      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:mat   过程改进   调试日志   integer   mit   方法   roc   git   交流   

快乐的二人组

211506368霍金池211606359戴俊涵

一、预估与实际

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 600 700
? Estimate ? 估计这个任务需要多少时间 600 700
Development 开发 500 530
? Analysis ? 需求分析 (包括学习新技术) 300 300
? Design Spec ? 生成设计文档 60 60
? Design Review ? 设计复审 30 30
? Coding Standard ? 代码规范 (为目前的开发制定合适的规范) 90 100
? Design ? 具体设计 400 420
? Coding ? 具体编码 20 20
? Code Review ? 代码复审 60 40
? Test ? 测试(自我测试,修改代码,提交修改) 60 80
Reporting 报告 30 60
? Test Repor ? 测试报告 15 30
? Size Measurement ? 计算工作量 10 15
? Postmortem & Process Improvement Plan ? 事后总结, 并提出过程改进计划 10 10
合计 800

二、需求分析

我通过万能的度娘了解到,小学一年级数学有如下的几个特点:

  • 特点1
    都是正整数,范围在0-100以内
  • 特点2
    乘除应该满足乘法表且不能有余数
  • 特点3
    小学三年级四则混合运算包括随机的括号产生
    经过分析,我认为,这个程序应当:

  • 还要判断输入的不是正常数的报错情况
  • 得数不能有小数
  • 小学二年级是10以内的乘法口诀表的乘除法
  • 小学三年级的运算需要判断符号优先级

三、设计

1. 设计思路

  • 首先输入参数判断年级还有题数,判断参数的输入是否符合题目要求
  • 随机生成符号,并且当出现负数小数时舍去的情况
  • 四则运算方法,以及分母为0的情况等
  • out.txt文本的建立和写入

2. 实现方案

写出具体实现的步骤

  • 准备工作:先在Github上创建仓库,然后fork,clone到本地并且下载git创建文件等
  • 技术关键点:关于文本创建的一系列方法,清空文本的数据方法,以及判断是一年级还是二年级的方法
  • 对于三年级括号的添加运算
  • 对于优先级的判断为:输出:如果第二位符号是乘除法 要做特殊处理,即第一运算符号左右的数字前后加上括号,运算:

    四、编码

  • 扫描键盘输入
  • 创建文件
  • 判断题目数量范围是否正确是否符合
  • 定义四则运算方法
  • 判断文件创建是否异常

1. 调试日志

结果出现小数,然后我们直接调整为整数
题目中出现负数,没有想到解决办法,我们在随机数中定义了范围,结果不起作用
优先级出现问题,排版有点乱,找了一会改好的

2. 关键代码

...
*/
private static String[][] buildQuestion(int count, int grade){
//运算符号范围
int operate = 0;
//如果题目数量为负数
if(count < 0){
count = 1;
}
//如果年级为负数
if(grade <= 1){
operate = 0;
}else if(grade == 2){
operate = 2;
}else{
operate = 3;
}
//基数
int limited = 149 - grade / 25;
//随机数工具
Random random = new Random();

          int firstNum = 0;         
          int secondNum = 0;            
          int  thirdNum = 0;            

           int firstOperate = 0;        
           int  secondOperate = 0;      

           int result = 0;          


           //二维数组, 其第二维度 依次存放的是  数字、运算、数字、运算、数字、结果
           String[][] titleArr = new String[count][6];
           for (String[] arr : titleArr) {
        //第一位运算数字
        firstNum = random.nextInt(99) + 1;
        //第二位运算数字
        secondNum = random.nextInt(99) + 1;
        //第三位运算数字
        thirdNum = random.nextInt(99) + 1;

        //第一位符号 0:+ 1:- 2:× 3:÷ 
        firstOperate = random.nextInt(4);
        //第二位符号 0:+ 1:- 2:× 3:÷ 4:四则运算
        secondOperate = random.nextInt(2) + operate;
        if(grade == 3){
            secondOperate = 4;
        }

        switch(secondOperate){
        case 0:
            //加法
            firstOperate = secondOperate;
            arr[firstOperate_index] = paraseOperateStr(firstOperate);
            arr[firstNum_index] = String.valueOf(firstNum);
            arr[thirdNum_index] = String.valueOf(secondNum);
            arr[result_index] = calculate(firstNum, secondNum, firstOperate);
            break;

        case 1:
            //减法
            firstOperate = secondOperate;
            arr[firstOperate_index] = paraseOperateStr(firstOperate);
            arr[firstNum_index] = String.valueOf(firstNum);
            arr[secondNum_index] = String.valueOf(secondNum);
            arr[result_index] = calculate(firstNum, secondNum, firstOperate);
            break;

        case 2:
            //乘法
            firstOperate = secondOperate;
            arr[firstOperate_index] = paraseOperateStr(firstOperate);
            arr[firstNum_index] = String.valueOf(firstNum);
            arr[secondNum_index] = String.valueOf(secondNum);
            arr[result_index] = calculate(firstNum, secondNum, firstOperate);
            break;

        case 3:
            //除法
            firstOperate = secondOperate;
            arr[firstOperate_index] = paraseOperateStr(firstOperate);
            //判断分母不能为0,如果是0,则重新取值
            while(secondNum == 0){
                secondNum = random.nextInt(limited) + 1;
            }
            //余数
            int remainder = (firstNum % secondNum);
            if(remainder == 0){
                arr[result_index] = calculate(firstNum, secondNum, firstOperate);
            }else{
                arr[result_index] = calculate(firstNum, secondNum, firstOperate) + "..." + String.valueOf(remainder);
            }
            arr[firstNum_index] = String.valueOf(firstNum);
            arr[secondNum_index] = String.valueOf(secondNum);
            break;

        case 4:
            //运算符重新取值
            secondOperate = random.nextInt(4);
            //如果第一个符号的优先相等或高,则不用做括号处理
            if(compareOperate(firstOperate, secondOperate) >= 0){
                //如果第一位符号是除法 要做特殊处理
                if(firstOperate == 3){
                    while((firstNum % secondNum) != 0 || result == 0){
                        firstNum = random.nextInt(limited);
                        //防止除数为0
                        secondNum = random.nextInt(limited) + 1;
                        result = firstNum / secondNum;
                    }
                    result = firstNum / secondNum;
                    //第二位是乘法和除法
                    if(secondOperate == 3 || secondOperate == 2){
                        //如果第二位符号是除法 要做特殊处理
                        if(secondOperate == 3){
                            while((result % thirdNum)!=0 || result/thirdNum==0){
                                thirdNum = random.nextInt(limited) + 1;
                            }
                        }
                        //填充数据
                        arr[secondNum_index] = String.valueOf(secondNum);
                        arr[thirdNum_index] = String.valueOf(thirdNum);
                        
                        arr[result_index] = calculate(result, thirdNum, secondOperate);
                    }else{
                        //加法和减法的操作处理
                        result = Integer.valueOf(calculate(secondNum, thirdNum, secondOperate));
                        //逆推
                        int temp = random.nextInt(20);
                        firstNum = temp * result;
                        arr[secondNum_index] = "( " + String.valueOf(secondNum);
                        arr[thirdNum_index] = String.valueOf(thirdNum) + " )";
                        arr[result_index] = String.valueOf(temp);
                    }
                }else{
                    result = Integer.valueOf(calculate(firstNum, secondNum, firstOperate));
                    //填充数据
                    arr[secondNum_index] = String.valueOf(secondNum);
                    arr[thirdNum_index] = String.valueOf(thirdNum);
                    arr[result_index] = calculate(result, thirdNum, secondOperate);
                }
                arr[firstNum_index] = String.valueOf(firstNum);
                arr[firstOperate_index] = paraseOperateStr(firstOperate);
                arr[secondOperate_index] = paraseOperateStr(secondOperate);
            }else{
                //优先级低的处理,既加括号
                result = Integer.valueOf(calculate(secondNum, thirdNum, secondOperate));
                if(firstOperate == 3){
                    //如果此时result等于0,则重新取值
                    while(result == 0){
                        secondNum = random.nextInt(limited);
                        //防止出现除数为0的情况
                        thirdNum = random.nextInt(limited) +1;
                        result = Integer.valueOf(calculate(secondNum, thirdNum, secondOperate));
                    }
                    //此时除数可能很大,所以应该逆推
                    int temp = random.nextInt(20);
                    
                    arr[firstNum_index] = calculate(result, temp, 2);
                    arr[result_index] = String.valueOf(temp);
                }else{
                    if(secondNum == 3){
                        while(secondNum % thirdNum !=0){
                            secondNum = random.nextInt(limited) + 1;
                            thirdNum = random.nextInt(limited) + 1;
                        }
                    }else{
                        arr[firstNum_index] = String.valueOf(firstNum);
                        arr[result_index] = calculate(firstNum, result, firstOperate);
                    }
                }
                arr[secondNum_index] = String.valueOf(secondNum);
                arr[thirdNum_index] = String.valueOf(thirdNum);
                arr[firstOperate_index] = paraseOperateStr(firstOperate);
                arr[secondOperate_index] = paraseOperateStr(secondOperate);
            }
            break;
        }

...

3. 代码规范

请给出本次实验使用的代码规范:

1.左大括号前不换行,后换行,右括号前换行。
2.源代码文件以文件内容中的最顶层的Java类命名,而且大小写敏感,文件扩展名为 .java,同时,文件的编码格式统一为UTF-8。

五、测试

输入 输出 是否符合要求
100,3 题目数量是否正确
100,1 一年级题目是否符合规范
100,2 二年级题目是否符合规范
100,3 三年级题目是否符合规范

六、总结

通过这次实验,培养了我们团队合作完成项目的能力。在遇到难题时,可以有懂得项目的人相互交流,从而提高解决问题的效率。同时,作业难度的提高,使得我们更加心有余而力不足,事实证明,我们的操作水平还是有所欠缺,有很大的提高潜力。

七、结对照片

技术分享图片

感谢为了我们写代码疯狂提需求的小学生家长!!!心累

标签:mat   过程改进   调试日志   integer   mit   方法   roc   git   交流   

原文地址:https://www.cnblogs.com/xzhp/p/9672239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!