结对作业

news/2024/9/20 21:12:53/文章来源:https://www.cnblogs.com/hashbook/p/18423094

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

测试情况




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

算式错误情况

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800736.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencascade Adaptor3d_CurveOnSurface源码学习

opencascade Adaptor3d_CurveOnSurface 前言用于连接由Geom包中表面上的曲线提供的服务,以及使用这条曲线的算法所要求的服务。该曲线被定义为一个二维曲线,来自Geom2d包,位于表面的参数空间中 方法 1 默认构造函数 Standard_EXPORT Adaptor3d_CurveOnSurface(); 2 通过给定…

Controller层

@RequestMapping(value = "/url",method = RequestMethod.POST) public String selectXXX(@RequestBody(required = false) String typeName){return ""; }I have a dream : Sandy beach B-J-N.

使用U盘PE重装Windows系统

1、概述 操作系统一般都是安装在硬盘内的,硬盘是一种存储数据的介质,U 盘同样也是一种存储数据的介质,因此也可以把操作系统安装进 U 盘里。 因为大部分 U 盘的性能比较差,不能流畅地运行完整版的操作系统,所以只能安装精简了大部分功能、只保留基本运行环境的简化版操作系…

反射相关API

反射的作用 在不修改源码的情况下,扩展功能。 程序在运行的时期,通过反射机制,获取类的所有内部信息,并且操作类的对象。Class类一个类在堆中只有一个Class对象,这个Class对象包含了类的完整结构信息 反射技术是针对Class对象进行操作,在程序运行的时候,动态获取类中的所…

第二十一讲:MySQL有哪些“饮鸩止渴”提高性能的方法?

第二十一讲:MySQL有哪些“饮鸩止渴”提高性能的方法? 简概引言 ​ 不知道你在实际运维过程中有没有碰到这样的情景:业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内、临时性地提升一些性能。 ​ 我以前做业务护航的时候,就偶尔会碰上这种场景。用户的开发…

C++ 数据算数类型

▲ 《C++ Primer》 P30▲ 《C++ Primer》 P38

用户验收测试指南5过渡阶段的UAT

5 UAT的位置 在本书的这一中心章节中,我们将从准备工作的细节中抽身出来,在沉浸于我们的分步方法的细节之前,先从大局出发。UAT 在更大的计划中处于什么位置?它的核心功能和属性是什么?它的总体贡献是什么? 本章涉及的主题作为一系列过渡的 IS 生命周期 过渡规划 作为过渡…

API接口12种安全措施

1. 使用HTTPS:确保数据传输过程中的安全性。2. 使用OAuth2:一种授权框架,用于授权第三方应用访问服务器上的用户数据。3. 使用WebAuthn:一种网络认证标准,用于安全地进行用户认证。4. API进行签名加密:对API请求进行签名以确保请求的完整性和真实性。5. 黑白名单:限制访…

opencascade Bnd_Range源码学习区间计算

opencascade Bnd_Range 前言这个类描述了由两个实数值限定的 1D 空间中的区间。 一个区间可以是无效的,这表示区间中不包含任何点。 方法 1 默认构造函数。创建一个无效区间。 Bnd_Range() ; 2 构造函数。创建最小最大值区间 Bnd_Range(const Standard_Real theMin, const St…

P2414 [NOI2011] 阿狸的打字机

题目思路 将每一个输出的串放入一个 Trie 树中。 考虑离线处理询问 \((x, y)\),对于每一个 \(y\) 集中处理所有的 \(x\),\(y\) 在 Trie 树上走,走过的点标记一下,结果就是 \(x\) 字符串结尾节点在 fail 树上的对应节点的子树的标记数量。 记得在节点离开的时候撤销标记。 代…

0920

线代 舒尔公式,化上三角,下三角,对角阵 范德蒙德行列式 X型行列式,{主对角中下标之和为(2k+1)的两项乘积-副对角中下标之和为(2k+1)的两项乘积【需与前面两项下标号相同】}的连乘 宽对角,a2=4bc,a2≠4bc计组 MAR位数说明存储单元位数 MDR位数说明字长 编译器:将高级语…

DeepFM

参考资料:https://blog.csdn.net/u012328159/article/details/122938925 https://blog.csdn.net/u012328159/article/details/120684544?spm=1001.2014.3001.5501DeepFM FM部分 目前在模型层面做交叉特征的难点主要有以下两个方面:交叉特征的参数独立,强依赖于在样本中的共…