结对项目
这个作业属于哪个课程 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 / 4MyNum myNum = list.get(0);myNum.gcd();return myNum;}
测试情况
默认情况 是 里面存了一个文件路径 作为文件题目和答案的传入
算式错误情况
项目小结
林涛:在做项目中,我感受到了很多,不止专业知识的提升、扎实,动手的能力也增强,还有自身也收获到了许多,感觉项目其实没有想象中的那么不可能,我还能回想起开始做项目的时候,感觉自己就是什么也不会,有一种无从下手的错觉。当我真正的开始去写,发现没有做不到,只有不想做。项目虽然看着简单,去做的时候就会发现其实不简单,处理其中的逻辑更是要仔细。
林浩全:让我学习到了更多,小组之间的合作、互助。在项目答辩时,感觉表现的不够好,有很多不足的地方。能获得优秀,自己其实挺惊讶的。希望下次自己表现的更加好