结对项目:四则运算题目生成

news/2024/9/22 16:01:57/文章来源:https://www.cnblogs.com/wanky/p/18425414
这个作业属于哪个课程 22级计科1班
这个作业要求在哪里 作业要求
这个作业的目标 自动生成小学四则运算题目
github项目链接 链接

姓名&学号

姓名 学号
万凯毅 3122004788
周彦安 3122004804

PSP

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

功能

生成题目

输出

控制台输出

题目

答案

效能分析

优化前

每生成一个题目就使用append的形式写入文件

优化后

生成所有题目后,一次性写入文件

分析

优化前后生成10000道题目以及答案的耗时都是700ms左右,性能差别主要在文件io上,优化前相当于对文件做了10000次io,优化后只有一次io

设计实现过程

总体流程

生成单个题目流程

判断题目是否重复

利用多级树型结构逐层判断,如果到最后一层出现相同的,则认为是重复表达式:

代码说明

批量随机生成题目

每次生成题目时校验是不是负数、是否重复,如果不满足要求就不断重新生成

  /*** 批量随机生成题目** @param range             操作数的大小范围* @param numberOfQuestions 最大题目数* @return 题目,答案*/public static Tuple2<List<String>, List<String>> generateQuiz(int range, int numberOfQuestions) {int duplicateCount = 0;int negativeCount = 0;int totalCount = 0;List<String> quizzes = new ArrayList<>(numberOfQuestions);List<String> answers = new ArrayList<>(numberOfQuestions);for (int i = 1; i <= numberOfQuestions; i++) {int maxOperators = generateRandomOperatorCounts();while (true) {totalCount++;List<String> operands = new ArrayList<>();List<String> operators = new ArrayList<>();for (int j = 0; j < maxOperators + 1; j++) {String lastOperator = operators.isEmpty() ? "" : operators.get(operators.size() - 1);Fraction operand = FractionUtils.generateRandomOperand(lastOperator, range);operands.add(operand.toString());if (j < maxOperators) {operators.add(generateRandomOperator());}}StringBuilder quiz = new StringBuilder();for (int j = 0; j < operands.size(); j++) {quiz.append(operands.get(j));if (j < operators.size()) {quiz.append(" ").append(operators.get(j)).append(" ");}}String expression = quiz.toString();if (operands.size() > 2 && RANDOM.nextBoolean()) {expression = addRandomParentheses(expression);}String postfix = ExpressionUtils.infixToPostfix(expression);Fraction result = ExpressionUtils.evaluatePostfix(postfix);if (Objects.nonNull(result)) {if (!DuplicateChecker.isDuplicate(result, expression)) {quizzes.add(i + ". " + expression);answers.add(i + ". " + result);break;} else {duplicateCount++;}} else {negativeCount++;}}}System.out.println("生成" + numberOfQuestions + "道题目完成,总次数:" + totalCount + ",重复次数:" + duplicateCount + ",负数次数:" + negativeCount);return new Tuple2<>(quizzes, answers);}

题目去重

  // key:表达式的结果;value:map(key:表达式的长度,value:map集合(key:表达式中的每一个操作数或操作符;value:该字符串出现的次数))private static final Map<String, Map<Integer, List<Map<String, Integer>>>> DUMPLICATE_MAP = new HashMap<>();public static boolean isDuplicate(Fraction result, String expression) {// 已创建的表达式中,如果有计算结果相同,且表达式中的所有字符和出现的次数都一样,就认为是重复的String resultStr = result.toString();expression = expression.replaceAll("[()]", "");Integer length = expression.length();// 统计表达式中每个操作数和操作符出现的次数Map<String, Integer> characterCountMap = Arrays.stream(expression.split("\\s+")).collect(Collectors.groupingBy(Function.identity(),Collectors.collectingAndThen(Collectors.counting(), Long::intValue)));Map<Integer, List<Map<String, Integer>>> expressionLengthMap = DUMPLICATE_MAP.get(resultStr);if (expressionLengthMap != null) {// 存在计算结果相同的表达式List<Map<String, Integer>> characterCountMapList = expressionLengthMap.get(length);if (characterCountMapList != null) {// 存在长度相同的表达式boolean isDuplicate = characterCountMapList.stream().anyMatch(map -> map.equals(characterCountMap));if (isDuplicate) {// 存在操作数和操作符出现次数相同的表达式return true;}}} else {expressionLengthMap = new HashMap<>();DUMPLICATE_MAP.put(resultStr, expressionLengthMap);}List<Map<String, Integer>> characterCountMapList = expressionLengthMap.computeIfAbsent(length, k -> new ArrayList<>());characterCountMapList.add(characterCountMap);return false;}

判题

输出

控制台输出

结果输出

效能分析

分析:对10000道题目和答案进行校验,耗时主要在题目结果的计算上

测试和异常情况

  1. args参数:
    • -n 和 -r 的参数如果没有就是默认值10
    • -n 和 -r 的参数必须是整数类型的值
    • -e 和 -a 的参数必须同时存在或不存在
    • -e 和 -a 参数不满足格式 xxx.txt
    • -e 和 -a 参数的文件必须存在
  2. 校验题目:题目数和答案数必须一致
  3. 生成题目:-r 给出的参数不支持生成 -n 的题目数

项目小结

本项目开发了一个智能数学题目生成器,能够随机生成包含加法、减法、乘法和除法的数学表达式,并支持题目的有效性校验与答案计算。加强了代码规范,性能优化,设计分析以及团队合作的能力。

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

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

相关文章

帝国CMS搬家后无法发文章或者上传图片无法显示?

如果你在搬家后遇到无法发文章或上传图片的问题,通常是因为权限设置不当导致的。以下是一些详细的步骤来解决这些问题: 1. 检查目录权限 无法发文章检查栏目目录及子文件夹权限确保栏目目录及其子文件夹具有适当的权限。 通常需要将这些目录设置为 777 权限。shchmod -R 777 …

WordPress数据库连接失败是最常见的错误情况

WordPress数据库连接失败常见原因及解决方法 官方提示的三种情况数据库名、用户名或密码错误解决方法:检查并确认数据库名称、用户名和密码是否正确无误。数据库主机地址错误解决方法:通常填写localhost即可;如果是远程数据库,请根据主机提供商提供的地址进行填写。数据库未…

打靶记录 SickOS 1.1

https://www.vulnhub.com/entry/sickos-11,132/主机发现端口扫描探测存活主机,136是靶机,因为靶机是我最后添加的 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-22 11:36 CST Nmap scan report for 192.168.75.1 Host is up (0.00038s l…

简单部署Memos

从0到1借助宝塔面板快速部署Memos前言:此处以阿里云为例,利用宝塔面板部署 此文章是部署之后写的,因此有些截图是后补充的,缺少一些执行结果展示和详细步骤的缺失,请根据实际情况做调整准备购买阿里云服务器 ECS着手 创建实例进入阿里云控制台,我的资源→云服务器 ECS; …

发展低空经济,对地理信息技术提出了哪些要求

随着低空经济的快速发展,地理信息技术在其中扮演着越来越重要的角色。低空经济涉及无人机、电动垂直起降(eVTOL)飞行器等航空器的低空飞行活动,其对地理信息技术提出了新的要求和挑战。 1. 高精度定位与导航低空经济中的无人机和eVTOL等航空器需要精确的定位和导航服务。地…

05-信息扫描漏洞探测的工具使用

1、安装并使用Nmap扫描一个地址(本机、VPS、虚拟机环境都可以),提供扫描结果截图在https://nmap.org/ nmap官网下载对应的操作系统版本文件。安装完成后对本机10.0.0.151进行 -A(探测操作系统及版本),-T4(加速扫描),-sS(半连接扫描)。2、安装并使用Xray被动扫描,提供过程…

帝国网站管理系统忘记后台账号和密码怎么办?

如果你忘记了帝国网站管理系统的后台账号和密码,可以通过以下几个步骤来尝试恢复或重置: 情况一:只知道密码忘记了使用数据库管理工具登录phpMyAdmin或其他数据库管理工具。 选择帝国CMS所使用的数据库。 找到用户表,通常为phome_enewsuser,但请注意实际表名可能会根据安装…

帝国CMS提示“Notice: Use of undefined constant”错误说明: php.ini配置问题

当你在 PHP 应用中遇到 “Notice: Use of undefined constant” 的错误提示时,这通常是因为代码中引用了一个未定义的常量。这种错误通常不会导致程序崩溃,但会影响代码的可读性和稳定性。 错误原因未定义的常量代码中引用了一个未定义的常量。错误报告级别当前的错误报告级别…

帝国CMS忘记后台管理员帐号怎么办?使用MySQL数据库管理软件phpmyadmin

如果你忘记了帝国CMS后台管理员的账号,可以通过直接查询数据库的方式来找回或重置账号。以下是具体的步骤: 步骤一:登录phpMyAdmin访问phpMyAdmin打开浏览器,访问phpMyAdmin的URL,通常是: http://yourdomain.com/phpmyadmin其中yourdomain.com需要替换成你的实际域名或者…

帝国CMS忘记后台登陆密码怎么办啊?

如果你忘记了帝国CMS后台的登录密码,可以通过直接修改数据库中的相关记录来进行密码重置。以下是具体的步骤: 步骤一:登录phpMyAdmin访问phpMyAdmin打开浏览器,访问phpMyAdmin的URL,通常是: http://yourdomain.com/phpmyadmin其中yourdomain.com需要替换成你的实际域名或…

帝国cms安装问题Cannt connect to DB!解决办法

当你在安装帝国CMS时遇到“Cannt connect to DB!”的问题,这通常意味着PHP脚本无法连接到数据库。这种情况可能是由多种因素引起的,包括数据库服务未运行、数据库配置错误、网络问题等。 解决方法 1. 检查数据库服务状态确认MySQL服务是否运行如果是在本地开发环境中,检查是…

您输入的数据库名不存在

当你在安装帝国CMS时遇到“您输入的数据库名不存在”的错误,这意味着PHP脚本无法找到你指定的数据库。这种情况通常是由以下几个原因造成的: 原因分析数据库名称错误:输入的数据库名称不正确。 数据库未创建:指定的数据库尚未创建。 数据库用户权限不足:数据库用户没有足够…