211606317林泽宇 211606388尹海川
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 30 | 30 |
• Design Spec | • 生成设计文档 | 20 | 40 |
• Design Review | • 设计复审 | 10 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
• Design | • 具体设计 | 30 | 40 |
• Coding | • 具体编码 | 500 | 720 |
• Code Review | • 代码复审 | 20 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 40 |
Reporting | 报告 | ||
• Test Repor | • 测试报告 | 20 | 20 |
• Size Measurement | • 计算工作量 | 10 | 10 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 5 | 10 |
合计 | 990 |
二、需求分析
我通过百度的方式了解到,四则运算有如下的几个特点:
- 加法、减法、乘法和除法统称四则运算。
- 在没有括号的算式里,如果只有加、减法或者只有乘、除法,都要从左往右按顺序计算。
- 在没有括号的算式里,既有乘、除法又有加、减法的,要先算乘除法,再算加减法。
- 算式有括号,要先算括号里面的,再算括号外面的;大、中、小括号的计算顺序为小→中→大。括号里面的计算顺序遵循以上1、2、3条的计算顺序。
三、设计
1. 设计思路
- 首先生成随机数
- 生成随机四则算式
- 计算
- 输出到txt文件
2. 实现方案
写出具体实现的步骤
- 准备工作:先在Github上创建仓库,克隆到本地...
- 正则表达式拆分
- 逆波兰表达式
四、编码
- 计算符号,生成随机数
- 循环遍历生成随机四则算式
- 将算式传入数组或集合
- 需要分成两个数组,一个存放符号,一个存放数字
- 计算结果
- 将答案打印输出到txt文本
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);
//生成随机运算符号
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. 代码规范
请给出本次实验使用的代码规范:
- 未定义的常量不可使用在代码中
- 左大括号前不换行。左大括号后换行。右大括号前换行。右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
- 在 if/else/for/while/do 语句中必须使用大括号,且保留字与括号之间都必须加空格。
五、测试
- 测试两种输入方式
- 测试三个年段
六、总结
- 看到题目一遍就关掉了页面,然后又打开了...真的很头疼啊哈哈
- 体会到了两个人结队的好处,不管有什么问题两个人都能一起解决,虽然快提交了还是没解决问题,争取这两天解决掉