PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
? Estimate | ? 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | ||
? Analysis | ? 需求分析 (包括学习新技术) | 60 | 240 |
? Design Spec | ? 生成设计文档 | 20 | 40 |
? Design Review | ? 设计复审 | 5 | 5 |
? Coding Standard | ? 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
? Design | ? 具体设计 | 20 | 40 |
? Coding | ? 具体编码 | 120 | 990 |
? Code Review | ? 代码复审 | 30 | 20 |
? Test | ? 测试(自我测试,修改代码,提交修改) | 60 | 300 |
Reporting | 报告 | ||
? Test Repor | ? 测试报告 | 60 | 70 |
? Size Measurement | ? 计算工作量 | 5 | 5 |
? Postmortem & Process Improvement Plan | ? 事后总结, 并提出过程改进计划 | 10 | 10 |
合计 | 450 | 1800 |
我通过上网调查的方式了解到,这次任务有如下的几个特点:
- 准备工作:先在github上创建仓库,克隆到本地。
- 重要关键点:逆波兰式的理解以及应用
运算表达式的生成和逆波兰式的转换
public class Calculate {
// 构造方法传入题目
public static int ans(String str) {
// TODO Auto-generated constructor stub
squestion = str;
cutStr();
reversePolishNotation();
return compute();
}
// 题目的字符串
public static int slen;
public static String[] scut = new String[100];
public static String squestion;
// 存操作符的栈
public static Stack<String> soperators = new Stack<>();
// 存放转换后的逆波兰式
public static Stack<String> srpn = new Stack<>();
// 用于调换逆波兰式的顺序
public static Stack<String> srpnb = new Stack<>();
// 计算逆波兰式用的栈
public static Stack<String> cal = new Stack<>();
public static boolean isNum(String str) {
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
}
// 将字符串的题目切割成数值和符号
public static void cutStr() {
int n = 0;
String str=squestion.replaceAll(" ", "");
squestion=str;
for (int i = 0; i < squestion.length(); i++) {
if (Character.isDigit(squestion.charAt(i))) {
if ((i + 1) < squestion.length() && Character.isDigit(squestion.charAt(i + 1))) {
int num = (squestion.charAt(i) - ‘0‘) * 10 + (squestion.charAt(i + 1) - ‘0‘);
scut[n] = String.valueOf(num);
n++;
i++;
} else if (squestion.charAt(i) == ‘ ‘) {
} else {
int num = squestion.charAt(i) - ‘0‘;
scut[n] = String.valueOf(num);
n++;
}
} else {
scut[n] = String.valueOf(squestion.charAt(i));
n++;
}
}
slen = n;
}
public static int priority(String str) {
switch (str) {
case "(":
return 0;
case "+":
case "-":
return 1;
case "*":
case "/":
return 2;
default:
return -1;
}
}
// 转换成逆波兰式
public static void reversePolishNotation() {
for (int i = 0; i < slen; i++) {
if (!(scut[i].equals("+") || scut[i].equals("-") || scut[i].equals("*") || scut[i].equals("/") || scut[i].equals("(") || scut[i].equals(")"))) {
srpn.push(scut[i]);
} else {
if (soperators.isEmpty() || scut[i].equals("(")) {
soperators.push(scut[i]);
} else {
if (priority(scut[i]) > priority(soperators.peek())) {
soperators.push(scut[i]);
} else {
if(scut[i].equals(")")) {
while (!soperators.peek().equals("(")) {
srpn.push(soperators.pop());
}
soperators.pop();
}else {
while ((!soperators.isEmpty()) && (priority(soperators.peek()) >= priority(scut[i]))) {
srpn.push(soperators.pop());
}
soperators.push(scut[i]);
}
}
}
}
}
while (!soperators.isEmpty()) {
srpn.push(soperators.pop());
}
}
public static int compute() {
// 倒换逆波兰式顺序
while (!srpn.isEmpty()) {
srpnb.push(srpn.pop());
}
while (!srpnb.isEmpty()) {
if (srpnb.peek().equals("+") || srpnb.peek().equals("-") || srpnb.peek().equals("*")
|| srpnb.peek().equals("/")) {
String sym = srpnb.pop();
int a = Integer.parseInt(cal.pop());
int b = Integer.parseInt(cal.pop());
if (sym.equals("+")) {
cal.push(String.valueOf(b + a));
} else if (sym.equals("-")) {
cal.push(String.valueOf(b - a));
} else if (sym.equals("*")) {
cal.push(String.valueOf(b * a));
} else {
cal.push(String.valueOf(b / a));
}
} else {
cal.push(srpnb.pop());
}
}
return Integer.parseInt(cal.pop());
}
}
请给出本次实验使用的代码规范:
测试输入 | 输出 | 是否符合预期效果 | |
-n 100 -grade 1 | 执行成功 | 是 | |
-n 100 -grade 2 | 执行成功 | 是 | |
-n 100 -grade 3 | 执行成功 | 是 | |
-grade 1 -n 100 | 执行成功 | 是 | |
-grade 2 -n 100 | 执行成功 | 是 | |
-grade 3 -n 100 | 执行成功 | 是 |
这次的任务真的太难了,耗费的时间太多了。 很多内容都需要上网查找思路,经过这次的任务让我感到更加没有头绪 的怎么去面对去学习代码去适应,感觉自己还是需要更深的去理解和实践代码。
原文:https://www.cnblogs.com/rickowens/p/9672106.html