学生姓名,学号,gitcode仓库地址
张宏 | 3121005279 |
---|---|
叶鸿杰 | 3121005277 |
gitcode地址:https://gitcode.net/weixin_60966187/fouroperations
psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 30 |
·Estimate | · 估计这个任务需要多少时间 | 60 | 30 |
Development | 开发 | 1020 | 1200 |
· Analysis | · 需求分析 (包括学习新技术) | 240 | 300 |
· Design Spec | · 生成设计文档 | 60 | 60 |
·Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 90 | 120 |
· Coding | · 具体编码 | 360 | 420 |
· Code Review | · 代码复审 | 30 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 210 |
Reporting | 报告 | 150 | 150 |
· Test Repor | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 60 | 60 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
· 合计 | 1230 | 1380 |
效能分析
性能分析的图
程序中消耗最大的函数
//随机产生一条式子
String Generate_Qs(String r){
StringBuilder res= new StringBuilder();
int sum_num=random.nextInt(3)+2;
for (int i = 1; i <=sum_num; i++) {
if(i!=sum_num)
res.append(Generate_number(r)).append(" ").append(Generate_Symbol()).append(" ");
else res.append(Generate_number(r));
}
return res+"";
}
//随机产生一个整数或者真分数
String Generate_number(String r){
String num;
Outer:
if(!r.contains("/")){
if(Integer.parseInt(r)<=3&&Integer.parseInt(r)>=1){
r=(Integer.parseInt(r)-1)+"'"+"9/10";
break Outer;
}
int rg=Integer.parseInt(r);
num = random.nextInt(rg) + 1 + "";
while(Integer.parseInt(num)==rg) {
num = random.nextInt(rg) + 1 + "";
}
return num;
}
String fake=r;
if(r.contains("'")) fake=Switch_to_fake(r);
double up=Double.parseDouble(fake.substring(0,fake.indexOf("/")));
double down=Double.parseDouble(fake.substring(fake.indexOf("/")+1));
while (true){
int mu=random.nextInt((int) (down*5))+1;
int zi= random.nextInt((int)up*5)+1;
if((zi*1.0)/(mu*1.0)<up/down){
num=Out_gcd(zi+"",mu+"");
num=Switch_to_real(num);
break;
}
}
return num;
}
//随机产生一个符号
String Generate_Symbol(){ //随机产生运算符
String [] cal=new String[4];
cal[0]="+";
cal[1]="-";
cal[2]="*";
cal[3]="/";
return cal[random.nextInt(4)];
}
设计实现过程
类 | 函数 |
---|---|
Calculation | main(主函数) writeText(写入结果文本函数) |
GenerateMath | Out_gcd(化简成最简的假分数) Switch_to_fake(把真分数转换成假分数) Switch_to_real(把假分数转换成真分数) Generate_number(随机产生一个整数或者真分数) Generate_Symbol(随机产生一个符号) Generate_Qs(随机产生一条式子) |
Check | Check_Qs(检查式子是否合法以及是否通过加法,乘法分配律已经存在于集合中) lcm(求两个数的最小公倍数 用于加减法的通分运算) Cal_add(计算某个最简式 加) Cal_delete(计算某个最简式 减) Cal_mul(计算某个最简式 乘) Cal_div(计算某个最简式 除) Cal_min(计算某个最简算术式的调用方法) Cal_Double(计算有分数的情况下的算数最简式) Solve_Qs(计算问题的答案方法,如果是非法的返回"illegal") replace_array(通过计算加减乘除后返回的一个新的数组) Find_x(遍历数组查找算式中是否存在乘号或者除号) |
注:cmd传参形式:-a <answerfile>.txt -e <exercisefile>.txt -g <Grade>.txt -n 题目数量 -r 数值范围
代码说明
关键代码
//计算问题的答案方法,如果是非法的返回"illegal"
String Solve_Qs(String qs){
String[] a =qs.split(" ");
String res="";
//先将乘除都计算掉
while (Find_x(a)!=-1){
int idx=Find_x(a);
int l=idx-1;
int r=idx+1;
res=Cal_min(a[l],a[r],a[idx]);
if(res.equals("illegal"))
return res;
a[l]=res;
a=replace_array(a,idx);
}
//乘除计算完后,剩下的按照从左到右进行计算
for (int i = 1; i <a.length&&a[i]!=null ; i+=2) {
res=Cal_min(a[i-1],a[i+1],a[i]);
if(res.equals("illegal"))
return res;
a[i+1]=res;
}
return res;
}
思路
首先根据Find_x函数查找是否有乘号或者除号,如果有,则从左到右处理这两个符号的最简算术式,得到的结果再拼接组合到原先的字符串中,循环此操作,直到没有乘号和除号的时候,结束循环,
随后从左到右进行计算最简算术式,将得到的结果继续向后运算,直到没有任何加号或者减号,返回结果。如果在过程出现了形如e1-e2<0 或者e1/e2,其中e2等于0的非法情况,则返回“illegal”,其余则返回算术式的结果。
测试运行
运行结果
代码覆盖率
项目小结
从这个项目中我们明白了拿到一个复杂项目首先应该要仔细分析项目需求,要明白这个项目应该分为几部分,哪部分应该给谁做,这样才能分工明确不至于混乱。另外,在实现项目需求的过程中双方要不断交流想法和心得,这样会使双方的代码具有更好的衔接性。
总的来说,这次的项目使我们的编程能力得到了不错的提升!