Java Swing 课程设计 —— 小学生算术练习软件(附源码+可执行JAR)
·
Java Swing 课程设计 —— 小学生算术练习软件(附源码+可执行JAR)
项目简介
一个基于 Java Swing 的图形化算术练习工具,面向小学生设计,支持四则运算、自定义难度、随机出题和即时反馈。
开发环境:JDK 21 + Java Swing,无任何第三方依赖,纯原生 Java 实现。
功能展示
1. 主界面
答题流程:输入答案 → 按 Enter 键 → 即时判断对错 → 点击「下一题」继续。
2. 答对反馈
输入正确答案后的截图,展示绿色 ✓ 提示
3. 答错反馈
输入错误答案后的截图,展示红色 ✗ 及正确答案
4. 难度设置
难度设置弹窗截图,展示数值范围调节器、运算类型复选框、操作数类型复选框
5. 分数运算
分数题目的截图(如
3/4 + 1/2 = ?)及结果
功能特性
| 功能 | 说明 |
|---|---|
| 随机出题 | 每次生成不重复的题目,使用 java.util.Random |
| 四则运算 | 加法、减法、乘法、除法,可在设置中独立开关 |
| 三种操作数 | 整数、小数(1 位精度)、分数(GCD 自动化简) |
| 难度自定义 | 数值范围(1~1000)、运算类型、操作数类型自由组合 |
| 按键判题 | 输入框按 Enter 键即时提交判断 |
| 即时反馈 | 绿色 ✓ 正确,红色 ✗ 显示正确答案 |
| 成绩统计 | 底部状态栏实时显示已答题数、正确数、正确率 |
项目结构
src/
├── Main.java # 程序入口(EDT 启动)
├── enums/
│ ├── Operation.java # 运算枚举:+ - × ÷
│ └── NumberType.java # 操作数类型枚举:整数/小数/分数
├── logic/ # 业务逻辑(零 Swing 依赖,可独立测试)
│ ├── Question.java # 题目数据类(record)
│ ├── Difficulty.java # 难度配置(record)
│ ├── QuestionGenerator.java # 随机题目生成核心
│ ├── AnswerChecker.java # 答案解析与校验
│ └── ScoreTracker.java # 答题统计
└── ui/ # Swing 界面层
├── MainFrame.java # 主窗口(650×450,不可拉伸)
├── QuizPanel.java # 答题面板
├── ScorePanel.java # 底部状态栏
└── SettingsDialog.java # 难度设置弹窗
架构设计
采用 MVC + 策略模式,UI 与业务逻辑严格分离:
logic/包完全不依赖javax.swing或java.awt,可脱离界面独立测试QuestionGenerator依据Difficulty配置随机选择运算类型和操作数类型,通过 GCD 算法化简分数AnswerChecker支持解析整数(5)、小数(2.5)、分数(3/4)三种输入格式,容差1e-9- UI 层所有 Swing 操作确保在 EDT 线程执行,
QuizPanel通过PropertyChangeEvent通知ScorePanel更新
用户输入 → Enter 键触发
→ AnswerChecker.check(input, question)
→ ScoreTracker.recordAnswer(correct)
→ QuizPanel 更新反馈 + ScorePanel 更新统计
核心代码片段
随机题目生成(QuestionGenerator)
public Question generate() {
Question q;
do {
q = tryGenerate(); // 随机选择运算 + 操作数类型
} while (q.equals(lastQuestion)); // 避免连续重复
lastQuestion = q;
return q;
}
答案校验(AnswerChecker)
public static double parse(String input) {
if (input.contains("/")) { // 分数格式 3/4
String[] parts = input.split("/");
double num = Double.parseDouble(parts[0]);
double den = Double.parseDouble(parts[1]);
if (den == 0) throw new NumberFormatException("分母不能为零");
return num / den;
}
return Double.parseDouble(input); // 整数或小数
}
分数化简(GCD 算法)
private int[] simplify(int num, int den) {
if (num == 0) return new int[]{0, 1};
int g = gcd(Math.abs(num), Math.abs(den));
return new int[]{num / g, den / g};
}
private int gcd(int a, int b) {
while (b != 0) { int t = b; b = a % b; a = t; }
return a;
}
更多推荐





所有评论(0)