结队作业1
这是一个大气又可爱的标题
一、预估与实际
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
• Estimate | • 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | ||
• Analysis | • 需求分析 (包括学习新技术) | 40 | 60 |
• Design Spec | • 生成设计文档 | 30 | 40 |
• Design Review | • 设计复审 | 10 | 10 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 10 | 20 |
• Design | • 具体设计 | 30 | 60 |
• Coding | • 具体编码 | 500 | 630 |
• Code Review | • 代码复审 | 20 | 20 |
• Test | • 测试(自我测试,修改代码,提交修改) | 30 | 40 |
Reporting | 报告 | 30 | 40 |
• Test Repor | • 测试报告 | 20 | 25 |
• Size Measurement | • 计算工作量 | 5 | 5 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 5 | 10 |
合计 | 990 |
二、需求分析
我通过百度的方式了解到,四则运算数学有如下的几个特点:
- 运算符在2~4个
- 可以加括号
- 减法运算的结果不能有负数
- 除法运算除数不能为0,不能有余数
三、设计
1. 设计思路
- 计算符号判断,生成随机数
- 生成随机算式
- 计算结果
- 打印到txt文本
2. 实现方案
- 准备工作:先在Github上创建仓库,再用git克隆到本地
- 技术关键点:正则拆分 遍历
四、编码
- 计算符号判断,生成随机数
- for循环生成四则算式
- 将算式传入集合
- 拆分成数字,符号两个集合
- 利用遍历计算结果
- 传回答案,拼接算式和答案,并打印到文本
1. 调试日志
-
一开始计算结果时我从网上找到一段简短又好像挺好用的代码可以很简单的算出结果
代码如下:public class runString { static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript"); /** * @param args */ public static void main(String[] args) { String strs = "1+1*2+(10-(2*(5-3)*(2-1))-4)+10/(5-0)"; try { System.out.println(jse.eval(strs)); } catch (Exception t) { } } }
但算出来的答案都是双精度型的,总是报错,本身自己也不知道网上找的这段代码是什么意思就改用拆分字符串然后再遍历计算结果。
2. 关键代码
public static String anwser(String x3) {
Matcher sz = Pattern.compile("(\\d+)").matcher(x3);
Matcher fh = Pattern.compile("[\\+\\-\\*\\/]").matcher(x3);
LinkedList<String> num = new LinkedList<String>();
LinkedList<String> sym = new LinkedList<String>();
while(sz.find()) {
num.add(sz.group());
}
while(fh.find()) {
sym.add(fh.group());
}
int s=0;
int num1=0;
int num2=0;
for(int i=0;i<sym.size();i++) {
if(sym.get(i).equals("*")||sym.get(i).equals("/")) {
num1=Integer.valueOf(num.get(i));
num2=Integer.valueOf(num.get(i+1));
if(sym.get(i).equals("*")) {
s=num1*num2;
}else if(sym.get(i).equals("/")){
s=num1/num2;
}
num.set(i, String.valueOf(s));
num.remove(i+1);
sym.remove(i);
i--;
}
}
for(int i=0;i<sym.size();i++) {
if(sym.get(i).equals("+")||sym.get(i).equals("-")) {
num1=Integer.valueOf(num.get(i));
num2=Integer.valueOf(num.get(i+1));
if(sym.get(i).equals("+")) {
s=num1+num2;
}else if(sym.get(i).equals("-")) {
s=num1-num2;
}
num.set(i, String.valueOf(s));
num.remove(i+1);
sym.remove(i);
i--;
}
}
return num.get(0);
}
3. 代码规范
请给出本次实验使用的代码规范:
1.左大括号前不换行。
2.左大括号后换行。
3.右大括号前换行。
4.右大括号后还有else等代码则不换行
5.表示终止右大括号后必须换行。
6.if/for/while/switch/do等保留字与括号之间都必须加空格。
五、测试
测试内容 | 输入 | 预期 | 实际) |
---|---|---|---|
-n 100 -grade 1 | 输出100道一年级的题目 | 符合预期 | |
-n 100 -grade 2 | 输出100道二年级的题目 | 符合预期 | |
-n 100 -grade 3 | 输出100道三年级的题目 | 符合预期 | |
-grade 3 -n 100 | 输出100道三年级的题目 | 符合预期 | |
-grade 2 -n 100 | 输出100道二年级的题目 | 符合预期 | |
-grade 1 -n 100 | 输出100道一年级的题目 | 符合预期 | |
-grade g -n 100 | 输入错误程序结束 | 符合预期 | |
-grade 3 -n 10000000000000000 | 输入错误程序结束 | 符合预期 |
六、总结
又是一看到题目就头疼,就上百度看到许许多多四则运算的生成代码,边看边构思,也是满足了要求写完了代码(虽然代码不是很好看- -!)
比较懒,每天就花下午4 、5个小时的时间去写代码
哈哈哈哈哈原本自我介绍上写的每天一小时,一周7-8个小时;写着写着就忍不住往下写了,每天一小时不存在的。
结队工作照: