结对作业1
学号1:211606317 林泽宇
学号2:211606388 尹海川
- 这次把上一次的一、二年级作业优化完善了下,三年级的暂时还出不来完整的符合要求的...有时候输出还有问题...
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 7000 | 8640 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 700 | 720 |
• Design Spec | • 生成设计文档 | 300 | 400 |
• Design Review | • 设计复审 | 60 | 60 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 120 | 120 |
• Design | • 具体设计 | 360 | 520 |
• Coding | • 具体编码 | 300 | 340 |
• Code Review | • 代码复审 | 160 | 180 |
• Test | • 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 240 | 240 |
• Size Measurement | • 计算工作量 | 120 | 120 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 2880 |
二、需求分析
我通过上网查阅百度的方式了解到,小学三年级四则混合运算有如下的几个特点:(包括作业细化要求)
- 运算符在2~4个(进一步细化要求:至少两个不同的运算符)
- 可以加括号进行优先级运算
- 减法运算的结果不能为负数
- 除法运算除数不为零,不能有余数,必须要能整除
- 先乘除后加减,有括号的括号内的先运算
经过分析,我认为,这个程序应当:
- 使用的数字0~100,不包括得数
- 需要能进行混合运算,并且至少存在两个不同的运算符,也就是最少需要三个数参与运算
- 需要随机在加法或减法运算处加括号
- 计算结果遵循先乘除后加减,有括号的括号内先算
三、设计
1. 设计思路
- 设计三年级的函数gradeThree
- 在判断年级的函数judgeGrade内添加运行gradeThree的情况
2. 实现方案
- 先添加一个三年级的函数gradeThree
- 在判断年级的函数judgeGrade内加入当n = 3时,运行gradeThree
- 把"+","-","×","÷"存入字符串数组:sigh
- 生成三个0~100随机数
- 利用random函数+sigh数组随机获取两个运算符
- 生成题号和题目
- 按顺序判断第一个运算符号和第二个运算符号 遵循先乘除后加减原则,将预算结果存入answer变量中
- 输出题目 题目+答案
- 更改输入方式为 -n 100 -grade 3
- !!!括号的方法暂时只有一点点想法,运用到代码里好像实现不了,所以还没写进去...!!!
四、编码
请说明你如何按照设计思路进行编码,并记录你在开发中遇到的问题,与解决过程
1. 调试日志
-
输出到文本的时候遇到了问题,使用System.setOut(ps); 可以输出到out.txt文本中,但是不能输出的到命令窗口中;使用System.out.println(ps); 则相反
-
目前正在看学习视频和查阅资料,暂时还没找到比较好的解决方法
-
用一个中间变量temp交换n和grade的值后,输入 -n -grade 可以正常运行,输入 -grade -n 则无法正常运行,解决办法:查阅资料后,发现要用args[x].equals(“xxx”)才能判断是否符合情况,结论是:基础知识还是不扎实啊啊啊!
-
当 grade = 3 时,程序无法正常运行,解决办法也还没找到...
-
随机添加括号的方法和优先级的想法,运用到代码里好像实现不了,现在还是找办法解决,看视频,查资料!!!
-
逆波兰式 还是不怎么明白...
2. 关键代码
public static void gradeThree(int n) {
// TODO Auto-generated method stub
str = new String[n];
String s[] = {"+","-","×","÷"};
//生成题目
for (int i = 1; i <= n; i++) {
//生成四个0~100的随机数
int num1 = (int)(Math.random()*100+1);
int num2 = (int)(Math.random()*100+1);
int num3 = (int)(Math.random()*100+1);
// int num4 = (int)(Math.random()*100+1);
//生成随机运算符号
String sigh[] = null;
for (int j = 0; j < 2; j++) {
int sighNum = (int)(Math.random()*4);
sigh[j] = s[sighNum];
}
//生成题序和题目
System.out.println("("+ i +") " + num1 + sigh[0] + num2 + sigh[1] + num3 );
int answer = 0;
//第一个运算符号**************************************************************
//先乘除
if(sigh[0] == s[2] || sigh[0] == s[3]) {
if(sigh[0] == s[2]) {//乘
answer = num1*num2;
}
else {//除
answer = num1/num2;
}
}
//后加减
if(sigh[0] == s[0] || sigh[0] == s[1]) {
if(sigh[0] == s[2]) {//加
answer = num1+num2;
}
else {//减
answer = num1-num2;
}
}
//第二个运算符号**************************************************************
//先乘除
if(sigh[1] == s[2] || sigh[1] == s[3]) {
if(sigh[1] == s[2]) {//乘
answer = answer*num3;
}
else {//除
answer = answer/num3;
}
}
//后加减
if(sigh[1] == s[0] || sigh[1] == s[1]) {
if(sigh[1] == s[2]) {//加
answer = answer+num3;
}
else {//减
answer = answer-num3;
}
}
str[i-1] = ("("+ i +") " + num1 + sigh[0] + num2 + sigh[1] + num3 + "=" + answer);
//*************************************************************************
}
System.out.println();
//输出答案
for(String a:str)
System.out.println(a);
//输出日期和学号姓名
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
System.out.println();
System.out.println("211606317 林泽宇 & 211606388 尹海川 " +sdf.format(new Date()));
}//gradeThree
3. 代码规范
请给出本次实验使用的代码规范:
- 能简化则简化
- 注释要简单明了,增加代码可读性
- 做好缩进和利用空行分隔
并人工检查代码是否符合规范
五、测试
- 测试两种输入方式
- 测试三个年段都能运行
- 测试多次,看会不会出现特殊情况
- ...
六、总结
请总结过程中的教训和经验,思考
- 这次作业,花了一部分时间把上一次作业的一二年级的代码优化完善了,然后三年级的代码还有待改进,很多复杂的情况没考虑到,代码也觉得有点繁琐复杂,觉得可以再优化
- 写代码前要先构思一遍,可以现在文档中先写伪代码,先写出整体框架,再去细化,一定一定要先构思,不要边写边想
- 要考虑到各种情况,针对各种情况改写代码
- 要跟结对的成员多沟通,每个人的想法不一样,可以讨论看看谁的想法更好,或者一起讨论有没有更好的实现方式
- 平时要多去看视频巩固一下基础知识,这两次作业大部分时间还是花在学习、巩固新旧知识上,反而打代码的时间变少了,希望以后情况能互换