结对编程:四则运算

学生姓名,学号,gitcode仓库地址

张宏3121005279
叶鸿杰3121005277

gitcode地址:https://gitcode.net/weixin_60966187/fouroperations

psp表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划6030
·Estimate· 估计这个任务需要多少时间6030
Development开发10201200
· Analysis· 需求分析 (包括学习新技术)240300
· Design Spec· 生成设计文档6060
·Design Review· 设计复审3030
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)3030
· Design· 具体设计90120
· Coding· 具体编码360420
· Code Review· 代码复审3030
· Test· 测试(自我测试,修改代码,提交修改)180210
Reporting报告150150
· Test Repor· 测试报告6060
· Size Measurement· 计算工作量6060
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划3030
· 合计12301380

效能分析

性能分析的图

在这里插入图片描述
在这里插入图片描述

程序中消耗最大的函数

//随机产生一条式子
    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)];
    }

设计实现过程

函数
Calculationmain(主函数)
writeText(写入结果文本函数)
GenerateMathOut_gcd(化简成最简的假分数)
Switch_to_fake(把真分数转换成假分数)
Switch_to_real(把假分数转换成真分数)
Generate_number(随机产生一个整数或者真分数)
Generate_Symbol(随机产生一个符号)
Generate_Qs(随机产生一条式子)
CheckCheck_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”,其余则返回算术式的结果。

测试运行

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码覆盖率

在这里插入图片描述

项目小结

从这个项目中我们明白了拿到一个复杂项目首先应该要仔细分析项目需求,要明白这个项目应该分为几部分,哪部分应该给谁做,这样才能分工明确不至于混乱。另外,在实现项目需求的过程中双方要不断交流想法和心得,这样会使双方的代码具有更好的衔接性。

总的来说,这次的项目使我们的编程能力得到了不错的提升!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值