结对作业

结对项目
这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13230
这个作业的目标 结对项目——实现一个自动生成小学四则运算题目的命令行程序
项目成员
本次结对项目由

林涛 学号 3122004618
林浩全 学号 3122004491
共同完成

正文
github地址 https://github.com/lTsasa/computer/tree/main/3122004618
本次作业的代码已上传github,地址: 结对项目

PSP表格
根据作业要求,我们使用PSP表格预测并记录下队伍完成各部分的时间

设计实现过程
通过命令行获取参数 然后获取算式
算式通过空格分开 以便区别分数和除法
创建一个mynum类 当他的flag为1 的时候 代表是整数 用integer存储
当他的flag为0的时候 代表分数 用up代表分子 down代表分母
然后设计加减乘除算法
对于算式循环两次 一次做乘除法 一次做加减法
对于括号情况 需要先对存在括号进行判别
然后递归括号内容先行获取答案
直到没有括号为止

代码说明
效能分析

重新审视题目,发现对“计算过程中不能产生负数”这一要求的实现有误,代码中对重新生成算式的依据是算式结果的判负。于是对此进行改进
对于每一次算式情况的最新结果进行判别处理
check函数 以及 checkDiv

设计实现过程
Main类 主类,负责接收并分析命令行参数与调用其他模块
IOUtil类 读取文件类,根据路径读取文件的文本内容并返回
MyNum 设置数据类 同时处理加减乘除的逻辑以及通过这个返回字符串的情况

简要流程

代码说明
本部分是生成算式的代码部分,随机循环1到3次,生成1到3个运算符的算式,其中也有随机生成括号的功能

生成算式具体代码

点击查看代码
private static String createPromble() {
        StringJoiner stringBuilder = new StringJoiner(" ", " ", " ");
        String e0 = getNum(random.nextInt(2));
        stringBuilder.add(e0);

        int flag = random.nextInt(2);
        //flag==1 可创建括号
        for (int i = 0; i < random.nextInt(t)+1; i++) {
            String fuHao = strArr[random.nextInt(strArr.length)];
            String e1 = getNum(random.nextInt(2));

            if (fuHao.equals("/") && e1.equals("0")) {
                i--;
                continue;
            }

            stringBuilder.add(fuHao);
            if (flag==1){
                if (random.nextInt(2)==1) {
                    flag++;
                    stringBuilder.add("(");
                }
            }
            stringBuilder.add(e1);
        }
        if (flag==2) stringBuilder.add(")");

        String s = stringBuilder.toString();
        //这里之前是生成算式
        return s;
    }
本部分是结果计算类的计算部分,由于真分数的分割、计算、再拼接过于繁琐,因此我们采用将算式的真分数部分转换为假分数部分,再通过分子分母分离的计算方式进行计算,在最终结果时提供一个化简为真分数的函数返回算式结果。

计算具体代码

点击查看代码
private static MyNum compute(String s) throws Exception {
        // String s = e0.replaceAll(" ", "");
        // System.out.println(s);

        List<MyNum> list = new ArrayList<>();
        List<String> stringList = new ArrayList<>();
        for (String s1 : s.split(" ")) {
            if (s1.length() == 0 || s1.equals("")) continue;
            if (s1.equals("+") || s1.equals("*") || s1.equals("-") || s1.equals("/")) {
                stringList.add(s1);
                continue;
            }

            if (s1.contains("/")) {
                String[] split = s1.split("/");
                Integer up = Integer.valueOf(split[0]);
                Integer down = Integer.valueOf(split[1]);
                list.add(new MyNum(up, down));
            } else {
                list.add(new MyNum(Integer.valueOf(s1)));
            }
        }

        //这里直接计算可行?
        //两次for循环 一次乘除 一次加减
        int current = 0;
        for (int i = 0; i < stringList.size(); i++) {
            String s1 = stringList.get(i);
            if (s1.equals("*") || s1.equals("/")) {
                list.get(current).operator(list.remove(current + 1), s1);
                if (list.get(current).check()||(s1.equals("/")) && list.get(current).checkDiv()   ) {
                    throw new Exception();
                }
            } else {
                current++;
            }
        }

        current = 0;
        for (int i = 0; i < stringList.size(); i++) {
            String s1 = stringList.get(i);
            if (s1.equals("+") || s1.equals("-")) {
                list.get(current).operator(list.remove(current + 1), s1);
                if (list.get(current).check()) {
                    throw new Exception();
                }
            }
        }


        //将所有数字转化为加减乘除
        //我很好奇 括号怎么处理
        //0 * 2 * 1 * 5 / 4
        MyNum myNum = list.get(0);
        myNum.gcd();
        return myNum;

    }
测试运行 我们通过测试不断生成10000条算式并积极寻找异常,其中大有 7/0/2、0'1/2、6'0/5 等各种错式,我们不断分析各种情况改进化简函数和计算函数,将其一一排除 我们通过每次的计算都进行一次判断 将计算过程中有一个数据不符合规则 都抛出异常 随后在最后catch异常都会返回false告诉程序 这次的循环不可用 要求程序进行下一次的计算生成 对于传入文件的问题 我们会直接停止程序 告诉用户那个问题是错误的

测试情况




默认情况 是 里面存了一个文件路径 作为文件题目和答案的传入

算式错误情况

项目小结
林涛:在做项目中,我感受到了很多,不止专业知识的提升、扎实,动手的能力也增强,还有自身也收获到了许多,感觉项目其实没有想象中的那么不可能,我还能回想起开始做项目的时候,感觉自己就是什么也不会,有一种无从下手的错觉。当我真正的开始去写,发现没有做不到,只有不想做。项目虽然看着简单,去做的时候就会发现其实不简单,处理其中的逻辑更是要仔细。
林浩全:让我学习到了更多,小组之间的合作、互助。在项目答辩时,感觉表现的不够好,有很多不足的地方。能获得优秀,自己其实挺惊讶的。希望下次自己表现的更加好

posted @ 2024-09-20 21:10  lt3122004618  阅读(125)  评论(0编辑  收藏  举报