From 1b3e5097d329a0fcde46cfe5a4f51169b3d0b893 Mon Sep 17 00:00:00 2001 From: hs0120 <3045193232@qq.com> Date: Sat, 27 Sep 2025 18:43:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 55 ++++++++++ META-INF/MANIFEST.MF | 3 + doc/README.md | 164 ++++++++++++++++++++++++++++ doc/初中老师账号密码本 | 3 + doc/小学老师账号密码本 | 3 + doc/张三1/2025-09-27-16-45-19.txt | 20 ++++ doc/张三2/2025-09-27-18-37-59.txt | 20 ++++ doc/张三2/2025-09-27-18-38-06.txt | 40 +++++++ doc/张三2/2025-09-27-18-38-11.txt | 60 ++++++++++ doc/李四1/2025-09-27-17-55-52.txt | 40 +++++++ doc/李四1/2025-09-27-17-56-59.txt | 44 ++++++++ doc/高中老师账号密码本 | 3 + src/Main.java | 97 ++++++++++++++++ src/paper/JuniorPaper.java | 41 +++++++ src/paper/Paper.java | 17 +++ src/paper/PrimaryPaper.java | 41 +++++++ src/paper/SeniorPaper.java | 41 +++++++ src/problem/JuniorMathProblem.java | 76 +++++++++++++ src/problem/MathProblem.java | 10 ++ src/problem/PrimaryMathProblem.java | 59 ++++++++++ src/problem/SeniorMathProblem.java | 77 +++++++++++++ src/teacher/JuniorTeacher.java | 21 ++++ src/teacher/PrimaryTeacher.java | 21 ++++ src/teacher/SeniorTeacher.java | 21 ++++ src/teacher/Teacher.java | 19 ++++ 25 files changed, 996 insertions(+) create mode 100755 .gitignore create mode 100755 META-INF/MANIFEST.MF create mode 100755 doc/README.md create mode 100755 doc/初中老师账号密码本 create mode 100755 doc/小学老师账号密码本 create mode 100755 doc/张三1/2025-09-27-16-45-19.txt create mode 100755 doc/张三2/2025-09-27-18-37-59.txt create mode 100755 doc/张三2/2025-09-27-18-38-06.txt create mode 100755 doc/张三2/2025-09-27-18-38-11.txt create mode 100755 doc/李四1/2025-09-27-17-55-52.txt create mode 100755 doc/李四1/2025-09-27-17-56-59.txt create mode 100755 doc/高中老师账号密码本 create mode 100755 src/Main.java create mode 100755 src/paper/JuniorPaper.java create mode 100755 src/paper/Paper.java create mode 100755 src/paper/PrimaryPaper.java create mode 100755 src/paper/SeniorPaper.java create mode 100755 src/problem/JuniorMathProblem.java create mode 100755 src/problem/MathProblem.java create mode 100755 src/problem/PrimaryMathProblem.java create mode 100755 src/problem/SeniorMathProblem.java create mode 100755 src/teacher/JuniorTeacher.java create mode 100755 src/teacher/PrimaryTeacher.java create mode 100755 src/teacher/SeniorTeacher.java create mode 100755 src/teacher/Teacher.java diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..12220da --- /dev/null +++ b/.gitignore @@ -0,0 +1,55 @@ +# 编译后的类文件 +*.class + +# 打包文件 +*.jar +*.war +*.ear + +# IDE 文件 +/.idea/ +/.settings/ +/*.iml +/*.ipr +/*.iws + +# 构建工具目录 +/target/ +/build/ +/out/ + +# 日志文件 +*.log + +# 系统文件 +.DS_Store +Thumbs.db### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store + diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100755 index 0000000..64f0ac9 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: Main +Class-Path: . diff --git a/doc/README.md b/doc/README.md new file mode 100755 index 0000000..71940b4 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,164 @@ +# 数学题目生成系统 + +## 项目简介 + +这是一个基于 Java 的命令行应用程序,用于为小学、初中和高中教师生成数学题目试卷。系统支持用户登录、题目查重、按难度生成题目,并保存为文本文件。 + +## 功能特点 + +- **多角色登录**:支持小学、初中、高中教师登录 +- **题目生成**:根据学段生成不同难度的数学题目 +- **题目查重**:自动检查题目是否重复,确保唯一性 +- **试卷保存**:将生成的题目保存为带时间戳的文本文件 +- **模式切换**:教师可在登录后切换出题学段 +- **多次生成**:教师登录后能生成无限次试卷 +# 项目结构图 + +``` +GenerateMath/ +├── doc/ # 文档和资源目录 +│ ├── 张三1/ # 教师个人文件夹(存储生成的试卷) +│ ├── 张三2/ +│ ├── 张三3/ +│ ├── 李四1/ +│ ├── 李四2/ +│ ├── 李四3/ +│ ├── 王五1/ +│ ├── 王五2/ +│ ├── 王五3/ +│ ├── 小学老师账号密码本 # 小学教师认证文件(格式:用户名 密码) +│ ├── 初中老师账号密码本 # 初中教师认证文件 +│ └── 高中老师账号密码本 # 高中教师认证文件 +├── out/ # 编译输出目录 +├── src/ # 源代码目录 +│ ├── paper/ # 试卷生成模块 +│ │ ├── Paper.java # 抽象试卷类(提供文件路径检查功能) +│ │ │ └── checkPath(File file) # 检查并创建文件路径 +│ │ ├── PrimaryPaper.java # 小学试卷生成 +│ │ │ └── PrimaryPaper(int problemNumber, String teacherName) # 构造函数:生成小学试卷文件 +│ │ ├── JuniorPaper.java # 初中试卷生成 +│ │ │ └── JuniorPaper(int problemNumber, String teacherName) # 构造函数:生成初中试卷文件 +│ │ └── SeniorPaper.java # 高中试卷生成 +│ │ └── SeniorPaper(int problemNumber, String teacherName) # 构造函数:生成高中试卷文件 +│ ├── problem/ # 题目生成模块 +│ │ ├── MathProblem.java # 抽象题目类(定义题目基本结构) +│ │ │ ├── content # 题目内容字符串 +│ │ │ ├── op2[] # 基础运算符数组(+,-,×,÷) +│ │ │ └── examine(String teacherName) # 抽象查重方法 +│ │ ├── PrimaryMathProblem.java # 小学数学题目生成 +│ │ │ ├── PrimaryMathProblem() # 构造函数:生成2-5个数字的小学题目 +│ │ │ └── examine(String teacherName) # 查重:检查教师文件夹中是否已有相同题目 +│ │ ├── JuniorMathProblem.java # 初中数学题目生成 +│ │ │ ├── JuniorMathProblem() # 构造函数:生成含平方、开方的初中题目 +│ │ │ ├── opBack[] # 后缀运算符(平方、括号) +│ │ │ ├── opFront[] # 前缀运算符(开方、括号) +│ │ │ └── examine(String teacherName) # 查重方法 +│ │ └── SeniorMathProblem.java # 高中数学题目生成 +│ │ ├── SeniorMathProblem() # 构造函数:生成含三角函数的高中题目 +│ │ ├── opBack[] # 后缀运算符(平方、括号) +│ │ ├── opFront[] # 前缀运算符(三角函数) +│ │ └── examine(String teacherName) # 查重方法 +│ └── teacher/ # 教师管理模块 +│ ├── Teacher.java # 抽象教师类(定义教师基本属性和行为) +│ │ ├── rank (枚举) # 教师等级:PRIMARY, JUNIOR, SENIOR +│ │ ├── mode # 当前出题模式 +│ │ ├── userName # 教师用户名 +│ │ ├── initMode() # 抽象方法:初始化出题模式提示 +│ │ └── generatePaper(int number) # 抽象方法:生成试卷 +│ ├── PrimaryTeacher.java # 小学教师类 +│ │ ├── PrimaryTeacher(String name) # 构造函数 +│ │ ├── initMode() # 输出小学出题提示信息 +│ │ └── generatePaper(int number) # 创建PrimaryPaper对象生成试卷 +│ ├── JuniorTeacher.java # 初中教师类 +│ │ ├── JuniorTeacher(String name) # 构造函数 +│ │ ├── initMode() # 输出初中出题提示信息 +│ │ └── generatePaper(int number) # 创建JuniorPaper对象生成试卷 +│ └── SeniorTeacher.java # 高中教师类 +│ ├── SeniorTeacher(String name) # 构造函数 +│ ├── initMode() # 输出高中出题提示信息 +│ └── generatePaper(int number) # 创建SeniorPaper对象生成试卷 +│ +├── Main.java # 程序主入口类 +│ ├── primary/junior/senior (静态List) # 内置账号密码列表(备用验证) +│ ├── log1(String bookName, String password) # 内置账号验证方法 +│ ├── log(String bookName, String password) # 文件账号验证方法(优先读取文件) +│ ├── generate(Teacher teacher) # 交互式出题循环控制 +│ └── main(String[] args) # 主方法:处理登录和用户交互 +├── README.md # 项目说明文档 +└── 其他配置文件... # IDE配置文件等 +``` + +## 目录说明 + +- **doc/**: 存储教师生成的试卷文件和账号密码本 +- **src/paper/**: 试卷生成相关类,负责创建和保存试卷 +- **src/problem/**: 题目生成相关类,负责生成各类数学题目 +- **src/teacher/**: 教师管理相关类,处理教师登录和权限 +- **out/**: Java编译后的class文件输出目录 + +## 类说明 + +- **paper**: 存储教师生成的试卷文件和账号密码本 +- **src/paper/**: 试卷生成相关类,负责创建和保存试卷 +- **src/problem/**: 题目生成相关类,负责生成各类数学题目 +- **src/teacher/**: 教师管理相关类,处理教师登录和权限 +- **out/**: Java编译后的class文件输出目录 + +## 使用说明 + +### 登录系统 + +运行程序后,输入用户名和密码(格式:`用户名 密码`),系统会根据密码本验证身份并进入对应学段的出题模式。 + +### 生成题目 + +登录成功后,系统会提示输入题目数量(10-30之间,包括10和30),输入后即可生成试卷并保存至 `./doc/教师姓名/` 目录下。 + +### 切换学段 + +在出题模式下,可输入以下指令切换学段: +- `切换为小学出题` +- `切换为初中出题` +- `切换为高中出题` + + +### 退出登录 + +输入 `-1` 可退出当前用户,返回登录界面。 + +## 题目类型示例 + +- **小学**:四则运算,如 `12+(34-56)÷7=` +- **初中**:含平方和开方,如 `√25+3²=` +- **高中**:含三角函数,如 `sin30+cos60=` + +## 文件存储 + +- 生成的试卷以当前时间命名,格式为:`yyyy-MM-dd-HH-mm-ss.txt` + +- 保存在对应用户的文件夹下,例如:`./doc/张老师/2025-09-26-14-30-15.txt` + +- 若不存在该路径,程序将自动在运行目录中创建该路径的相关文件夹 + +## 运行环境 + +1. Java 8 或更高版本的IDE +2. PowerShell控制台环境(支持标准输入输出):
+- 方式1(不使用JAR包):在GenerateMath文件夹下进入终端,使用命令
`[Console]::InputEncoding = [System.Text.Encoding]::UTF8 `
+ `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8`
`java -cp "out\production\GenerateMath" Main -Dfile.encoding=UTF-8` +- 方式2(使用JAR包):在存放JAR包的文件目录下打开终端,使用命令
`[Console]::InputEncoding = [System.Text.Encoding]::UTF8 `
+ `[Console]::OutputEncoding = [System.Text.Encoding]::UTF8`
`java -jar GenerateMath.jar` +3. cmd模式下:将PowerShell环境下的前两条命令修改为`chcp 65001` + +## 注意 +1. 登陆时账号和密码之间只能间隔一个空格,且密码后不能携带任何空白字符 +2. 任何命令语句都要严格按照所给字符串输入,其前后不能携带任何空白字符 +3. 填写出题数量时数字前后不能携带任何空白字符 + + +## 未来展望 + +未来可考虑添加以下功能: +- 图形用户界面 +- 自定义题目模板 +- 试卷导出为多种格式 \ No newline at end of file diff --git a/doc/初中老师账号密码本 b/doc/初中老师账号密码本 new file mode 100755 index 0000000..07660c5 --- /dev/null +++ b/doc/初中老师账号密码本 @@ -0,0 +1,3 @@ +李四1 123 +李四2 123 +李四3 123 \ No newline at end of file diff --git a/doc/小学老师账号密码本 b/doc/小学老师账号密码本 new file mode 100755 index 0000000..fb7ca23 --- /dev/null +++ b/doc/小学老师账号密码本 @@ -0,0 +1,3 @@ +张三1 123 +张三2 123 +张三3 123 diff --git a/doc/张三1/2025-09-27-16-45-19.txt b/doc/张三1/2025-09-27-16-45-19.txt new file mode 100755 index 0000000..ea8d5b3 --- /dev/null +++ b/doc/张三1/2025-09-27-16-45-19.txt @@ -0,0 +1,20 @@ +1、62÷30-(18+84)= + +2、56÷95÷(80✖13)= + +3、89-(36✖64)+10= + +4、52+(33÷64)÷23✖30= + +5、81÷(21÷64)✖18= + +6、37+(90+40)-22= + +7、11+(12÷54)÷44= + +8、94÷(78+52)÷69✖22= + +9、50+50-(91÷67)= + +10、13-23= + diff --git a/doc/张三2/2025-09-27-18-37-59.txt b/doc/张三2/2025-09-27-18-37-59.txt new file mode 100755 index 0000000..6542305 --- /dev/null +++ b/doc/张三2/2025-09-27-18-37-59.txt @@ -0,0 +1,20 @@ +1、62÷69✖(22÷92)= + +2、55÷27÷79= + +3、74✖65= + +4、73+(25-12)-20= + +5、93+81-(70÷9)-14= + +6、86✖33+(79-99)✖9= + +7、48-(44+18)+80÷57= + +8、4+27+(37-100)✖4= + +9、45-28= + +10、81-66= + diff --git a/doc/张三2/2025-09-27-18-38-06.txt b/doc/张三2/2025-09-27-18-38-06.txt new file mode 100755 index 0000000..48c5dfa --- /dev/null +++ b/doc/张三2/2025-09-27-18-38-06.txt @@ -0,0 +1,40 @@ +1、33²= + +2、√14-80✖4= + +3、73²✖(70✖4)✖27÷86= + +4、39²-(39✖72)= + +5、√92+99= + +6、√19✖98-(62✖68)= + +7、√55÷9÷(47÷14)= + +8、√100= + +9、√16÷36-(72÷47)= + +10、64²✖(50+67)✖28= + +11、64²-30= + +12、53²-(87-44)= + +13、√88= + +14、86²÷(43+5)= + +15、√35-33✖(20+38)= + +16、67²+(99÷58)÷25= + +17、√7+30÷(5÷47)= + +18、33²-(47÷27)-6+93= + +19、√21✖5✖38= + +20、√32-34= + diff --git a/doc/张三2/2025-09-27-18-38-11.txt b/doc/张三2/2025-09-27-18-38-11.txt new file mode 100755 index 0000000..b8db34e --- /dev/null +++ b/doc/张三2/2025-09-27-18-38-11.txt @@ -0,0 +1,60 @@ +1、tan13+56✖31= + +2、sin100✖14+√79= + +3、sin17✖68✖cos87+√92+24= + +4、tan42+82-94✖cos89÷tan82= + +5、cos58✖100= + +6、tan99✖31-76= + +7、tan50✖98= + +8、tan96÷52= + +9、sin89= + +10、sin33✖23= + +11、cos22✖27+1= + +12、sin2✖67= + +13、tan89-97-83÷tan16= + +14、sin48-75= + +15、tan51✖69✖83= + +16、cos83-21-21÷44= + +17、sin1+95-sin15= + +18、cos64÷60÷9= + +19、tan92÷12✖41= + +20、tan27+17+4+√64-sin57= + +21、cos7+100÷19÷54= + +22、cos68= + +23、sin52= + +24、tan57÷4✖8+√55= + +25、cos41= + +26、tan30-11+41= + +27、sin100+38✖cos60+√30+62= + +28、cos2÷45-67-72÷tan96= + +29、sin87✖15= + +30、tan48✖58÷26+√92= + diff --git a/doc/李四1/2025-09-27-17-55-52.txt b/doc/李四1/2025-09-27-17-55-52.txt new file mode 100755 index 0000000..a20bc87 --- /dev/null +++ b/doc/李四1/2025-09-27-17-55-52.txt @@ -0,0 +1,40 @@ +1、sin20= + +2、cos83÷43+87= + +3、sin98= + +4、cos31-52+77+72-sin68= + +5、sin37-84-sin40-sin50÷82= + +6、cos75÷63÷60= + +7、cos50+7✖24= + +8、tan77-8-6= + +9、tan98÷80+9✖cos99÷tan76= + +10、tan99✖9÷9-sin58= + +11、tan61-93-41= + +12、sin67= + +13、cos51÷31-35= + +14、tan40÷52+47✖cos83= + +15、cos25+10= + +16、cos27÷18-96+72+√86= + +17、sin97÷54+√9+√4-33= + +18、sin25+42÷tan89= + +19、cos48+91= + +20、cos22+18+70= + diff --git a/doc/李四1/2025-09-27-17-56-59.txt b/doc/李四1/2025-09-27-17-56-59.txt new file mode 100755 index 0000000..d170f91 --- /dev/null +++ b/doc/李四1/2025-09-27-17-56-59.txt @@ -0,0 +1,44 @@ +1、cos27= + +2、sin45✖33= + +3、cos88÷83✖20+88= + +4、tan79-70= + +5、sin6= + +6、sin49+24-sin73= + +7、tan90÷51✖90-sin33= + +8、sin75✖93✖cos10+√4✖47= + +9、sin90÷89+√56-sin39+5= + +10、tan8+34+25÷tan19= + +11、sin37= + +12、cos90+92✖59= + +13、sin62✖29+√24+√43+80= + +14、sin74✖87= + +15、cos47✖34= + +16、sin99✖74-sin77÷tan3+86= + +17、cos96÷45+76✖72= + +18、sin38-83-sin86÷tan99-30= + +19、sin48-19✖cos92-sin8✖22= + +20、cos71+14= + +21、cos24✖68÷85= + +22、tan100÷64= + diff --git a/doc/高中老师账号密码本 b/doc/高中老师账号密码本 new file mode 100755 index 0000000..8181190 --- /dev/null +++ b/doc/高中老师账号密码本 @@ -0,0 +1,3 @@ +王五1 123 +王五2 123 +王五3 123 \ No newline at end of file diff --git a/src/Main.java b/src/Main.java new file mode 100755 index 0000000..689aa33 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,97 @@ +import teacher.JuniorTeacher; +import teacher.PrimaryTeacher; +import teacher.SeniorTeacher; +import teacher.Teacher; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class Main { + static List primary = Arrays.asList("张三1 123", "张三2 123", "张三3 123"); + static List junior = Arrays.asList("李四1 123", "李四2 123", "李四3 123"); + static List senior = Arrays.asList("王五1 123", "王五2 123", "王五3 123"); + + static boolean log1(String bookName, String password) { + if (bookName.matches(".*小学.*") && primary.contains(password)) { + return true; + } else if (bookName.matches(".*初中.*") && junior.contains(password)) { + return true; + } else return bookName.matches(".*高中.*") && senior.contains(password); + } + + static boolean log(String bookName, String password) { + try (BufferedReader fr = new BufferedReader(new FileReader(bookName))) { + String line; + while ((line = fr.readLine()) != null) { + if (line.equals(password)) { + return true; + } + } + return false; + } catch (IOException e) { + return log1(bookName, password); + } + } + + static void generate(Teacher teacher) { + Scanner sc = new Scanner(System.in); + while (true) { + teacher.initMode(); + String line = sc.nextLine(); + int number; + if (line.matches("-?\\d+")) { + try { + number = Integer.parseInt(line); + } catch (NumberFormatException n) { + number = 40; + } + if (number == -1) { + return; + } else if (number >= 10 && number <= 30) { + teacher.generatePaper(number); + } else { + System.out.println("请输入10-30以内的数字"); + } + } else if (line.equals("切换为小学")) { + teacher = new PrimaryTeacher(teacher.userName); + } else if (line.equals("切换为初中")) { + teacher = new JuniorTeacher(teacher.userName); + } else if (line.equals("切换为高中")) { + teacher = new SeniorTeacher(teacher.userName); + } else { + System.out.println("请输入有效的数字或指令!"); + } + } + } + + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + System.out.println("请输入用户名和密码,两者之间用一个空格隔开"); + String s; + while (sc.hasNextLine()) { + s = sc.nextLine(); + if (s.matches("\\s*")) { + System.out.println("输入不能为空!"); + } else { + String name = s.split(" ")[0]; + if (log("./doc/小学老师账号密码本", s)) { + Teacher teacher = new PrimaryTeacher(name); + generate(teacher); + } else if (log("./doc/初中老师账号密码本", s)) { + Teacher teacher = new JuniorTeacher(name); + generate(teacher); + } else if (log("./doc/高中老师账号密码本", s)) { + Teacher teacher = new SeniorTeacher(name); + generate(teacher); + } else { + System.out.println("请输入正确的用户名、密码:"); + } + } + System.out.println("请输入用户名和密码,两者之间用一个空格隔开"); + } + } +} diff --git a/src/paper/JuniorPaper.java b/src/paper/JuniorPaper.java new file mode 100755 index 0000000..8f9a294 --- /dev/null +++ b/src/paper/JuniorPaper.java @@ -0,0 +1,41 @@ +package paper; + +import problem.JuniorMathProblem; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class JuniorPaper extends Paper { + public JuniorPaper(int problemNumber, String teacherName) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); + String formattedDate = "./doc/" + teacherName + "/" + sdf.format(new Date()) + ".txt"; + File file = new File(formattedDate); + try { + if (!file.exists()) { + checkPath(file); + } else { + file.createNewFile(); + } + FileOutputStream fos = new FileOutputStream(file, true); + OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8); + BufferedWriter bw = new BufferedWriter(osw); + for (int i = 1; i <= problemNumber; i++) { + JuniorMathProblem pmp = new JuniorMathProblem(); + if (pmp.examine(teacherName)) { + String line = String.valueOf(i) + "、" + pmp.content; + bw.write(line); + bw.newLine(); + bw.newLine(); + } else { + i--; + } + } + bw.close(); + System.out.println("已完成出题。"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/paper/Paper.java b/src/paper/Paper.java new file mode 100755 index 0000000..09a5cc6 --- /dev/null +++ b/src/paper/Paper.java @@ -0,0 +1,17 @@ +package paper; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public abstract class Paper { + protected void checkPath(File file) throws IOException { + if (!file.exists()) { + Path filePath = Paths.get(file.getPath()); + Files.createDirectories(filePath.getParent()); + Files.createFile(filePath); + } + } +} diff --git a/src/paper/PrimaryPaper.java b/src/paper/PrimaryPaper.java new file mode 100755 index 0000000..006fcd1 --- /dev/null +++ b/src/paper/PrimaryPaper.java @@ -0,0 +1,41 @@ +package paper; + +import problem.PrimaryMathProblem; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class PrimaryPaper extends Paper { + public PrimaryPaper(int problemNumber, String teacherName) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); + String formattedDate = "./doc/" + teacherName + "/" + sdf.format(new Date()) + ".txt"; + File file = new File(formattedDate); + try { + if (!file.exists()) { + checkPath(file); + } else { + file.createNewFile(); + } + BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); + for (int i = 1; i <= problemNumber; i++) { + PrimaryMathProblem pmp = new PrimaryMathProblem(); + if (pmp.examine(teacherName)) { + String line = String.valueOf(i) + "、" + pmp.content; + bw.write(line); + bw.newLine(); + bw.newLine(); + } else { + i--; + } + } + bw.close(); + System.out.println("已完成出题。"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/paper/SeniorPaper.java b/src/paper/SeniorPaper.java new file mode 100755 index 0000000..ed07af0 --- /dev/null +++ b/src/paper/SeniorPaper.java @@ -0,0 +1,41 @@ +package paper; + +import problem.SeniorMathProblem; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class SeniorPaper extends Paper { + public SeniorPaper(int problemNumber, String teacherName) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); + String formattedDate = "./doc/" + teacherName + "/" + sdf.format(new Date()) + ".txt"; + File file = new File(formattedDate); + try { + if (!file.exists()) { + checkPath(file); + } else { + file.createNewFile(); + } + FileOutputStream fos = new FileOutputStream(file, true); + OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8); + BufferedWriter bw = new BufferedWriter(osw); + for (int i = 1; i <= problemNumber; i++) { + SeniorMathProblem pmp = new SeniorMathProblem(); + if (pmp.examine(teacherName)) { + String line = String.valueOf(i) + "、" + pmp.content; + bw.write(line); + bw.newLine(); + bw.newLine(); + } else { + i--; + } + } + bw.close(); + System.out.println("已完成出题。"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/problem/JuniorMathProblem.java b/src/problem/JuniorMathProblem.java new file mode 100755 index 0000000..3a5eca7 --- /dev/null +++ b/src/problem/JuniorMathProblem.java @@ -0,0 +1,76 @@ +package problem; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Random; + +public class JuniorMathProblem extends MathProblem { + String[] opBack = {"²", ")"}; + String[] opFront = {"√", "("}; + + public JuniorMathProblem() { + // 生成初中题的函数 + Random random = new Random(); + int total = random.nextInt(5) + 1; + if (total == 1) { + int op = random.nextInt(2); + int number = random.nextInt(100) + 1; + if (op == 0) { + content = String.valueOf(number) + "²"; + } else { + content = "√" + String.valueOf(number); + } + } else { + int[] number = new int[total]; + number[0] = random.nextInt(100) + 1; + int choice = random.nextInt(2); + if (choice == 0) { + content = String.valueOf(number[0]) + "²"; + } else { + content = "√" + String.valueOf(number[0]); + } + for (int i = 1; i < total; i++) { + number[i] = random.nextInt(100) + 1; + int op = random.nextInt(4); + if (i == choice + 1 && total > choice + 2) { + content += op2[op] + "(" + String.valueOf(number[i]); + } else if (i == choice + 2) { + content += op2[op] + String.valueOf(number[i]) + ")"; + } else { + content += op2[op] + String.valueOf(number[i]); + } + } + } + content += "="; + } + + @Override + public boolean examine(String teacherName) { + try { + File folder = new File("./doc/" + teacherName); + if (!folder.exists() || !folder.isDirectory()) { + System.out.println("文件夹不存在或不是目录!"); + } + File[] files = folder.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + BufferedReader fr = new BufferedReader(new FileReader(file)); + String line; + while ((line = fr.readLine()) != null) { + if (line.equals(content)) { + return false; + } + } + fr.close(); + } + } + } + } catch (IOException e) { + System.out.println(e); + } + return true; + } +} diff --git a/src/problem/MathProblem.java b/src/problem/MathProblem.java new file mode 100755 index 0000000..d11d1c2 --- /dev/null +++ b/src/problem/MathProblem.java @@ -0,0 +1,10 @@ +package problem; + +public abstract class MathProblem { + public String content = ""; + public String[] op2 = {"+", "-", "✖", "÷"}; + + boolean examine(String teacherName) { + return true; + } +} diff --git a/src/problem/PrimaryMathProblem.java b/src/problem/PrimaryMathProblem.java new file mode 100755 index 0000000..d5a0dc4 --- /dev/null +++ b/src/problem/PrimaryMathProblem.java @@ -0,0 +1,59 @@ +package problem; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Random; + +public class PrimaryMathProblem extends MathProblem { + public PrimaryMathProblem() { + // 生成小学题的函数 + Random random = new Random(); + int total = random.nextInt(4) + 2; + int[] number = new int[total]; + number[0] = random.nextInt(100) + 1; + content += String.valueOf(number[0]); + int choice = random.nextInt(2); + for (int i = 1; i < total; i++) { + number[i] = random.nextInt(100) + 1; + int op = random.nextInt(4); + if (i == choice + 1 && total > choice + 2) { + content += op2[op] + "(" + String.valueOf(number[i]); + } else if (i == choice + 2) { + content += op2[op] + String.valueOf(number[i]) + ")"; + } else { + content += op2[op] + String.valueOf(number[i]); + } + } + content += "="; + } + + @Override + public boolean examine(String teacherName) { + try { + File folder = new File("./doc/" + teacherName); + if (!folder.exists() || !folder.isDirectory()) { + System.out.println("文件夹不存在或不是目录!"); + } + File[] files = folder.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + BufferedReader fr = new BufferedReader(new FileReader(file)); + String line; + while ((line = fr.readLine()) != null) { + if (line.equals(content)) { + return false; + } + } + fr.close(); + } + } + } + } catch (IOException e) { + System.out.println(e); + } + return true; + } +} diff --git a/src/problem/SeniorMathProblem.java b/src/problem/SeniorMathProblem.java new file mode 100755 index 0000000..2cac32f --- /dev/null +++ b/src/problem/SeniorMathProblem.java @@ -0,0 +1,77 @@ +package problem; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.util.Random; + +public class SeniorMathProblem extends MathProblem { + String[] opFront = {"√", "sin", "cos", "tan"}; + + public SeniorMathProblem() { + // 生成高中题的函数 + Random random = new Random(); + int total = random.nextInt(5) + 1; + if (total == 1) { + int op = random.nextInt(3); + int number = random.nextInt(100) + 1; + if (op == 0) { + content = "sin" + String.valueOf(number); + } else if (op == 1) { + content = "cos" + String.valueOf(number); + } else { + content = "tan" + String.valueOf(number); + } + } else { + int[] number = new int[total]; + number[0] = random.nextInt(100) + 1; + int choice = random.nextInt(3); + if (choice == 0) { + content = "sin" + String.valueOf(number[0]); + } else if (choice == 1) { + content = "tan" + String.valueOf(number[0]); + } else { + content = "cos" + String.valueOf(number[0]); + } + for (int i = 1; i < total; i++) { + number[i] = random.nextInt(100) + 1; + int op = random.nextInt(4); + if (i == choice + 2 || i == choice + 3) { + content += op2[op] + opFront[op] + String.valueOf(number[i]); + } else { + content += op2[op] + String.valueOf(number[i]); + } + } + } + content += "="; + } + + @Override + public boolean examine(String teacherName) { + try { + File folder = new File("./doc/" + teacherName); + if (!folder.exists() || !folder.isDirectory()) { + System.out.println("文件夹不存在或不是目录!"); + } + File[] files = folder.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + BufferedReader fr = new BufferedReader(new FileReader(file)); + String line; + while ((line = fr.readLine()) != null) { + if (line.equals(content)) { + return false; + } + } + fr.close(); + } + } + } + } catch (IOException e) { + System.out.println(e); + } + return true; + } +} diff --git a/src/teacher/JuniorTeacher.java b/src/teacher/JuniorTeacher.java new file mode 100755 index 0000000..ef87c41 --- /dev/null +++ b/src/teacher/JuniorTeacher.java @@ -0,0 +1,21 @@ +package teacher; + +import paper.JuniorPaper; + +public class JuniorTeacher extends Teacher { + public JuniorTeacher(String name) { + mode = Teacher.rank.JUNIOR.toString(); + userName = name; + } + + @Override + public void initMode() { + System.out.println("当前选择为初中出题"); + System.out.println("准备生成初中数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录)"); + } + + @Override + public void generatePaper(int number) { + paper = new JuniorPaper(number, userName); + } +} diff --git a/src/teacher/PrimaryTeacher.java b/src/teacher/PrimaryTeacher.java new file mode 100755 index 0000000..da11fe2 --- /dev/null +++ b/src/teacher/PrimaryTeacher.java @@ -0,0 +1,21 @@ +package teacher; + +import paper.PrimaryPaper; + +public class PrimaryTeacher extends Teacher { + public PrimaryTeacher(String name) { + mode = Teacher.rank.JUNIOR.toString(); + userName = name; + } + + @Override + public void initMode() { + System.out.println("当前选择为小学出题"); + System.out.println("准备生成小学数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录)"); + } + + @Override + public void generatePaper(int number) { + paper = new PrimaryPaper(number, userName); + } +} diff --git a/src/teacher/SeniorTeacher.java b/src/teacher/SeniorTeacher.java new file mode 100755 index 0000000..36ecc06 --- /dev/null +++ b/src/teacher/SeniorTeacher.java @@ -0,0 +1,21 @@ +package teacher; + +import paper.SeniorPaper; + +public class SeniorTeacher extends Teacher { + public SeniorTeacher(String name) { + mode = Teacher.rank.SENIOR.toString(); + userName = name; + } + + @Override + public void initMode() { + System.out.println("当前选择为高中出题"); + System.out.println("准备生成高中数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录)"); + } + + @Override + public void generatePaper(int number) { + paper = new SeniorPaper(number, userName); + } +} diff --git a/src/teacher/Teacher.java b/src/teacher/Teacher.java new file mode 100755 index 0000000..c789f54 --- /dev/null +++ b/src/teacher/Teacher.java @@ -0,0 +1,19 @@ +package teacher; + +import paper.Paper; + +public abstract class Teacher { + enum rank { + PRIMARY, + JUNIOR, + SENIOR + } + + public String mode = ""; + public String userName = ""; + public Paper paper; + + public void initMode() {} + + public void generatePaper(int number) {} +}