结对作业

211606345 翟堂贵211606330 王建木

一、预估与实际

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

二、需求分析
我通过网上查询了解到,小学三年级数学的四则运算特点如下:
运算符在2~4个,可以加括号,一对括号算一个运算符,"="不算运算符
减法运算的结果不能为负数
除法运算不能有余数,除数不能为零
算式内最多只能有一对括号,并且括号不能无意义
能在命令行模式下正常运行
算式结果小于10000
需要保留之前1-2年级出题器的功能
输入格式为-n 题目数 (1-100) -grade 年级(1-3)或-grade 年级(1-3)-n 题目数(1-100)
生成题目后需要将题目和答案保存到out.txt文件中并打印输出

三、设计
1.设计思路

设计getThirdGradeMathSubject方法,根据随机生成的运算符的个数(2-4)分别调用handleTwo、handleThree、handleFour方法处理
判断是否需要添加括号,若为true,则调用getBrackets方法返回添加完括号的运算符串;
根据是否添加括号分别调用priotitySort和prioritySortWithoutBrackets方法分别对传入的运算符串进行优先级排序,分别返回排序完成后带括号和不带括号的运算符串
遍历第三步生成的运算符串,循环调用handleSign方法,根据当前遍历到的运算符(+,-,×,÷)进行不同的处理。handleSign方法接收如("+",100)的参数,生成第二个操作数和运算后的结果,并将操作数和结果用整形数组保存并返回。当传入的运算符为"÷"时调用getFactor方法保证操作数2为传入的操作数1的因数,保证除法运算的结果为整数。
遍历结束后将得到的操作数数组和排序完成的运算符数组重新排列,生成算式和答案并返回即可。
2.计算关键点
计算关键点:如何将运算符串进行优先级排序。------>定义三个空栈,遍历运算符串,当栈为空时将运算符压入栈1栈顶。当栈1不为空时,将当前运算符与栈顶元素的优先级进行比较,若当前运算符的优先级高于栈顶元素,则将当前运算符压入栈1栈顶。反之,则循环遍历栈1,将优先级等于或高于当前运算符的元素压入栈2,循环结束后将当前运算符压入栈1栈顶,并将栈2元素压回栈1。当出现括号时,若为左括号,则直接压入栈1栈顶,若为右括号,则将左括号之前的元素压入栈3栈顶。---->栈3存储括号内的运算符。当运算符串遍历结束后,先将栈2内剩余的元素压回栈1,再将栈3内元素压回栈1即可。此时,栈1内元素的优先级为栈顶---->栈底逐渐递减。--->见关键代码。
技术关键点:如何在运算符串中加入括号。---->见关键代码。

四、编码
1.调试日志
2.关键代码
给运算符串添加括号

    public static String getBrackets(String isNeedBrackets){
        String returnString="";
        List<String> list=new ArrayList<String>();
        for(int i=0;i<isNeedBrackets.length();i++){
            list.add(isNeedBrackets.substring(i,i+1));
        }
        Random r=new Random();    
        // k表示插入左括号的位置,p表示插入右括号的位置
        int k=0,p=0;
        k=r.nextInt(isNeedBrackets.length());
        list.add(k,"(");
        List<Integer> rightSignLocation=new ArrayList<Integer>();
        int rightLoction=0;
        if(k==0){
            for(int i=2;i<list.size();i++){
                rightSignLocation.add(i);
            }
            rightLoction=r.nextInt(rightSignLocation.size());
            p=rightSignLocation.get(rightLoction);
        }else{        
            for(int i=k+2;i<=list.size();i++){
                rightSignLocation.add(i);
            }
            rightLoction=r.nextInt(rightSignLocation.size());
            p=rightSignLocation.get(rightLoction);
        }
        list.add(p,")");
        for(String s:list){
            returnString=returnString+s;
        }
        return returnString;
    }

3.代码规范
类名使用UpperCamelCase风格
方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格
不允许任何魔法值(即未经预先定义的常量)直接出现在代码中
左小括号和字符之间不出现空格;同样的,有小括号和字符之间也不出现空格
if/for/while/switch/do等保留字与括号之间都必须加空格
大括号的使用约定。如果是大括号内为空,则简介地写成{}即可,不需要换行;如果是非空代码块则:
左大括号前不换行
左大括号后换行
右大括号前换行
右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行
任何二目、三木运算符的左右两边都需要加一个空格
方法参数在定义和传入是,多个参数逗号后边必须加空格

五、测试
测试编号
具体输入
预期结果
实际结果
1
-n 10 -grade 0
请输入正确的年级(1-3)
符合预期
2
-n 10 -grade 3
正常执行,生成10道三年级四则运算题
符合预期
3
-n 1000 -grade 3
请输入正确的题目数(1-100)
符合预期
4
-grade 3 -n 10
正常执行,生成10道三年级乘除运算题
符合预期
5
-grade 4 -n 10
请输入正确的年级(1-3)
符合预期

六、总结
感觉自己的欠缺很多。需要多练练

比上一次的作业复杂很多,不过在和小伙伴的努力下克服了

细节需要多注意 考虑问题要更全面

posted @ 2018-09-25 23:04  陶泥猴子  阅读(99)  评论(0编辑  收藏  举报