首页 > 其他分享 >Set<String>和JTextField

Set<String>和JTextField

时间:2024-10-03 18:11:42浏览次数:7  
标签:answerFields Set generatedQuestions 30 new JTextField

import javax.swing.;
import java.awt.
;
import java.util.HashSet;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;

public class Sizeyunsuan {
public static void main(String[] args) {
int i = 1;
Set generatedQuestions = new HashSet<>(); // 用于存储已生成的题目
int[] answers = new int[30]; // 用于存储每道题的答案

    String[] questionArray = new String[30]; // 用于存储每道题
    JTextField[] answerFields = new JTextField[30]; // 用于存储每道题的答案框

    while (i <= 30) {
        int num1 = (int) (Math.random() * 100);
        int num2 = (int) (Math.random() * 100);
        String question = ""; // 存储生成的题目
        int answer = 0; // 存储答案

        if (i <= 5) {
            question = num1 + " + " + num2 + " = ?"; // 加法
            answer = num1 + num2;
        } else if (i <= 10) {
            // 确保 num1 大于 num2
            if (num1 < num2) {
                int temp = num1;
                num1 = num2;
                num2 = temp;
            }
            question = num1 + " - " + num2 + " = ?"; // 减法
            answer = num1 - num2;
        } else if (i <= 20) {
            if (num1 * num2 < 1000) {
                question = num1 + " * " + num2 + " = ?"; // 乘法
                answer = num1 * num2;
            }
        } else if (i <= 30 && num2 * num1 != 0 && num1 != num2) {
            if (num1 % num2 == 0) {
                question = num1 + " / " + num2 + " = ?"; // 除法
                answer = num1 / num2;
            }
        }

        // 检查题目是否重复
        if (!question.isEmpty() && !generatedQuestions.contains(question)) {
            generatedQuestions.add(question); // 添加题目到集合中
            answers[i - 1] = answer; // 保存答案
            questionArray[i - 1] = question; // 保存题目
            answerFields[i - 1] = new JTextField(10); // 创建答案输入框
            i++; // 仅在成功添加新题目时才增加计数器
        }
    }

    // 创建一个面板来显示所有问题和输入框,设置为六行五列
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(6, 5)); // 设置网格布局

    for (int j = 0; j < 30; j++) {
        panel.add(new JLabel(questionArray[j])); // 添加题目标签
        answerFields[j] = new JTextField(10); // 创建答案输入框
        panel.add(answerFields[j]); // 添加答案输入框
    }

    // 获取用户输入的答题时间
    String timeInput = JOptionPane.showInputDialog(null, "输入答题时间(秒):");
    int timeLimit;

    try {
        timeLimit = Integer.parseInt(timeInput);
        if (timeLimit <= 0) {
            throw new NumberFormatException();
        }
    } catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(null, "请输入一个有效的正整数!", "输入错误", JOptionPane.ERROR_MESSAGE);
        return;
    }

    // 启动倒计时
    final int[] remainingTime = {timeLimit};
    Timer countdownTimer = new Timer();
    countdownTimer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            if (remainingTime[0] > 0) {
                remainingTime[0]--;
            } else {
                // 时间到时,显示提示并结束答题
                JOptionPane.showMessageDialog(null, "时间到!", "提示", JOptionPane.WARNING_MESSAGE);
                countdownTimer.cancel(); // 倒计时结束时取消定时器
                checkAnswers(questionArray, answers, answerFields); // 检查答案并显示结果
                JOptionPane.getRootFrame().dispose(); // 关闭对话框
            }
        }
    }, 0, 1000); // 每秒更新一次

    // 显示问题和答案输入框的对话框
    int result = JOptionPane.showConfirmDialog(null, panel, "填写答案", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

    // 停止计时器
    countdownTimer.cancel(); // 如果用户完成答题或时间到,停止倒计时

    if (result == JOptionPane.OK_OPTION) {
        checkAnswers(questionArray, answers, answerFields); // 检查答案并显示结果
    }
}

// 检查答案并显示结果
private static void checkAnswers(String[] questionArray, int[] answers, JTextField[] answerFields) {
    StringBuilder resultText = new StringBuilder("答题情况:\n");
    int correctCount = 0;

    for (int j = 0; j < 30; j++) {
        String userInput = answerFields[j].getText(); // 获取用户输入的答案
        int userAnswer = userInput.isEmpty() ? 0 : Integer.parseInt(userInput); // 转换用户输入的答案
        resultText.append(questionArray[j]).append(" ");

        // 判断答案
        if (userInput.isEmpty()) {
            resultText.append("未作答,正确答案是:").append(answers[j]).append("\n"); // 未填写的视为错误
        } else if (userAnswer == answers[j]) {
            resultText.append("正确\n");
            correctCount++;
        } else {
            resultText.append("错误,正确答案是:").append(answers[j]).append("\n");
        }
    }

    // 显示校正结果
    JOptionPane.showMessageDialog(null, resultText.toString());
    // 显示成绩
    double correctRate = (correctCount / 30.0) * 100;
    JOptionPane.showMessageDialog(null, "正确率:" + String.format("%.2f", correctRate) + "%");
}

}

一、解释Set generatedQuestions = new HashSet<>(); :

  1. Set
    Set 是一种集合类型,它用于存储不重复的元素。与列表(如 ArrayList)不同,Set 不允许重复的值。
    指定了集合中存储的元素类型为 String,意味着这个集合将只包含字符串类型的对象。
  2. generatedQuestions
    generatedQuestions 是集合的名称。它用来存储生成的数学题目,以确保题目不会重复。
  3. new HashSet<>()
    HashSet 是 Set 接口的一种具体实现,基于哈希表的原理。它提供了常数时间复杂度的插入、删除和查找操作。
    使用 new HashSet<>() 创建一个新的空的哈希集合实例。
  4. 用途
    在这个程序中,generatedQuestions 用于存储生成的数学题目,确保每道题目都是唯一的。在生成新题目时,程序会检查该题目是否已经存在于 generatedQuestions 集合中。如果题目已经存在,程序将不会将其添加到集 合中,从而避免重复题目。
    代码示例:
    import java.util.HashSet;
    import java.util.Set;

public class UniqueQuestions {
public static void main(String[] args) {
Set generatedQuestions = new HashSet<>();

    // 添加问题
    generatedQuestions.add("2 + 2 = ?");
    generatedQuestions.add("3 + 5 = ?");
    generatedQuestions.add("2 + 2 = ?"); // 重复的问题,不会被添加

    // 输出所有问题
    for (String question : generatedQuestions) {
        System.out.println(question);
    }
    
    // 输出问题的数量
    System.out.println("问题总数: " + generatedQuestions.size());
}

}

二、解释JTextField[] answerFields = new JTextField[30]; :

  1. JTextField[]
    JTextField 是 Java Swing 中的一个类,用于创建文本输入框。用户可以在文本框中输入文本内容。
    JTextField[] 表示一个 JTextField 对象的数组。这意味着你将创建多个文本输入框,每个文本框可以存储用户输入的字符串。
  2. answerFields
    answerFields 是数组的名称。在这个上下文中,它可以表示用于存储用户输入答案的文本框。
  3. new JTextField[30]
    new JTextField[30] 创建一个新的 JTextField 数组,大小为 30。这意味着你可以存储最多 30 个 JTextField 对象。
    数组的每个元素在初始化时都是 null,你需要分别创建 JTextField 对象并将它们分配给数组的每个元素。
    用途:
    这个数组可以用于处理多个文本输入,例如在一个图形用户界面(GUI)中,用户可以输入答案(例如数学问题的答案)。通过数组,可以轻松地管理和访问这些文本框。
    示例
    以下是一个简单的示例,展示了如何创建 JTextField 数组,并在 JFrame 中添加这些文本框:
    import javax.swing.;
    import java.awt.
    ;

public class AnswerInputExample {
public static void main(String[] args) {
// 创建一个 JFrame
JFrame frame = new JFrame("Answer Input Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(30, 1)); // 设置网格布局

    // 创建一个 JTextField 数组
    JTextField[] answerFields = new JTextField[30];

    // 创建并添加 JTextField 到数组和 JFrame
    for (int i = 0; i < answerFields.length; i++) {
        answerFields[i] = new JTextField("Answer " + (i + 1));
        frame.add(answerFields[i]); // 将 JTextField 添加到 JFrame
    }

    // 设置 JFrame 尺寸并可见
    frame.setSize(400, 600);
    frame.setVisible(true);
}

}

标签:answerFields,Set,generatedQuestions,30,new,JTextField
From: https://www.cnblogs.com/LiuHuWei/p/18445866

相关文章

  • 六、redis之set
    Redis集合是成员的无序集合。可以用来保存唯一的成员。注意:对于以下的命令,涉及删除成员的,如果集合中的所有元素都被移除,则集合会被删除。如果集合原先不存在,被当作空集合。SADDSADDkeymember[member...]sadd命令将一系列成员添加到set中。SMEMBERSSMEMBERSkeysmemb......
  • 解决 DedeCMS 报错“Please set ‘request_order’”的问题
    如果你使用的是虚拟主机,无法直接修改 php.ini 文件,可以通过修改DedeCMS的代码来解决这个问题。找到 common.inc.php 文件:打开织梦CMS安装目录下的 include/common.inc.php 文件。修改代码:使用文本编辑器打开 common.inc.php 文件。找到第34行:php ......
  • 织梦错误Please set ‘request_order’
    当你在使用DedeCMS并遇到错误提示“DedeCMSError:(PHP5.3andabove)Pleaseset‘request_order’inivaluetoincludeC,GandP(recommended:‘CGP’)inphp.ini,more…”时,可以通过以下两种方法来解决这个问题:方法1:修改 php.ini 文件找到 php.ini 文件:......
  • 【VBA】RangeやCellsの範囲を移動する【Offsetを使います】
    参考元:【VBA】RangeやCellsの範囲を移動する【Offsetを使います】https://daitaideit.com/vba-range-offset/ポイントとなるVBAコードCells(1,1).Offset(2,3).Select'Cellsを2行と3列だけ移動するRange("A1").Offset(2,3).Select'Rangeをを2行と3列だけ移動するVBA......
  • mybatis xml里的 resultMap、resultOrdered、resultSets、resultSetType、resultType
    在MyBatis中,映射结果集是一项重要的功能,用于将数据库查询结果映射到Java对象中。为了实现这一功能,MyBatis提供了多个配置选项,如resultMap、resultOrdered、resultSets、resultSetType和resultType。以下是这些配置选项的详细解释及示例:1.resultTyperesultType是最简单的结......
  • 一种使用setdll+HOOK钩子技术+dll为MFC程序ProtocalTool等老旧程序打补丁的思路(含源
    一、引言由于工作原因,需要使用一个很老旧的软件,没有源代码,该软件在XP系统下运行正常,但是需要登录,且在win10系统下使用时IP控件运行不正常,只能输入每个数字只能输入2位数,还有一些其他问题,比如给软件添加一些编辑框,或者对软件进行下面简单梳理一下解决这些问题的思路。二、......
  • 力扣(leetcode)每日一题 1845 座位预约管理系统| treeSet和priority Queue的区别|线段树
    之前发过一篇,感觉还有深挖的地方,于是又补充一些信息这题目虽然是middle难度题目,要解答出来是只要easy的时间,但是深挖可以有hard的难度题解1可以帮助复习线段树的使用,题解2可以复习一下java基础知识题解1线段树这是自己憋出来的线段树classSeatManager{......
  • 【C++】set详解
    ......
  • kedro IncrementalDataset 简单说明
    IncrementalDataset实现了一种增量数据处理的能力,基于了PartitionedDataset同时包含了checkpoint确保数据处理的准确性,对于checkpoint可以配置自己的函数参考定义参考catalog定义my_partitioned_dataset:type:partitions.IncrementalDatasetpath:......
  • 小程序原生-利用setData()对不同类型的数据进行增删改
    1.声明和绑定数据wxml文件<view>{{school}}</view><view>{{obj.name}}</view><viewid="{{id}}">绑定属性值</view><checkboxchecked="{{isChecked}}"/><!--算数运算--><view>{{id+1}}</view&g......