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

快乐的二人组

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 三年级题目是否符合规范

六、总结

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

七、结对照片

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

时间: 2024-07-30 05:43:54

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

不仅仅是写代码,而是完成作品

近来有人问起,现在似乎真得变成了码农,日出而作,日落而息.整天不停的写代码,开发业务需求,周而复始,日子长了,感到厌倦.有时回想,应该在过去的某个时期我也曾陷入过这样的循环中,后来又是如何脱离的呢? 代码与缘由 这要回归到从写代码这件事上开始.写代码是因为有需求,需求来自业务的发展需要,需求经过产品经理再传递到程序员. 刚开始,作为一个新手程序员,不停的为各种需求写代码.开发完一个,接着又是下一个,生生不息,循环不止.一开始也许会感觉有些累,但并没有产生太多的厌倦.这是一个从不熟悉到熟悉再到熟练

CSDN日报20170404 ——《不不过写代码,而是完毕作品》

[程序人生]不不过写代码,而是完毕作品 作者:瞬息之间 近来有人问起,如今似乎真得变成了码农,日出而作,日落而息.整天不停的写代码,开发业务需求,周而复始,日子长了,感到厌倦. 有时回忆,应该在过去的某个时期我也曾陷入过这种循环中,后来又是怎样脱离的呢? [深度学习]使用Caffe进行手写数字识别运行流程解析 作者:fengbingchun 之前在 http://blog.csdn.net/fengbingchun/article/details/50987185 中仿照Caffe中的examp

实习以来 唯一一次 没有因需求变更 代码被改面目全非的一次(期待各位对代码细节提提建议)

according the source and template to genetate bulk file.(there is four type diff source and template now.) 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using Ric.Core; 6 using System.ComponentModel;

写代码有这些想法,同事才不会认为你是复制粘贴程序员

前言 最近做完12月份版本需求,有一些思考不够深入的代码,因此写一下总结,希望大家日常写代码多点思考,多点总结,加油!同时哪里有不对的,也望指出. 一.复杂的逻辑条件,是否可以调整顺序,让程序更高效呢. 假设业务需求是这样:会员,第一次登陆时,需要发一条感谢短信.如果没有经过思考,代码直接这样写了 if(isUserVip && isFirstLogin){ sendMsg(); } 假设总共有5个请求,isUserVip通过的有3个请求,isFirstLogin通过的有1个请求. 那么以

OSChina 周二乱弹 —— 日写代码三千行,不辞长做IT人

星期二了,各位OSCer 大家壕!昨天脚趾头被砸了一下,去医院,大夫说:「你去做个脑电图吧.」本人极为不解:「我是脚趾头砸了,又不是头被砸,做啥脑电图啊?」 大夫看了我一眼,语重心长地对我说:「你的脑子要是反应灵敏,怎么会被砸呢? 我仔细想了想,还是不做脑电图了,脑子要是治好了以后还怎么写乱弹. @xmind:如果你想写程序,那就去当程序猿喽,唉,一如程序深如如海 @软件达人:我就是一苦逼的程序猿 @霡霂:上辈子做了什么坏事,让我这辈子当程序员!! 不干程序猿,也可以去卖烧烤! @任雲:日写代码

CTO集体怒吼:我到底要不要继续写代码(上篇)

注:本文为线下活动[CTO辩论会]移动创业大军:挣扎者or变革者实录,AppCan CTO赵庆华.Testin CTO 尹春鹏.云智慧CEO殷晋.TalkingData CTO肖文峰.爱加密CTO林魏.极光推送首席数据科学家黄鑫.51CTO学院技术总监李明小参与讨论.6位CTO从企业发展.技术探索.工作中的困惑到当下活跃的创业,探寻技术人在大潮中的瓶颈和机会.本文内容由活动参与方爱加密提供,篇幅较长,分文上下文.CTO集体怒吼:我到底要不要继续写代码(下篇) 1.CTO有假期吗? 黄鑫(极光推送

CTO集体怒吼:我到底要不要继续写代码(下篇)

注:承接上文,CTO们就从哪些方面确定产品和技术布局大方向,目前面临的困惑,以及作为CTO的技术修炼等方面进行探讨.上篇:CTO集体怒吼:我到底要不要继续写代码(上篇) 5.在人人创业的时代里,竞争压力非常大.有很多产品,甚至会有多个竞争对手,那么产品技术和布局会非常重要.CTO从哪些方面确定大的方向? 肖文峰(TalkingData):人员成本水涨船高,尽早储备人才. 多深多远还是回到CTO对于公司未来的愿景理解的多深.根据愿景储备人才.尤其是创业初期,大家知道人才是很贵的,比如研发人员,尤其

自动写代码工具要颠覆码农?(转)

摘要 : 人类总是会对自己的未来充满了焦虑,在我们对未来心存怀疑的时候,任何一则“消极”一点的消息都能让我们更加否认自己的未来,这一心理近日在对程序员前景心存质疑的人们身上,非常明显. 人类总是会对自己的未来充满了焦虑,在我们对未来心存怀疑的时候,任何一则“消极”一点的消息都能让我们更加否认自己的未来,这一心理近日在对程序员前景心存质疑的人们身上,非常明显. 日前,据网易科技报道:美国莱斯大学表示,作为五角大楼的疯狂科学部门,美国国防部先进研究计划署(DARPA)对代号为PLINY的自动填写编码

【腾讯Bugly干货分享】深入理解 ButterKnife,让你的程序学会写代码

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/578753c0c9da73584b025875 0.引子 话说我们做程序员的,都应该多少是个懒人,我们总是想办法驱使我们的电脑帮我们干活,所以我们学会了各式各样的语言来告诉电脑该做什么--尽管,他们有时候也会误会我们的意思. 突然有一天,我觉得有些代码其实,可以按照某种规则生成,但你又不能不写--不是所有的重复代码都可以通过重构并采用高端技术比如泛型来消除的--比如我最痛恨的代