结对编程
学号1:211606325 姓名:邱东宝 学号2:211606312 姓名:赖志斌
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 100 | |
• Estimate | • 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 60 | 60 |
• Design Spec | • 生成设计文档 | 60 | 140 |
• Design Review | • 设计复审 | 20 | 20 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 40 |
• Design | • 具体设计 | 20 | 20 |
• Coding | • 具体编码 | 500 | 300 |
• Code Review | • 代码复审 | 20 | 100 |
• Test | • 测试(自我测试,修改代码,提交修改) | 200 | 300 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 40 | 100 |
• Size Measurement | • 计算工作量 | 15 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 50 | 100 |
合计 | 1200 |
二、需求分析
通过本次作业要求了解到小学三年级数学有以下特点:
- 运算符在2~4个
- 没有学过负数
- 除法运算除数不能为0并且不能有余数
- 只有1000内的正整数运算
经过分析,我认为,这个程序应当:
- 主方法接收两个参数
- 将答案输出到out.txt
- 根据传入题目数和年级输出
- 使用调度场以及逆波兰算法
三、设计
1. 设计思路
- 在上一次作业的基础上调用逆波兰算法来算出四则混合运算,并将随机生成的题目保存到数组输出到文件
- 写一个check()函数用来排除输入参数的各种问题,函数流程如下:
- 判断输入的参数的长度(只能为4)
- 判断是否用-n 和-grade作为标识符
- 检验年级参数是否为1-3并且题目数量为整数
2. 实现方案
- 准备工作:在Github上创建仓库并且克隆到本地.
- 技术关键点:
- 写出调度场算法和逆波兰算法的方法
- 随机添加括号
- 如何在命令行输入参数且不受顺序限制
- 在三年级的基础上改进逻辑并优化一二年级的功能
四、编码
编码过程:输入年级和题目数量来达到不同年级不同题目的出题方式,在这期间遇到很多困难,比如逆波兰算法总是无法实现,还有就是带括号的四则运算如何生成的问题。在编码过程中和队友不断沟通,能够及时发现问题,交换意见,使得编码时间少了许多。
1. 调试日志
在写逆波兰算法的时候遇到了许多错误,经过多次调试以及上网查阅资料,更重要的是队友的启发,仔细检查发现了问题所在。
2. 关键代码
Stack<Integer>nums = new Stack<Integer>();//保存数字 Stack<Character>opes = new Stack<Character>();//保存操作符 int n = 0;//保存数字 char[] cs = string.toCharArray();//字符串转换为char数组 for(int i = 0;i<cs.length;i++){ char t =cs[i]; if(Character.isDigit(cs[i])){ n=10*n+Integer.parseInt(String.valueOf(t)); }else{ System.out.println("i:"+n+","+cs[i]); if(n!=0){ System.out.println(n+cs[i]); nums.push(n); n=0; } if(t=='('){ opes.push(t); }else if(t==')'){ while(opes.peek()!='('){ int a =cal(nums.pop(),nums.pop(),opes.pop());nums.push(a);} opes.pop(); } else if(isType(t)>0){ if(opes.isEmpty()){ opes.push(t); }else{ if(isType(opes.peek())>=isType(t){ int a = cal(nums.pop(),nums.pop(),opes.pop());nums.push(a)}opes.push(a); }
3. 代码规范
请给出本次实验使用的代码规范:
- 第一条代码中的命名均不以下划线或美元符号开始,也不一下划线或美元符号结束。
- 第二条代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
- 第三条类名使用UpperCamelCase风格,但是以下情形例外:DO / DTO / VO / AO / PO 等。
- 第四条方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵循驼峰形式。
- 第五条变量和常量的命名方式:非公有(private/protected/default)变量前面要加上小写m;
- 第六条类型与中括号紧挨相连来定义数组。
- 第七条杜绝完全不规范的缩写,避免忘文不知义。
- 第八条为了达到代码自己自解释的目标,任何自定义编程元素在命名时,使用精良完整的单词组合来表达其意。
五、测试
由于能力不足,两个人没想出怎么解决如何在命令行输入所需格式参数且顺序不限,因此测试只能用一开始的输入方法测试,而且三年级的还没有解决。。
测试 | 预期结果 | 实际结果 |
---|---|---|
不输入参数 | 输入有误! | 输入有误! |
只输入一个参数:100 | 输入有误! | 输入有误! |
-n 10 -grade 1 | 题目已经生成 | 题目已经生成 |
-n 10.5 -grade 1 | 输入有误! | 输入有误! |
-n ascc -grade 2 | 输入有误! | 输入有误! |
六、总结
经过这次结对编程我们明白了相互合作对于双方都是有很大进步的,因基础不好,这次任务完成的很差,有几点要求没做到:随机加括号,在命令行输入所需格式参数且顺序不限。可这次结对编程让我也收获了很多在没有思绪的时候可以和搭档聊聊双方对于任务需求的想法,互相了解对方的思路,共同在实践中学习进步,在走弯路时搭档能及时指点错误,提高双方完成任务的效率。