[Java] [原创]小学生数学练习题目自动生成系统

2017年07月09日 5.065k 次阅读 6 条评论
前几天在装固态硬盘(SSD)分区的时候误把机械硬盘(HDD)分区删除,导致原创的很多程序代码和很多收藏的实用软件等等几百G的文件丢失(心痛啊)。现在决定把自己最近写的代码分享出来,不然下次不小心又弄没了灰都找不回来。

这个小学生数学练习题系统 是我们Java期末的作业,总共3个文件,下面是源代码,由于发布在博客原因代码格式化有问题。源代码最后提供下载。

提供几张运行时截图 原创程序转载请注明出处
QQ截图20170709014441.png
QQ图片20170709014610.png
QQ截图20170709014618.png
QQ图片20170709014541.png

Main.java文件

public class Main {
    public static void main(String[] args) {
        new CreateWindow().MainMenu();
    }
}

CreateWindow.java文件

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class CreateWindow implements ActionListener {
    JFrame menuJFrame = null;
    @SuppressWarnings("rawtypes")
    private JComboBox item = null;
    private JButton submit = null;
    private JButton result = null;
    private JButton pass = null;
    private JTextField youResult[] = null;
    JLabel Math[] = null;
    JLabel labelAnswer[] = null;
    JLabel labelResult[] = null;
    private int[] mathList = null;
    private int[] mathResult = new int[20];
    private boolean passTag = false;
    JPanel answerList[] = null;
    private JLabel grade = null;

    // 主菜单
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void MainMenu() {
        /* 创建组件 */
        menuJFrame = new JFrame("小学生数学练习题目自动生成系统");
        // 标题栏
        JPanel jp1 = new JPanel();
        // 选项栏
        JPanel jp2 = new JPanel();
        // 按钮栏
        JPanel jp3 = new JPanel();
        // 提示信息
        JPanel notice = new JPanel();

        JTextArea text = new JTextArea(6, 34);

        submit = new JButton("提交并生成题目");
        JLabel title = new JLabel("小学生题目生成系统");
        JLabel hint = new JLabel("题目类型:");
        // 下拉框列表
        String itemList[] = { "10以内加法", "10以内减法", "20以内加法", "20以内减法", "100以内加法", "100以内减法", "100以内乘法", "100以内除法" };
        item = new JComboBox(itemList);
        /* 组件创建结束 */

        Container con = menuJFrame.getContentPane();

        // 设置布局方式
        con.setLayout(new GridLayout(4, 1));
        jp1.setLayout(new FlowLayout(FlowLayout.CENTER));
        jp2.setLayout(new FlowLayout(FlowLayout.CENTER));
        jp3.setLayout(new FlowLayout(FlowLayout.CENTER));
        // 将组件加入容器
        jp1.add(title);
        jp2.add(hint);
        jp2.add(item);
        jp3.add(submit);
        notice.add(text);
        con.add(jp1);
        con.add(jp2);
        con.add(jp3);
        con.add(notice);
        // 设置组件属性 事件监听
        text.setText(
                "        本系统是专门为小学生设计的题目练习系统,学生可以根据系统的选项选择相应的题目进行练习,学生提交答案后,系统会判断答案是否正确并统计最终成绩,点击答案按钮后,系统会将每一题的正确答案显示出来。");
        text.setLineWrap(true);
        text.setWrapStyleWord(true);
        text.setForeground(Color.white);
        text.setEditable(false);
        title.setFont(new Font("方正舒体", 1, 26));
        title.setForeground(Color.WHITE);
        submit.setBackground(Color.LIGHT_GRAY);
        jp1.setBackground(Color.DARK_GRAY);
        notice.setBackground(Color.DARK_GRAY);
        text.setBackground(Color.DARK_GRAY);
        submit.addActionListener(this);
        submit.setActionCommand("submit");
        menuJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        menuJFrame.setVisible(true);
        menuJFrame.setResizable(false);
        menuJFrame.setBounds(600, 300, 400, 350);
    }

    // 题目显示界面
    public void answer(String str) {
        JDialog answerJFrame = new JDialog(menuJFrame, "答题面板", true);
        answerList = new JPanel[22];
        JPanel con = new JPanel();
        answerList[20] = new JPanel();
        answerList[21] = new JPanel();
        youResult = new JTextField[20];
        JLabel label[] = new JLabel[20];
        Math = new JLabel[20];
        labelResult = new JLabel[20];
        labelAnswer = new JLabel[20];
        grade = new JLabel("请计算下列题目(每题5分)");
        passTag = false;
        pass = new JButton("提交评卷");
        result = new JButton("查看答案");
        // 按键监听
        pass.addActionListener(this);
        result.addActionListener(this);
        pass.setActionCommand("pass");
        result.setActionCommand("result");
        // 按钮颜色设置
        pass.setBackground(Color.ORANGE);
        pass.setForeground(Color.white);
        result.setBackground(Color.gray);
        result.setForeground(Color.white);
        answerList[21].add(grade);
        answerList[21].setBackground(Color.darkGray);
        grade.setForeground(Color.white);
        grade.setFont(new Font("幼圆", 1, 15));
        con.add(answerList[21]);

        con.setLayout(new BoxLayout(con, BoxLayout.Y_AXIS));

        for (int i = 0; i < 20; i++) {
            label[i] = new JLabel("题号" + String.format("%02d", i + 1) + ":");
            labelAnswer[i] = new JLabel();
            labelResult[i] = new JLabel();
            Math[i] = new JLabel();
            answerList[i] = new JPanel();
            youResult[i] = new JTextField(4);
            // 屏蔽非数字输入
            youResult[i].addKeyListener(new KeyAdapter() {
                public void keyTyped(KeyEvent e) {
                    int keyChar = e.getKeyChar();
                    if (keyChar >= KeyEvent.VK_0 && keyChar <= KeyEvent.VK_9) {

                    } else {
                        e.consume(); // 关键,屏蔽掉非法输入
                    }
                }
            });
        }
        for (int i = 0; i < 20; i++) {
            if (i % 2 != 0) {
                answerList[i].setBackground(Color.darkGray);
                label[i].setForeground(Color.white);
                Math[i].setForeground(Color.white);
                labelResult[i].setForeground(Color.white);
            }
            answerList[i].add(label[i]);
            answerList[i].add(Math[i]);
            answerList[i].add(youResult[i]);
            answerList[i].add(labelAnswer[i]);
            answerList[i].add(labelResult[i]);
            con.add(answerList[i]);
        }

        answerList[20].add(result);
        answerList[20].add(pass);
        con.add(answerList[20]);
        JScrollPane jsp = new JScrollPane(con);
        answerJFrame.add(jsp);
        setMath(str);
        // answerJFrame.pack();
        answerJFrame.setBounds(800, 200, 400, 740);
        answerJFrame.setResizable(false);
        answerJFrame.setVisible(true);
        answerJFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    }

    public void setMath(String str) {
        CreateMath math = new CreateMath();
        switch (str) {
        // 10以内加法
        case "10以内加法":
            for (int i = 0; i < 20; i++) {
                mathList = math.Sum_10();
                mathResult[i] = mathList[2];
                Math[i].setText(mathList[0] + " + " + mathList[1] + " = ");
            }
            break;
        // 20以内加法
        case "20以内加法":
            for (int i = 0; i < 20; i++) {
                mathList = math.Sum_20();
                mathResult[i] = mathList[2];
                Math[i].setText(mathList[0] + " + " + mathList[1] + " = ");
            }
            break;
        // 100以内加法
        case "100以内加法":
            for (int i = 0; i < 20; i++) {
                mathList = math.Sum_100();
                mathResult[i] = mathList[2];
                Math[i].setText(mathList[0] + " + " + mathList[1] + " = ");
            }
            break;
        // 100以内加法
        case "100以内减法":
            for (int i = 0; i < 20; i++) {
                mathList = math.Reduce_100();
                mathResult[i] = mathList[2];
                Math[i].setText(mathList[0] + " - " + mathList[1] + " = ");
            }
            break;
        // 10以内减法
        case "10以内减法":
            for (int i = 0; i < 20; i++) {
                mathList = math.Reduce_10();
                mathResult[i] = mathList[2];
                Math[i].setText(mathList[0] + " - " + mathList[1] + " = ");
            }
            break;
        // 20以内减法
        case "20以内减法":
            for (int i = 0; i < 20; i++) {
                mathList = math.Reduce_20();
                mathResult[i] = mathList[2];
                Math[i].setText(mathList[0] + " - " + mathList[1] + " = ");
            }
            break;
        // 100以内乘法
        case "100以内乘法":
            for (int i = 0; i < 20; i++) {
                mathList = math.Mult();
                mathResult[i] = mathList[2];
                Math[i].setText(mathList[0] + " × " + mathList[1] + " = ");
            }
            break;
        // 100以内除法
        case "100以内除法":
            for (int i = 0; i < 20; i++) {
                mathList = math.Division();
                mathResult[i] = mathList[2];
                Math[i].setText(mathList[0] + " ÷ " + mathList[1] + " = ");
            }
        }
    }

    // 事件监听器
    @Override
    public void actionPerformed(ActionEvent e) {

        String str = (String) item.getSelectedItem();
        // 主菜单生成题目按钮事件
        if (e.getActionCommand().equals("submit")) {
            // menuJFrame.setVisible(false);
            answer(str);
        }
        if (e.getActionCommand().equals("pass")) {
            int status = JOptionPane.showConfirmDialog(null, "确定现在提交你的答案?", "提示信息", JOptionPane.YES_NO_OPTION);
            if (status == 0) {
                int tmp = 0, tmp2 = 0;
                for (int i = 0; i < 20; i++) {
                    if (youResult[i].getText().length() > 0)
                        tmp2++;
                }
                if (tmp2 == 20) {
                    passTag = true;
                    try {
                        for (int i = 0; i < 20; i++) {
                            if (mathResult[i] == Integer.parseInt(youResult[i].getText())) {
                                labelAnswer[i].setText(" √ ");
                                labelAnswer[i].setForeground(Color.RED);
                                tmp += 5;
                            } else {
                                labelAnswer[i].setText(" × ");
                                labelAnswer[i].setForeground(Color.RED);
                            }
                        }
                    } catch (NumberFormatException e1) {
                        JOptionPane.showMessageDialog(null, "请检查你的输入是否有非数字项!", "警告信息", JOptionPane.INFORMATION_MESSAGE);
                    }
                    answerList[21].setBackground(Color.ORANGE);
                    grade.setText("你的最终成绩为:" + tmp + "分");
                    grade.setForeground(Color.RED);
                } else {
                    JOptionPane.showMessageDialog(null, "需要回答完所有题目才能提交!!", "提示信息", JOptionPane.INFORMATION_MESSAGE);
                }
            } else {

            }

        }

        if (e.getActionCommand().equals("result")) {
            if (passTag == true) {
                for (int i = 0; i < 20; i++) {
                    labelResult[i].setText("   本题答案:" + mathResult[i]);
                }
            } else {
                JOptionPane.showMessageDialog(null, "请先提交你的答案才能查看正确答案!", "提示信息", JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }
}

CreateMath.java文件

import java.util.Random;

public class CreateMath {
    // 产生随机数
    private Random ran = new Random();

    /* 生成加法题目开始 */
    public int[] Sum_10() {
        // 10以内
        int array[] = new int[3];
        array[0] = ran.nextInt(8) + 1;
        array[1] = ran.nextInt(9 - array[0]) + 1;
        array[2] = array[0] + array[1];
        return array;
    }

    public int[] Sum_20() {
        // 20以内加法
        int array[] = new int[3];
        array[0] = ran.nextInt(18) + 1;
        array[1] = ran.nextInt(19 - array[0]) + 1;
        array[2] = array[0] + array[1];
        return array;
    }

    public int[] Sum_100() {
        // 100以内加法
        int array[] = new int[3];
        array[0] = ran.nextInt(98) + 1;
        array[1] = ran.nextInt(99 - array[0]) + 1;
        array[2] = array[0] + array[1];
        return array;
    }
    /* 加法题目生成结束 */

    /* 生成减法题目开始 */
    public int[] Reduce_10() {
        int array[] = new int[3];
        int tmp_1 = ran.nextInt(8) + 1;
        int tmp_2 = ran.nextInt(9 - tmp_1) + 1;
        // 设置数据顺序 确保计算结果为正数
        array[0] = tmp_1 > tmp_2 ? tmp_1 : tmp_2;
        array[1] = tmp_1 > tmp_2 ? tmp_2 : tmp_1;
        array[2] = array[0] - array[1];
        return array;
    }

    public int[] Reduce_20() {
        int array[] = new int[3];
        int tmp_1 = ran.nextInt(18) + 1;
        int tmp_2 = ran.nextInt(19 - tmp_1) + 1;
        // 设置数据顺序 确保计算结果为正数
        array[0] = tmp_1 > tmp_2 ? tmp_1 : tmp_2;
        array[1] = tmp_1 > tmp_2 ? tmp_2 : tmp_1;
        array[2] = array[0] - array[1];
        return array;
    }

    public int[] Reduce_100() {
        int array[] = new int[3];
        int tmp_1 = ran.nextInt(98) + 1;
        int tmp_2 = ran.nextInt(99 - tmp_1) + 1;
        // 设置数据顺序 确保计算结果为正数
        array[0] = tmp_1 > tmp_2 ? tmp_1 : tmp_2;
        array[1] = tmp_1 > tmp_2 ? tmp_2 : tmp_1;
        array[2] = array[0] - array[1];
        return array;

    }
    /* 生成减法题目结束 */

    /* 得数在100以内乘法 */
    public int[] Mult() {
        int array[] = new int[3];
        array[0] = ran.nextInt(34) + 1;
        array[1] = ran.nextInt(100 / array[0]);
        array[2] = array[0] * array[1];
        return array;
    }

    /* 生成除法题目 */
    public int[] Division() {
        int array[] = new int[3];
        while (true) {
            array[0] = ran.nextInt(99) + 1;
            array[1] = ran.nextInt(99) + 1;
            if (array[0] % array[1] == 0 && array[0] != array[1] && array[0] > array[1]) {
                array[2] = array[0] / array[1];
                break;
            } else {
                continue;
            }
        }
        return array;
    }
}
源代码下载 小学生数学练习题目自动生成系统源代码.zip
标签: 暂无标签
最后编辑:2019年07月21日
雨落凋殇

聆听雨落的声音,俯瞰凋零的落叶。伫细雨之中,感雨落之殇。

文章评论(6)

  1. 工匠盒子
    工匠盒子  Windows XP Google Chrome 45.0.2454.101

    这个有点安逸,可以给我弟弟用了!哈哈

    2017-08-19 17:10
  2. 一抹阳光
    一抹阳光  Android 6.0.1 Google Chrome 40.0.2214.89

    厉害了,…… :shock:

    2017-07-22 18:22
      1. 雨落凋殇
        雨落凋殇  Android 6.0 Google Chrome 48.0.2564.95

        没什么厉害的,这个算是一个简单的程序了~

        2017-07-23 12:41
  3. hawkhost
    hawkhost  Windows 7 x64 Edition Google Chrome 58.0.3029.110

    都写出来了,版权保护是个问题哦!

    2017-07-15 16:43