java随机生成数学算式

news2024/10/10 22:47:04

生成随机数学算式可谓是计算机领域的一个经典的问题,

本文使用JFrame,JButton,JTextField等java图形化工具,生成一个可以随机切换题目,可以实现计时功能的一个图形化界面

源代码展示

randomMath类

package login;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Random;

//Author:XYu1230
//Time:2024/10/10

public class randomMath extends JFrame implements MouseListener {

    ArrayList<Integer> ans = new ArrayList<>(30);
    ArrayList<JTextField> res = new ArrayList<>();
    JButton pd = new JButton("查看评分");
    JButton jb1 = new JButton("切换题目");
    JButton jb2 = new JButton("计时功能");
    JFrame time = new JFrame();
    JTextField inputTime = new JTextField();
    JButton jb3 = new JButton("确认");

    // 程序主体代码

    public randomMath(){
        initJFrame();
        initView();

        this.setVisible(true);

    }


    public void calculateScore(){
        int score = 0;
        for (int i = 0; i < ans.size(); i++) {
            if(ans.get(i).toString().equals(res.get(i).getText())){
                score++;
            }
        }

         double accuracy = score*1.0 / 20;


        String text = "错题数:" + (20 - score) + "\n" +
                "      你的正确率为:" + accuracy ;

//        String s = "SELECT t.*\n" +
//                "     FROM lxy.user t\n" +
//                "     LIMIT 501"
        showJDialog(text);
    }

    public void testTimer(long t){
        MyTimer timer = new MyTimer();
        timer.schedule(new Runnable() {
            @Override
            public void run() {
                //System.out.println("666666");
                calculateScore();
            }
        },t);
    }


    public void initView() {
        this.getContentPane().removeAll();

        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 4; j++) {
                JLabel j1 = new JLabel(rMath());
                JTextField result = new JTextField();
                result.setBounds(i*150+50,j*80,80,30);
                j1.setBounds(i*150,j*80,80,30);
                this.getContentPane().add(j1);
                this.getContentPane().add(result);
                res.add(result);
            }
        }
        pd.setBounds(450,400,120,30);
        Font font = new Font("Serif",Font.BOLD,20);
        pd.setFont(font);
        this.getContentPane().add(pd);
        pd.addMouseListener(this); //添加鼠标监听

        jb1.setBounds(10,500,120,30);
        this.getContentPane().add(jb1);
        jb1.addMouseListener(this);

        jb2.setBounds(10,450,120,30);
        this.getContentPane().add(jb2);
        jb2.addMouseListener(this);

        System.out.println("-------------");
        for (int i = 0; i < ans.size(); i++) {
            System.out.println(ans.get(i));
        }

        this.getContentPane().repaint();
    }

    public void initJFrame() {
        this.setSize(1000, 600);//设置宽高
        this.setTitle("20道随机计算题");//设置标题
        this.setDefaultCloseOperation(3);//设置关闭模式
        this.setLocationRelativeTo(null);//居中
        this.setAlwaysOnTop(true);//置顶
        this.setLayout(null);//取消内部默认布局
    }

    //设置弹窗
    public void showJDialog(String content) {
        //创建一个弹框对象
        JDialog jDialog = new JDialog();
        //给弹框设置大小
        jDialog.setSize(500, 200);
        //让弹框置顶
        jDialog.setAlwaysOnTop(true);
        //让弹框居中
        jDialog.setLocationRelativeTo(null);
        //弹框不关闭永远无法操作下面的界面
        jDialog.setModal(true);

        //创建Jlabel对象管理文字并添加到弹框当中
        JLabel warning = new JLabel(content);
        warning.setBounds(0, 0, 200, 150);
        jDialog.getContentPane().add(warning);

        //让弹框展示出来
        jDialog.setVisible(true);
    }

    //生成算式
    public String rMath(){
        Random r = new Random();
        Character[] chArr = {'+','-','*','/'};
        int first,second;
        char c;
        int index = 0;
        while(true){
             first = r.nextInt(100);
             second = r.nextInt(99)+1;
             c = chArr[r.nextInt(4)];
            if(c == '/' && first % second != 0) continue;
            else if(c == '*' && first * second > 999) continue;
            else if(c == '-' && first - second < 0) continue;
            else {
                if(c == '+') ans.add(first + second);
                else if(c == '-') ans.add(first - second);
                else if(c == '*') ans.add(first * second);
                else if(c == '/') ans.add(first / second);
                break;
            }
        }

        String s = (first +""+ c+ "" + second + " = ").toString();
        return s;
    }

    public void initTimeSet(){

        time.setSize(500, 300);//设置宽高
        time.setTitle("计时设置");//设置标题
        time.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//设置关闭模式
        time.setLocationRelativeTo(null);//居中
        time.setAlwaysOnTop(true);//置顶
        time.setLayout(null);//取消内部默认布局


        inputTime.setBounds(150,100,200,30);
        time.getContentPane().add(inputTime);


        JLabel jl1 = new JLabel("定时时间");
        jl1.setBounds(100,100,80,30);
        time.getContentPane().add(jl1);


        jb3.setBounds(180,200,80,30);
        time.getContentPane().add(jb3);
        jb3.addMouseListener(this);

        time.setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if(e.getSource() == pd){
            calculateScore();
        }
        else if(e.getSource() == jb1){
            ans.clear();
            res.clear();
            System.out.println(ans);
            initView();
        }
        else if(e.getSource() == jb2){
            initTimeSet();
        }
        else if(e.getSource() == jb3){
            String text = inputTime.getText();
            testTimer(Long.parseLong(text));
            showJDialog("计时开始");
            time.setVisible(false);
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}
测试类
package login;

import java.sql.Time;
import java.util.TimerTask;

public class randomMathTest {
    public static void main(String[] args) {
        new randomMath();
    }
}

测试结果展示

麻烦点个赞吧~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp 锁屏显示插件 Ba-LockShow(可让vue直接具备锁屏显示能力)

简介 Ba-LockShow 是一款可以直接使uniapp的vue界面在锁屏页展示的插件。 支持使vue直接具备锁屏显示能力支持设置锁屏显示和不显示支持唤醒屏幕 截图展示&#xff08;仅参考&#xff09; 支持定制、本地包、源码等&#xff0c;有建议和需要&#xff0c;请点击文章结尾“Unia…

【C++】常用数据结构纲要(简易版)

非静无以成学。——诸葛亮 数据结构概括 1、什么是数据结构呢&#xff1f;2、讲述过的结构2、1、前言2、2、树->二叉树->两种平衡二叉树2、3、单链表->双链表->带有哨兵位的链表 3、B树3、1、概念及图示3、2、B树数据处理3、2、1、查找3、2、2、插入 4、哈希表4、1…

不是 PHP 不行了,而是 MySQL 数据库扛不住啊

大多数的业务场景下 PHP 还没有达到性能瓶颈&#xff0c;然而 MySQL 数据库就先行驾崩了。但我们总是不分青红皂白&#xff0c;一股脑的把原因归结于是 PHP 语言不行了&#xff0c;每当遇到这种情形我就会感叹到 PHP 的命真苦啊。PHP 作为一门优秀的开源编程语言&#xff0c;在…

基于WebSocket实现简易即时通讯功能

代码实现 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifa…

C++(vector的实现)

1. vector介绍 vector本质其实就是和我们数据结构中的顺序表类似&#xff0c;都是对一个数组进行增删查改等操作&#xff0c;但是这里vector的实现和顺序表的实现有所不同&#xff0c;vector的底层源码的实现是通过三个迭代器实现的&#xff0c;一个是指向开始的位置_start&…

优化小企业财务,使用记账软件的好处解析

财务记账软件优化企业财务管理&#xff0c;支持开票、在线支付、费用分类、银行对账、工时项目管理、库存管理及税务合规&#xff0c;自动生成报表助企业决策&#xff0c;克服传统电子表格局限&#xff0c;支持企业持续健康发展。 使用财务记账软件的好处和优势 1、开票和计费…

10.pwn 中级ROP

ret2csu 什么是ret2csu&#xff1f; 这个其实就是在程序中一般都会有一段万能的控制参数的gadgets&#xff0c;里面可以控制rbx,rbp,r12,r13,r14,r15以及rdx,rsi,edi的值&#xff0c;并且还可以call我们指定的地址。然后劫持程序执行流的时候&#xff0c;劫持到这个__libc_cs…

seL4 Faults(八)

Faults 学习什么是线程错误理解线程错误和处理器硬件错误是不同的理解什么是错误处理器理解内核对于一个有错误的线程做了什么了解如何设置内核将在其上传递故障消息的端点&#xff08;master与 MCS&#xff09;。在错误故障后学习如何恢复线程。 Background: What is a faul…

(21)Nakagami-m分布及其参数的意义

文章目录 前言一、Nakagami衰落的定义二、Nakagami衰落的形状参数m三、Nakagami衰落的尺度参数ω四、Nakagami随机变量的生成 前言 在无线信道中&#xff0c;由于电波的多径传播效应&#xff0c;接收到的信号强度会因为多条传播路径的相长或相消而发生起伏变化。这种现象被称为…

mysql迁移到达梦数据库报错:参数不兼容

1: 这个错误可能是某个字段‘定义超长’&#xff0c;尝试&#xff1a; 2: 如果还报错&#xff0c;指定和mysql同版本驱动

树状数组——学习心得

可以解决大部分区间上面的修改以及查询的问题&#xff0c;例如1.单点修改&#xff0c;单点查询&#xff0c;2.区间修改&#xff0c;单点查询&#xff0c;3.区间查询&#xff0c;区间修改&#xff0c;换言之&#xff0c;线段树能解决的问题&#xff0c;树状数组大部分也可以&…

全栈开发笔记

1.后端没问题 前端不显示返回数据&#xff1f; 返回数据被&#xff0c;axios拦截器拦截了 2.路径跳转显示空白&#xff1f; 没有配置router 3.后端部署到服务器上 无法通过外网访问接口&#xff1f; 检查服务器防火墙设置 即使服务监听正确&#xff0c;服务器本身的防火墙也可能…

【工作流引擎集成】springboot+Vue+activiti+mysql带工作流集成系统,直接用于业务开发,流程设计,工作流审批,会签

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行的前后端…

前端_002_CSS扫盲

文章目录 概念选择器常用属性背景边框高度和宽度颜色文本字体链接表格里对齐显示相关溢出&#xff0c;滚动条属性 伪类和伪元素 概念 1.书写格式&#xff1a; 选择器{ 属性名:属性值 ; 属性名:属性值 ; } 2.文件后缀.css 选择器 元素选择器 [tag] id选择器 #[id_name] c…

西门子S7-SMART运动控制向导

打开“运动控制”向导&#xff0c;“工具”->“向导”->“运动控制” 图 1.打开“运动控制”向导 选择需要配置的轴 图 2.选择需要配置的轴 为所选择的轴命名 图 3.为所选择的轴命名 输入系统的测量系统&#xff08;“工程量”或者“脉冲数/转”&#xff…

开机启动项在哪里关闭?五个全面指南,教你关闭开机启动项!(新)

您是否发现您的电脑运行性能正在受一些无关紧要的应用程序所影响呢&#xff1f;也许您没有意识到&#xff0c;每当您登录电脑时&#xff0c;许多程序会在不知情的情况下自动启动。这些自动启动的程序不仅会拖慢系统的运行速度&#xff0c;还会占用大量的内存和cpu资源。为了改善…

QT:绘制事件和定时器

1.绘制时针 xx.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include<QPainter> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpubl…

YOLOv11进行图像与视频的目标检测

一、AI应用系统实战项目 项目名称项目名称1.人脸识别与管理系统2.车牌识别与管理系统3.手势识别系统4.人脸面部活体检测系统5.YOLOv8自动标注6.人脸表情识别系统7.行人跌倒检测系统8.PCB板缺陷检测系统9.安全帽检测系统10.生活垃圾分类检测11.火焰烟雾检测系统12.路面坑洞检测…

使用Qt Creator创建项目

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 使用Qt Creator创建项目 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 温馨提示: 1. 新…

Fastjson反序列化

Fastjson反序列化一共有三条利用链 TempLatesImpl&#xff1a;实战中不适用JdbcRowSetImpl&#xff1a;实际运用中较为广泛BasicDataSource&#xff08;BCEL&#xff09; 反序列化核心 反序列化是通过字符串或字节流&#xff0c;利用Java的反射机制重构一个对象。主要有两种…