MathExam Lv2

一个大气又可爱的算术题----211606360 丁培晖 211606343 杨宇潇

一、预估与实际

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

二、需求分析

  • 特点1
  • 需要随机生成2~4个运算符
  • 特点2
  • 可以加括号
  • 特点3
  • 除法运算除数不能为0
  • 特点4
  • 需要用到逆波兰算法
  • 特点6
  • 输入题目数目和年级数目位置不一样,但是可以判断
  • 特点7
  • 式子的运算无法得出负数
  • 特点8
  • 式子的结果大小限定在10000以内

经过分析,我认为,这个程序应当:

  • 使用的数字大小应为[0,1000)
  • 并且判断除数的数字大小应为[1,1001)
  • 生成的符号至少两个运算符,至少三个数。

三、设计

1. 设计思路

说明你如何设计这个程序

这一次的作业,由于需要使用逆波兰表达式,因此我们使用了和上次作业不同的输入文本的方式,这一次使用的是将字符串转为byte[],然后输入文本的方式。
我们还分出了多中方法体以及构造函数,在主函数main()里调用构造函数,在构造函数内调用各个方法体。(第一次作业只建立了一个方法体,并且在主函数调用,显得代码臃肿,因为将所有的算法都集中在一个方法体内,因此作出改变。)

  • 根据题目要求,传入的参数有-n和-grade,因此使用if()判断了参数的-n和-grade的顺序,并建立了一个judge()的方法体,使用正则表达式判断参数的格式
  • 数字需要随机得出,因此需要建立随机数,随机数有多种。
  • 随机出来的式子需要写入文本,因此创建了一个TxT()的方法,用于创建文本并将式子输入文本当中,使用String数组进行存储式子,并用Byte[]转换,最后输入文本。
  • 答案需要的格式为“等式+答案”,而且不需要小数以及负数,因此将随机数类型定义为整型,并在最后判断答案是否符合要求。
  • 判断加减乘除需要使用到优先级,因此创建了一个Level方法,返回值为0,1,2,用于判断符号的优先级。
  • 因为三年级的式子为四则混合运算,因此使用中序表达式以及逆波兰,将String数组里的式子转化为线性表,最终调用reckon()方法计算线性表内的式子。并返回最终结果。
    1472661-20180918233929225-2010439623.png

2. 实现方案

写出具体实现的步骤

  • 准备工作:先在Github上创建仓库,克隆到本地,并邀请结伴对象,将代码提交到一个仓库内。
  • 技术关键点:
  • 四则混合运算式子以及括号的判断,需要使用到优先级,因此建立一个关于判断优先级的Level()的方法。
  • 使用随机数Random( )时,需要注意随机数生成范围,比如除数不能为0。
  • 当式子内有减法,需要判断式子的答案是否大于等于0。
  • 使用String数组将式子转换为Byte [] ,并将其全部输入文本。
  • 使用正则表达式、Pattern、Matcher判断输入参数是否达标,不达标则提示输入错误,并结束程序。
  • 使用 DateFormat( )获取系统当前时间。

四、编码

  • 生成随机数 Math.random()
  • if语句判断年级,符号,题目规范
  • 使用了逆波兰算法

1. 调试日志

记录编码调试的日志,请记录下开发过程中的 debug 历程

  • 数据传入栈中,会出现空指针,导致程序不能运行。
    解决方案:检查随机数的生成,看随机数是否和判断条件相符合。

  • 命令行输入格式不对,会出错。
    解决方案:通过字符匹配,如果输出格式不对,报错结束进程。

  • 除法计算,除数生成了0.
    解决方案:在生成随机数时+1.

  • 输入题目个数输入过大,或者输入不是数字,会报错。
    解决方案:用正则表达式来判断传入参数是否合理。

  • 使用逆波兰计算方法不能正确计算。
    解决方案:检查传入参数是否正确,写的方法是否正确,使用方法是否正确。

    2. 关键代码

public List toInfixExpression(String s) {
List ls = new ArrayList();//存储中序表达式
int w = 0;
String str;
char c;

        do {
            if ((c = s.charAt(w)) < 48 || (c = s.charAt(w)) > 57) {
                ls.add("" + c);
               w++;
                
            } else {
                str = "";
                while (w < s.length() && (c = s.charAt(w)) >= 48
                        && (c = s.charAt(w)) <= 57) {
                    str += c;
                    w++;
                }
                ls.add(str);
            }

        } while (w < s.length());
        List<String> LS=parseSuffixExpression(ls);
        return LS;
    }

 public  int reckon(List<String> ls) {                    //逆波兰
        Stack<String> s=new Stack<String>();
        for (String str : ls) {
            if (str.matches("\\d+")) {
                s.push(str);
            } else {
                int b = Integer.parseInt(s.pop());
                int a = Integer.parseInt(s.pop());
                int result=0;
                if (str.equals("+")) {
                    result = a + b;
                } else if (str.equals("-")) {
                    result = a - b;
                } else if (str.equals("×")) {
                    result = a * b;
                } else if (str.equals("÷")) {
                    result = a / b;
                }
                s.push("" + result);
            }
        }
        return Integer.parseInt(s.pop());
    }

3. 代码规范

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

  • 类名统一,TXT文件名统一。
  • 类名首字母大写。
  • 备注代码功能。
  • 代码缩进对齐。- 左小括号和字符之间不出现空格。
  • 循环嵌套换行,使代码对应。
  • 在代码方法后备注,方便以后修改。
  • 代码中相关的数据用统一的英文+数字下标。
  • 第一条代码中的命名均不以下划线或美元符号开始,也不一下划线或美元符号结束

五、测试

测试编号具体输入预期结果实际结果
1-n 10 -grade 1输出10题一年级题目符合预期
2-n -5 -grade 1程序提示错误,停止运行符合预期
3-n 10 -grade 3输出10题三年级题目符合预期
4-grade 3 -n 10输出10题三年级题目符合预期
5A N程序提示错误,停止运行符合预期
6-n 10.3 -grade3.0程序提示错误,停止运行符合预期
7-n 99999 -grade4程序提示错误,停止运行符合预期

六、总结

请总结过程中的教训和经验,思考

-第二次作业要求为结对作业。在从最初的构思阶段到最后的编写代码测试代码结束,都需要两个人不断的配合,不断的去交流自己的想法,然后通过想法的整合,调整出一段更为优质的代码。团队协作,可以提高写代码质量和效率。写代码过程也是一种基础的累积,对于不会的东西就去搜素学习,把知识基础变为自己的。
1472661-20180918231332499-803382438.jpg

转载于:https://www.cnblogs.com/w9250872/p/9672172.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值