作业3:结对项目

news/2025/3/22 16:03:12/文章来源:https://www.cnblogs.com/Chenss1/p/18786618
这个作业属于哪个课程 软工23级
这个作业要求在哪里 作业要求链接
这个作业的目标 合作实现一个自动生成小学四则运算题目的命令行程序
项目成员 陈日强 3123004736, 李铭恩 3123004745
Github仓库链接 Math-Quiz-Generator

一、PSP表格

PSP2.1 阶段 任务 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 60 65
· Estimate 估计任务所需时间 60 65
Development 开发 600 620
· Analysis 需求分析(包括学习新技术) 80 85
· Design Spec 生成设计文档 60 65
· Design Review 设计复审(和同事审核设计文档) 40 45
· Coding Standard 代码规范(为目前的开发制定规范) 30 35
· Design 具体设计 60 70
· Coding 具体编码 180 190
· Code Review 代码复审 50 55
· Test 测试(自我测试,修改代码,提交修改) 100 110
Reporting 报告 90 100
· Test Report 测试报告 40 45
· Size Measurement 计算工作量 30 35
· Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 20 20
合计 900 900

二、性能分析图


三、设计实现过程

QuizGeneratorApp.java:主应用程序类,处理用户交互和命令行参数
manager:管理器包
ExerciseFileManager.java:管理练习题和答案文件的创建、读取和写入
QuizExpressionManager.java:可能用于管理表达式的生成和处理
generator:生成器包
ExpGenerator.java:用于生成数学表达式
evaluator:评估器包
ExpsEvaluator.java:用于评估数学表达式
各类之间的关系
QuizGeneratorApp:作为应用程序的入口,负责用户交互和命令行参数解析。它使用ExerciseFileManager来管理文件操作,并调用ExpGenerator和ExpsEvaluator来生成和评估数学表达式。
ExerciseFileManager:负责文件的创建、读取和写入操作,确保生成的练习题和答案被正确保存。
ExpGenerator:生成数学表达式,供QuizGeneratorApp使用。
ExpsEvaluator:评估生成的数学表达式,计算其结果

四、关键代码

public class ExpGenerator {public static String[] operators = {"+", "-", "×", "÷"};public static Random random = new Random();public static int max;public static int min;public static int num;public static ATRIExp generateExp(int operatorNum, int min, int max) {ExpGenerator.max = max;ExpGenerator.min = min;ExpGenerator.num = operatorNum;return new ATRIExp(generateNode(operatorNum, 1, Integer.MAX_VALUE));}/*** 生成多个表达式* @param num 表达式数量* @param operatorNum 运算符数量* @param min 最小值* @param max 最大值* @return 表达式数组*/public static ATRIExp[] generateExps(int num, int operatorNum, int min, int max) {ATRIExp[] exps = new ATRIExp[num];Set<String> expSet = new HashSet<>();while (expSet.size() < num) {ATRIExp exp = generateExp(operatorNum, min, max);String expStr = exp.toString();if (!expSet.contains(expStr)) {expSet.add(expStr);exps[expSet.size() - 1] = exp;}}return exps;}public static Node generateNode(int num, int min, int max) {if (ExpGenerator.num < 2 && (random.nextBoolean() || ExpGenerator.num == 0)) {return generateNumberNode(min, max);} else {int i = random.nextInt(4);String operator = operators[i];Function function = ExpParser.functions.get(operator);FunctionNode functionNode = new FunctionNode(function);int left = 0;--ExpGenerator.num;Node[] temp = new Node[2];for (int j = 0; j < 2; j++) {Node node;if (j == 1) {switch (operator) {case "+":node = generateNode(ExpGenerator.num, min - left, max - left);break;case "×":
//                            if (left == 0) {
//                                node = new NumberNode(0);
//                            } else {// 向上取整node = generateNode(ExpGenerator.num, (int)Math.ceil(((double) min) / left) , (int)Math.ceil(((double) max) / left));
//                            }break;case "-":node = generateNode(ExpGenerator.num, left - max, left - min);break;case "÷":
//                            try {if (left == 1 && min > 1) {max = 1;}node = generateNode(ExpGenerator.num, Math.max(left, (int) Math.ceil((float) left / max)), max);
//                            } catch (Exception e){
//                                node = new NumberNode(1);
//                            }break;default:throw new IllegalArgumentException("Invalid operator");}} else {if (operator.equals("-")) {node = generateNode(ExpGenerator.num, min + 1, max);} else {node = generateNode(ExpGenerator.num, min, max);}left = node.getIntValue();}temp[j] = node;if (node instanceof FunctionNode) {((FunctionNode) node).setParent(functionNode);}}// 交换两个节点的位置functionNode.addChild(temp[1]);functionNode.addChild(temp[0]);functionNode.calculateIntValue();return functionNode;}}private static Node generateNumberNode(int min, int max) {
//        System.out.println("source: " + min + " " + max);max = Math.min(max, ExpGenerator.max);max = Math.max(ExpGenerator.min, max);min = Math.max(min, ExpGenerator.min);
//        System.out.println("clip: " + min + " " + max);if (min >= max) {return new NumberNode(max);}if (random.nextBoolean()) {try {NumberNode numberNode = new NumberNode(random.nextInt(max - min + 1) + min);return numberNode;}catch (Exception e){return Fraction.toNode(Fraction.randomFraction(min, max));}} else {return Fraction.toNode(Fraction.randomFraction(min, max));}}
}

五、测试数据

六、总结

两个人合作共同实现了该四则运算生成器的基本需求,能够按照要求生成四则运算题目(支持一万道题目生成)、计算答案以及检查对错。

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

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

相关文章

鸿蒙NEXT开发案例:程序员计算器

【环境准备】 • 操作系统:Windows 10 • 开发工具:DevEco Studio 5.0.1 Release Build Version: 5.0.5.306 • 目标设备:华为Mate60 Pro • 开发语言:ArkTS • 框架:ArkUI • API版本:API 13 【项目背景与价值】 在程序员日常开发中,常常需要进行复杂的数学运算(如三角…

自定义异常--java进阶day08

1.自定义异常2.自定义异常的格式 看你想要定义哪种异常,对应的继承哪种异常类以我们之前写的代码举例,Exception类过于庞大,所有的异常子类都可以被它接收,这样就会导致无法精确捕获,所以我们要自定义异常我们自定义一个学生年龄异常定义了自己写的异常后,setAge里面抛出…

boolean io.swagger.v3.oas.models.media.Schema.getExampleSetFlag()

java17 <springdoc.version>2.3.0</springdoc.version> 错误信息 jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchMethodError: boolean io.swagger.v3.oas.models.media.Schema.getExampleSetFlag() 确保项目中使用的 swagger-cor…

异常的两种处理方式--java进阶day08

1.异常的默认处理流程 java中,对于异常的默认处理方式是--向上抛出 之前我们说过,异常都是类,当某个程序出错后,就会自动生成该异常对象,而这个异常对象就如同一颗雷.java的异常默认处理方式--向上抛出,其中上,就是指上一级,调用该程序的那个逻辑 所以,在错误代码那一…

在centOS上更新yum资源报错:Cannot find a valid baseurl for repo: base/7/x86_64

在centOS中更新yum 的资源和新的依赖时,报:Cannot find a valid baseurl for repo: base/7/x86_64 报错内容:[root@localhost ~]# yum update 已加载插件:fastestmirror Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo…

并行计算架构和编程 | Assignment 1: Performance Analysis on a Quad-Core CPU

from pixivvAssignment 1: Performance Analysis on a Quad-Core CPU Environment SetupCPU信息 Architecture: x86_64CPU op-mode(s): 32-bit, 64-bitAddress sizes: 46 bits physical, 57 bits virtualByte Order: Little Endian C…

Contest3923 - 计科23级算法设计与分析上机作业-03

A.质数 题面思路 考虑到输入数据量较大,选择线性欧拉筛预处理 示例代码 #include<bits/stdc++.h>using namespace std;#define ll long long //#define int ll #define pii pair<int, int> #define all(x) x.begin(),x.end() #define fer(i, m, n) for(int i = m;…

leetcode 4. 两个有序数组的中位数(第k大的数)

假设有前 k 小的数,分配到两个数组中综上, 前k-1数的边界偏离(k-1)/2 时,由于大于(k-1)数边界的挤压会伴随小于k的数的边界的外延, 其在(k-1)/2会呈现一方比另一方大的情况,可以直接判定小的一方在小于k的数的边界内 而当k-1数正好在边界内,则同样可以判定小的数在小于k的…

20241227曹鹏泰 python1

课程:《Python 程序设计》 班级: 2412 姓名: 曹鹏泰 学号: 20241227 实验教师:王志强 实验日期:2025 年 3 月 12 日 必修/选修: 公选课 一、实验内容 熟悉 Python 开发环境; 练习 Python 运行、调试技能(编写书中的程序,并进行调试分析,要有过程); 编写程序…

ospfv3收到adv为全零的5类lsa,该怎么处理?

问题现象:ospfv3建立邻居后发现部分路由丢失原因:抓包查看时发现对端华为设备发送的5类LSA报文中ADV为全0,设备将LSA加到LSDB后,未将其加到边界路由表,导致下发路由中缺失部分路由 临时处理办法:下发边界路由时检查LSDB中是否存在ADV为全0的5类LSA,存在则查找LSDB,得到…

FristiLeaks_1

FristiLeaks_1.3 环境搭建 下载:https://download.vulnhub.com/fristileaks/FristiLeaks_1.3.ova 导入后将mac地址修改为:08:00:27:A5:A6:76信息收集 扫描主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 1…

绿联nas防火墙导致docker网络无法互通

问题描述设备:绿联nas dxp4800 系统:ugnas pro 绿联新系统在12月份更新后,原本用nginx代理的alist,青龙等服务全都连接不上,在ugnas系统防火墙设置如下:对外只通过80端口,其他docker服务都只能通过nginx反代访问,系统更新前一直都没问题。 问题排查 经过反复排查发现关…