用java做小学数学系统_自动生成中小学数学题目的控制台小程序
正版现货scratch+小学数学编程教材
106.5元
包邮
(需用券)
去购买 >
前段时间写了一个自动生成中小学数学题目的控制台小程序
下面简要介绍一下我这次的一个开发过程
需求:
1、命令行输入用户名和密码,如果用户名和密码都正确,提示输入小学、初中和高中三个选项中的一个,否则提示“请输入正确的用户名、密码”;
2、命令行输入小学、初中和高中的选项之一,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;
3、程序读取输入正确的小学、初中和高中三个选项中一个后,控制台提示,“准备生成XX数学题目”(xx为输入的小学、初中和高中三个中的一个)。同时提示“请输入生成题目数量”;
4、题目数量的有效输入范围是“10-30”(含10,30),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复;
5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存。每道题目有题号,每题之间空一行;
实现思路:
首先这个项目的核心部分也是最有挑战性的部分就是出题的部分了,其他的登录和难度选择只需要普通的选择循环就可以搞定。所以我选择主攻这里
随机一道题需要什么呢?
一道最简单的算式是这样的:3x5+4=19
抛开后面的答案来看,一道算式的组成由3个数字和两个运算符组成,那么我就可以先随机产生这道题一共有几个数字,假设有n个数字,那么就会有n-1个运算符,我可以随机生成这些数字和字符。
好了,如果把一道题看成一道菜的话,那么我的材料已经准备好了!然后开始做菜,将这些数字和字母按照数字——字母——数字的顺序去拼接起来。这时,一个最简单的算式就这样生成了。
进阶!
可以看到需求中我们还要对难度进行划分,需要加入平方,开方,三角函数等运算符,怎么加入呢?最开始我的想法和和之前一样,去随机数字以后随机运算符,但是这是会碰到一个问题,如果还是按照之前的方法,就会产生这样的算式:14sin5cos3 ,很显然这个式子是有问题的。我也与同学进行了讨论,我的观念中是存在 14sin5 这样的式子的,但是我忽略了一点很重要的就是我们平常算题的时候经常会省略乘号,如果很正式的写法的话是不能忽略的。退一步来讲,就算 14sin5 成立,如果按照这种方法出题,根本不会出现 14+sin5 这样的式子,所以我需要改变我的出题方法,于是我对随机方法进行了一次处理,如果随机的到特殊运算符,那我就给他前面补充随机一个普通运算符,这样就很好的完成了出题的式子,很开心的看到类似这样的式子 14+sin5-cos3 。
此时你是否感觉已经大功告成了?不,这会还有一个很重要的问题没有处理掉,仔细想想,有没有这样第一个很神奇的运算符,他叫做平方,他不出现在数字前面,而是在数字后面,实践一下,会出现这样的式子:14+²38 ,哈哈。对于这一点我的处理方法是检测式子中的 ² 符号,如果检测到这个字符且他下一位是一个数字,就交换两个字符的位置,然后继续向后比较,就可以很轻松的把式子调整为 14+38² 。(但是这会并不是调整的最佳时机,稍后会提到)
进阶+1!
普通的式子已经可以很完美的生成了。但是括号我们还没有加进去,这一点困扰了我很久,怎么加括号比较好,我开始想到了逆波兰表达式(又称后缀表达式,我们平常使用的是中缀表达式),考虑到学习的时间成本的问题(其实我就是想偷懒QwQ,但是后来项目二次改进的时候我还是重新学了一遍后缀表达式),后来我又按照之前的思路思考,一个算式写好后,最多可以插入几组括号呢?写一个式子看看咯,首先 2+2=4 这个式子不需要括号。那么三个数字的呢?2+3+5=10 这个可以插入一组括号,以此类推,不难发现括号组数是数字个数n-2。那就好办了啊。我随机 n-2 次然后随机判断每次是否插入。然后开始插入,插入 ( 的时候只能插入到数字前面,插入 ) 的时候只能插入到数字后面,这一点是肯定的。其次,要先插入( ,然后标记插入( 的位置 。)只能插在这之后。整体这么插下来以后基本还算好吧。但是会出现括号包含整个算式的情况(没必要),两组括号甚至多组括号重叠的情况(就像这样((())) 需要去重),还有只包围一个数字的情况(没必要)。这时我没有从插入括号的机制上去进行判断,感觉工作量会很大,我这会对出来的式子进行了一次清洗工作,如果碰到这三种式子就直接扔掉重新生成。
好了!算式搞定了!这会我们要写入到试卷中了。
直接写入就好了呀,然后写入完存到文件里,文件的命名很简单,但是要注意每个用户的试卷要分开存放,便于提取其中的内容,这里我才用的做法是在一个papers的文件夹下给每个用户都有一个独立的文件夹去存储试卷。然后出题的时候读取这个用户之前所有的题目进行一个查重工作,防止重复。
最后的就是整个系统的流程控制,流程控制这里我最开始想的是利用循环和选择来进行,后来发现循环写多了以后会很乱,可能会出现6-7层while循环嵌套的情况。不利于阅读与后续的维护。这会我采用了函数的方式去处理了这个问题。
下面展示一下函数表
Demo.main(String[]) //主函数
Demo.menu() //主菜单
Demo.login() //登录界面
menu2(String, String) //二级菜单
selectlevel(String, String) //难度选择
paper_generate(String, int, String) //试卷生成
problem_generate(String) //题目生成
brackets(String) //加括号
isRight(String) //合理性检测
itemIsExist(String, String) //存在性检测
大致就是函数直接互相调用来解决了多层循环嵌套的问题吧。感觉会更好一些,对于开发和后期维护来说,思路上更清晰一些,很多东西找起来也更快一些。同时功能模块的复用性很好,在二次改进的项目中我又直接调用了这次写好的函数模块。
然后这个程序我写了一个简单的用户类,其实并没有起到什么作用,只是开始的时候觉得面对对象编程需要这样一个对象吧。后来证明很需要这个用户类,在下一篇博客中会提到。
最后展示一下程序使用还有源码吧。
实现效果:
源码:https://github.com/yinvoke/Math_Paper
原文链接:https://www.cnblogs.com/yinvoker/p/Yinvoker.html
java 11官方入门(第8版)教材
79.84元
包邮
(需用券)
去购买 >
用java做小学数学系统_自动生成中小学数学题目的控制台小程序相关推荐
- 自动生成中小学数学题目的控制台小程序
前段时间写了一个自动生成中小学数学题目的控制台小程序 下面简要介绍一下我这次的一个开发过程 需求 1.命令行输入用户名和密码,如果用户名和密码都正确,提示输入小学.初中和高中三个选项中的一个,否则提示 ...
- 用java做小学数学系统_小学生数学练习题目自动生成系统——java课程设计
<小学生数学练习题目自动生成系统--java课程设计>由会员分享,可在线阅读,更多相关<小学生数学练习题目自动生成系统--java课程设计(37页珍藏版)>请在金锄头文库上搜索 ...
- 用java做小学数学系统_基于jsp的小学数学试卷生成-JavaEE实现小学数学试卷生成 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的小学数学试卷生成, 该项目可用各类java课程设计大作业中, 小学数学试卷生成的系统架构分为前后台两部分, 最终实 ...
- java 数学测试_自动生成不同难度的数学试卷系统,并输出到txt文件中,命名为当前时间(java)...
前言: 花了一整天时间修修补补写完代码,现在写篇博客,一是希望后来的人有个参考,二是记录下自己的所获方便以后查阅,三是趁众大佬还没做,混点访问量 以前做项目都是自己做,这次是真切的体会到了为别人做事多 ...
- JAVA课程设计 小学生数学练习题目自动生成系统
课程设计的任务和目标 目标: 编写一个能够自动生成小学生数学练习题目的程序.设计一个程序,能够根据用户的选择生成"10以内加法"."10以内减法"." ...
- 怎么做微信会员卡系统_小程序会员系统怎么做
商家搭建好自己的会员卡系统之后,让我们的顾客扫码进入小程序页面就可以领取会员卡,然后可以通过会员卡充值和消费,还可以在会员卡里边充值,充值之后获取更多的优惠,所以各行各业都适合搭建一套属于自己的会员卡 ...
- java sap总账凭证接口_SAP系统接口自动生成会计凭证且无需记账码的方法与流程...
本发明涉及sap系统接口自动生成会计凭证且无需记账码的方法,属于企业信息化管理技术领域. 背景技术: 在企业信息化管理领域,sap系统接口有着非常重要的意义,它担当着sap系统与其他信息系统的桥梁功能 ...
- Java支持latex,基于Java和LaTeX的文档自动生成技术研究
基于Java和 LaTeX 的文档 自动生成技术研究 ◆尚宝欣 徐 屹 (东北电力大学理学院,吉林 长春 132012) [摘 要]讨论了结合Java与LaTex 自动生成 PDF文档的方法.针 展名 ...
- android getter不起作用,java - 如何在Android Studio中自动生成getter和setter
java - 如何在Android Studio中自动生成getter和setter Android Studio中是否有一个快捷方式可以自动生成给定类中的getter和setter? 14个解决方案 ...
最新文章
- Go 知识点(06)— for range 切片并对切片进行 append 不会造成死循环
- BigDecimal的四舍五入的RoundingMode 选择
- MySQL 常见的sql命令
- SpringCloud:Feign接口转换调用服务(Feign 基本使用、Feign 相关配置)
- 2018年10月17日普级B组【模拟赛】
- PLSQL Developer工具远程连接Oracle数据库的方法
- java遍历d盘所有文件夹_java遍历指定盘符的所有文件和文件夹
- c语言 中的求和函数,0基础理解C语言调用汇编实现求和函数
- 多个excel表格数据汇总如何完成
- 【问题解决】安装Oracle数据库,中途提示未找不到文件的解决办法(附带图文)
- web 前端判断身份证号码是否有效
- 在状态栏上显示会闪烁的图标(类似qq消息提示)
- [SCU 4499] 表达式 (IDA*)
- java main 运行_使用maven运行Java Main的三种方法解析
- android VideoView 获取当前播放时间、获取视频长度。
- jQuery的简单介绍
- 【路由器】 AP、路由、中继、桥接、客户端模式之间的区别
- 利用R语言爬取安居客中经纪人数据,并将结果导入msql数据库
- 上传附件显示服务器i o错误,电脑中打开CDR文件出现I/O读错误提示的解决方法
- foxmail打开乱码问题