【java】个人项目:中小学数学卷子自动生成程序

简介: 【java】个人项目:中小学数学卷子自动生成程序

用户:

小学、初中和高中数学老师。

功能:

1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;

2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;

3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);

4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;

5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;

6、个人项目9月26日晚上10点以前提交至创新课程管理系统。提交方式:工程文件打包,压缩包名为“几班+姓名.rar”。迟交2天及以内者扣分,每天扣20%。迟交2天及以上者0分。


附表-1:账户、密码
账户类型 账户 密码 备注
小学 张三1 123
小学 张三2 123
小学 张三3 123
初中 李四1 123
初中 李四2 123
初中 李四3 123
高中 王五1 123
高中 王五2 123
高中 王五3 123

实验源码地址: 中小学生卷子自动生成程序.


第一次个人项目我感觉难度并不是太大,花费了8个小时左右。按照题目的需求,根据用户与系统的交互,分出模块,一步步就能写出来。在过程中,我也基本上没有遇到很难的bug。


这题目是用程序生成算术题,至于软件开发,我第一次想到的就是用java的GUI。毕竟曾经的五子棋,飞机大战也不在话下。


最开始是把登录界面做好。简单的几个部件摆上去就行(采用的是流式布局)。麻烦的在于,部件一般会挤在一起,这时候就要定义空的JLabel来进行填充。使得界面更好看。


JFrame jf = new JFrame();
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setSize(500, 400);
    jf.setTitle("个人项目1_软件1903梁原韶");
    jf.setLocationRelativeTo(null);
    //设置边框布局
    FlowLayout fl = new FlowLayout();
    jf.setLayout(fl);
    //设置登录的组件
    JLabel namejla = new JLabel("账号:");
    namejla.setFont(new Font("楷体", Font.BOLD, 20));
    JLabel pwdjla = new JLabel("密码:");
    pwdjla.setFont(new Font("楷体", Font.BOLD, 20));
    //用户名输入框
    JTextField nameField = new JTextField();
    nameField.setPreferredSize(new Dimension(300, 40));
    nameField.setFont(new Font("楷体", Font.BOLD, 20));
    //密码输入框
    JPasswordField pwdField = new JPasswordField();
    pwdField.setPreferredSize(new Dimension(300, 40));
    //登录注册按钮
    JButton btn1 = new JButton("登录");
    btn1.setFont(new Font("楷体", Font.BOLD, 20));
    btn1.setPreferredSize(new Dimension(80, 40));
    JButton btn2 = new JButton("注册");
    btn2.setFont(new Font("楷体", Font.BOLD, 20));
    btn2.setPreferredSize(new Dimension(80, 40));
    //设置空的文本进行填充,使得流式布局的界面更好看
    JLabel jl1 = new JLabel("       中小学数学卷子自动生成程序");
    jl1.setFont(new Font("楷体", Font.BOLD, 24));
    jl1.setPreferredSize(new Dimension(500, 100));
    JLabel jl2 = new JLabel("");
    jl2.setPreferredSize(new Dimension(50, 40));
    JLabel jl3 = new JLabel("");
    jl3.setPreferredSize(new Dimension(50, 40));
    JLabel jl4 = new JLabel("");
    jl4.setPreferredSize(new Dimension(500, 20));
    //设置监听器,并监听两个按钮
    LoginUIListener listener = new LoginUIListener();
    btn2.addActionListener(listener);
    btn1.addActionListener(listener);
    //将用户名和密码输入框传给监听器,方便取值
    listener.setNameField(nameField);
    listener.setPwdField(pwdField);
    listener.setJf(jf);
    //加上组件
    jf.add(jl1);
    jf.add(namejla);
    jf.add(nameField);
    jf.add(jl2);
    jf.add(jl4);
    jf.add(pwdjla);
    jf.add(pwdField);
    jf.add(jl3);
    jf.add(btn1);
    jf.add(btn2);
    //最后可视化
    jf.setVisible(true);

然后就是。类首先定义User定义张三1,李四2,王五3的那些用户的数据了。因为登录需要进行检测。

public class User
{
  //老师的用户名
  private String name;       
  //老师的密码
  private String password;    
  //老师的类型,"小学","初中","高中"
  private String type;
  //....下面是setter getter方法
  ....
}
有类后,再用 列表模拟整个数据库 。事先构造后所有数据后装入,然后定义一个检查用户名,和密码的函数。判断数据库里面是否有对应的用户存在。

之后点击登录按钮,就能进行判断了。按钮的回调也是毕竟简单的。


之后就是主界面



点击《切换类型按钮》,获取小学老师的JLable,然后修改,为初中。获取初中老师的JLable,修改为高中,获取高中老师的JLable,修改为小学。不断点击就能切换老师要出题目的类型。


在输入框中填入题目数量后,点击《生成题目》后进行判断,-1就退出。不在10到30间就重新输入。符号条件后,就到了比较麻烦的生成卷子的步骤了。


我的出卷思路是:

1,随机生成 1-5个操作数,数目用operand_num接收。(如果是小学题目,则为2-5个操作数)。并用字符串数组来装这几个操作数。(理由下面会讲到)

2,

①小学题目:

操作数之间随机用加+,减-,乘*,除/进行连接。得到一个表达式formula


②初中题目:

因为操作数里面必须有,平方或者开根号。我就随机1-operand_num。个数目,进行特殊操作。50%概率加 ²,50%概率加√。分别加到操作数的后面和前面。

这里有一个问题。如果加了平方,又加了根号怎么办呢?这时候我用了一个标记数组,加了就设为True。这样就不会重复加了


③高中题目:

原理和初中题目类似,不同的是。第一次必须,分别以33%概率加上sin,cos,和tan。之后的剩余0到Randow.next(operand_num)次,再分别以20%概率加上, ²,√sin,cos,tan。(sin,cos,tan,都是加到操作数的的前面)

同样最后也用了标记数组。防止重复进行添加特殊符号。


3,最后就是加括号的问题了。

如果operand_num>=3才加括号。括号包括的元素个数为至少为

2-operand_num-1。因此我先随机出括号的长度。1-perand_num-1。然后随机出,左括号的操作数索引,然后加上括号长度就是右括号操作数的索引。


4,最后加上 “=” ,写入txt文件。


每次只能产生一个表达式,循环几次就产生几个表达式。


张三小学


李四初中


王五高中


实验源码地址: 中小学生卷子自动生成程序.




相关文章
|
2月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
370 1
|
3月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
131 2
|
1月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
317 98
|
3月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
1218 1
|
5月前
|
前端开发 JavaScript Java
Java 学习路线规划及项目案例中的技术栈应用解析
内容包括:**Java 17核心特性**(如sealed class、record)与模块化开发;Spring Boot 3 + Spring Cloud微服务架构,涉及响应式编程(WebFlux)、多数据库持久化(JPA、R2DBC、MongoDB);云原生技术**如Docker、Kubernetes及CI/CD流程;性能优化(GraalVM Native Image、JVM调优);以及前后端分离开发(Vue 3、Spring Boot集成)。通过全栈电商平台项目实战,掌握从后端服务(用户、商品、订单)到前端应用(Vue 3、React Native)的全流程开发。
252 9
|
3月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
487 64
|
2月前
|
IDE 安全 Java
Lombok 在企业级 Java 项目中的隐性成本:便利背后的取舍之道
Lombok虽能简化Java代码,但其“魔法”特性易破坏封装、影响可维护性,隐藏调试难题,且与JPA等框架存在兼容风险。企业级项目应优先考虑IDE生成、Java Records或MapStruct等更透明、稳健的替代方案,平衡开发效率与系统长期稳定性。
175 1
|
2月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
2月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。