不小心提交到main了 #2

Merged
hnu202326010422 merged 5 commits from main into develop 5 months ago

@ -1,5 +1,40 @@
import util.*;
import java.util.*;
public class Main {
final private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("Hello world!");
menu Menu=new menu();
while (true) {
// 登录
System.out.println("1.登录");
System.out.println("2.退出");
System.out.println("3.修改密码");
System.out.println("4.创建账户");
int num=scanner.nextInt();
scanner.nextLine();
if(num==1){
Menu.Mymenu();
}
else if (num==2){
System.exit(0);
}
else if(num==3){
ModifyPassword.modimenu();
}
else if(num==4){
CreateUser.createuser();
}
else{
System.out.println("输出错误,请重新输入");
}
}
}
}
}

@ -1,23 +1,19 @@
package auth;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.*;
import java.io.IOException;
public class UserManager {
private List<User> users = new ArrayList<>();
public static int line_num= 0;
public UserManager() {
// 小学
users.add(new User("张三1", "123", "小学"));
users.add(new User("张三2", "123", "小学"));
users.add(new User("张三3", "123", "小学"));
// 初中
users.add(new User("李四1", "123", "初中"));
users.add(new User("李四2", "123", "初中"));
users.add(new User("李四3", "123", "初中"));
// 高中
users.add(new User("王五1", "123", "高中"));
users.add(new User("王五2", "123", "高中"));
users.add(new User("王五3", "123", "高中"));
// 要读取的文件路径
String filePath = "user.txt";
// 调用方法读取文件并获取三个数据列表
DataLists dataLists = readDataFile(filePath);
for(int i=0;i<line_num;i++) {
users.add(new User(dataLists.list1.get(i), dataLists.list2.get(i), dataLists.list3.get(i)));
}
}
public User login(String username, String password) {
@ -28,4 +24,54 @@ public class UserManager {
}
return null;
}
static class DataLists {
List<String> list1;
List<String> list2;
List<String> list3;
DataLists(List<String> list1, List<String> list2, List<String> list3) {
this.list1 = list1;
this.list2 = list2;
this.list3 = list3;
}
}
public static DataLists readDataFile(String filePath) {
List<String> list1 = new ArrayList<>();// 创建三个列表分别存储每行的三个数据
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {// 使用try-with-resources语句确保资源自动关闭
String line;
int lineNumber = 1;
// 逐行读取
while ((line = br.readLine()) != null) {
// 去除首尾空格
line = line.trim();
// 跳过空行
if (line.isEmpty()) {
continue;
}
// 分割行数据,这里假设使用空格分隔
// 如果是其他分隔符(如逗号、制表符),请修改正则表达式
String[] parts = line.split("\\s+"); // 按一个或多个空格分割
// 检查是否有三个数据
if (parts.length != 3) {
System.out.println("警告: 第" + lineNumber + "行数据格式不正确需要3个数据实际有" + parts.length + "个");
lineNumber++;
continue;
}
// 将三个数据分别添加到对应的列表
list1.add(parts[0]);
list2.add(parts[1]);
list3.add(parts[2]);
lineNumber++;
}
line_num=lineNumber-1;
return new DataLists(list1, list2, list3);
}catch (IOException e) {
System.out.println("读取文件时发生错误: " + e.getMessage());
e.printStackTrace();
return null;
}
}
}

@ -0,0 +1,15 @@
package generator;
import util.ExpressionUtils;
import java.util.*;
public class HighGenerator implements ProblemGenerator {
@Override
public List<String> generateProblems(int count) {
List<String> problems = new ArrayList<>();
for (int i = 1; i <= count; i++) {
problems.add(ExpressionUtils.generateHighExpr());
}
return problems;
}
}

@ -0,0 +1,15 @@
package generator;
import util.ExpressionUtils;
import java.util.*;
public class MiddleGenerator implements ProblemGenerator {
@Override
public List<String> generateProblems(int count) {
List<String> problems = new ArrayList<>();
for (int i = 1; i <= count; i++) {
problems.add(ExpressionUtils.generateMiddleExpr());
}
return problems;
}
}

@ -1,4 +0,0 @@
package generator;
public class Praimary {
}

@ -0,0 +1,15 @@
package generator;
import util.ExpressionUtils;
import java.util.*;
public class PrimaryGenerator implements ProblemGenerator {
@Override
public List<String> generateProblems(int count) {
List<String> problems = new ArrayList<>(count);
for (int i = 1; i <= count; i++) {
problems.add( ExpressionUtils.generatePrimaryExpr());
}
return problems;
}
}

@ -0,0 +1,8 @@
package generator;
import java.util.List;
public interface ProblemGenerator {
List<String> generateProblems(int count);
}

@ -0,0 +1,96 @@
package util;
import java.util.Random;
public class ExpressionUtils {
private static Random rand = new Random();
// 随机操作符
private static final String[] OPS_PRIMARY = {"+", "-", "*", "/"};
private static final String[] OPS_MIDDLE = {"+", "-", "*", "/"};
private static final String[] OPS_HIGH = {"+", "-", "*", "/"};
// 生成一个随机整数 (1100)
public static String randomNumber() {
return String.valueOf(rand.nextInt(100) + 1);
}
// 生成小学表达式
public static String generatePrimaryExpr() {
int operands = rand.nextInt(4) + 2; // 25 个操作数
StringBuilder expr = new StringBuilder();
for (int i = 0; i <operands; i++) {
if (i > 0) {
expr.append(" ").append(OPS_PRIMARY[rand.nextInt(OPS_PRIMARY.length)]).append(" ");
}
if (rand.nextBoolean() && operands > 1&& i!=operands-1) {
expr.append("(").append(randomNumber()).append(" ").append(OPS_PRIMARY[rand.nextInt(OPS_PRIMARY.length)])
.append(" ").append(randomNumber()).append(")");
i++;
} else {
expr.append(randomNumber());
}
}
return expr.toString();
}
// 生成初中表达式(至少包含平方或开根号)
public static String generateMiddleExpr() {
int operands = rand.nextInt(5) + 1;
StringBuilder expr = new StringBuilder();
boolean hasSquareOrSqrt = false;
for (int i = 0; i <operands; i++) {
if (i > 0) {
expr.append(" ").append(OPS_MIDDLE[rand.nextInt(OPS_MIDDLE.length)]).append(" ");
}
int num = rand.nextInt(100) + 1;
if (!hasSquareOrSqrt && rand.nextBoolean()) {
if (rand.nextBoolean()) {
expr.append("sqrt(").append(num).append(")");
} else {
expr.append(num).append("^2");
}
hasSquareOrSqrt = true;
} else {
expr.append(num);
}
}
// 如果没加上,强制在最后补一个平方
if (!hasSquareOrSqrt) {
expr.append(" + ").append(rand.nextInt(50) + 1).append("^2");
}
return expr.toString();
}
// 生成高中表达式(至少包含 sin/cos/tan
public static String generateHighExpr() {
int operands = rand.nextInt(5) + 1;
StringBuilder expr = new StringBuilder();
boolean hasTrig = false;
for (int i = 0; i <operands; i++) {
if (i > 0) {
expr.append(" ").append(OPS_HIGH[rand.nextInt(OPS_HIGH.length)]).append(" ");
}
int num = rand.nextInt(100) + 1;
if (!hasTrig && rand.nextBoolean()) {
String[] funcs = {"sin", "cos", "tan"};
expr.append(funcs[rand.nextInt(funcs.length)]).append("(").append(num).append(")");
hasTrig = true;
} else {
expr.append(num);
}
}
// 如果没加三角函数,强制补一个
if (!hasTrig) {
expr.append(" + sin(").append(rand.nextInt(90) + 1).append(")");
}
return expr.toString();
}
}

@ -0,0 +1,63 @@
package util;
import java.io.*;
import java.nio.file.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class FileUtils {
// 获取用户文件夹路径
public static String getUserFolder(String username) {
String folder = "exams/" + username; // 存放在项目目录下 exams/
File dir = new File(folder);
if (!dir.exists()) {
dir.mkdirs();
}
return folder;
}
// 读取历史题目(用于查重)
public static Set<String> loadHistory(String username) {
Set<String> history = new HashSet<>();
String folder = getUserFolder(username);
File dir = new File(folder);
File[] files = dir.listFiles((d, name) -> name.endsWith(".txt"));
if (files != null) {
for (File file : files) {
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null) {
if (!line.trim().isEmpty()) {
history.add(line.trim());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return history;
}
// 保存新题目
public static void saveProblems(String username, List<String> problems) {
String folder = getUserFolder(username);
String timestamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
String filename = folder + "/" + timestamp + ".txt";
try (BufferedWriter bw = new BufferedWriter(new FileWriter(filename))) {
int index=1;
for (String problem : problems) {
bw.write(index+"."+problem);
bw.newLine();
bw.newLine();
index++;
}
System.out.println("卷子已保存到: " + filename);
} catch (IOException e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,54 @@
package util;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class ModifyClass {
/**
*
* @param filePath
* @param targetName
* @param newThirdString
* @return -1
*/
public static int modifyclass(String filePath, String targetName, String newThirdString) {
List<String> lines = new ArrayList<>();
int targetLineNumber = -1;
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
if (line.trim().isEmpty()) continue;
String[] parts = line.trim().split("\\s+");
if (parts.length > 0 && parts[0].equals(targetName)) {
targetLineNumber = lines.size();
}
}
} catch (IOException e) {
System.err.println("读取文件错误: " + e.getMessage());
return -1;
}
if (targetLineNumber != -1) {
int index = targetLineNumber - 1;
String[] parts = lines.get(index).trim().split("\\s+");
if (parts.length >= 3) {
parts[2] = newThirdString;
lines.set(index, String.join(" ", parts));
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
for (String l : lines) writer.write(l + System.lineSeparator());
} catch (IOException e) {
System.err.println("写入文件错误: " + e.getMessage());
return -1;
}
} else {
System.out.println("第 " + targetLineNumber + " 行元素不足3个");
}
}
return targetLineNumber;
}
}

@ -0,0 +1,133 @@
package util;
import auth.*;
import generator.*;
import java.util.*;
import static util.ModifyClass.modifyclass;
public class menu {
static Scanner scanner = new Scanner(System.in);
User currentUser = null;
ProblemGenerator generator = null;
public void Mymenu() {
while (currentUser==null) {
System.out.println("请输入用户名和密码(用空格隔开):");
String input = scanner.nextLine();
String [] parts=input.split(" ");
if (parts.length != 2) {
System.out.println("格式错误,请重新输入。");
continue;
}
String username = parts[0];
String password = parts[1];
UserManager userManager = new UserManager();
currentUser = userManager.login(username, password);
if (currentUser == null) {
System.out.println("请输入正确的用户名、密码");
} else {
System.out.println("当前选择为 " + currentUser.getType() + " 出题");
int tmp = menu1(currentUser, generator);
if(tmp == 1) {
currentUser = null;
generator=null;
break;
}
}
}
}
public static int menu1(User currentUser, ProblemGenerator generator) {
int count1 = 0;
while (true) {
System.out.println("1.生成试卷");
System.out.println("2.修改难度");
System.out.println("3.退出当前登录");
int choice = scanner.nextInt();
scanner.nextLine();
if (choice == 1) {
int temp= generateExam(currentUser);
if(temp== 1) {
count1=1;
break;
}
} else if (choice == 2) {
currentUser = switchDifficulty(currentUser);
} else if (choice == 3) {
//count=1代表currentuser要退出
count1 = 1;
break; // 退出
}
else{
System.out.println("输出错误,请重新输入");
}
}
return count1;
}
private static int generateExam(User currentUser) {
System.out.println("准备生成 " + currentUser.getType() +
" 数学题目,请输入生成题目数量(输入 -1 退出当前用户):");
ProblemGenerator generator = getGenerator(currentUser.getType());
int count = scanner.nextInt();
scanner.nextLine();
if (count == -1){
System.out.println("退出成功");
return 1;
}
if (count < 10 || count > 30) {
System.out.println("题目数量必须在 10 到 30 之间");
return 2;
}
Set<String> history = FileUtils.loadHistory(currentUser.getUsername());
List<String> problems = new ArrayList<>();
while (problems.size() < count) {
List<String> batch = generator.generateProblems(1);
String problem = batch.get(0);
if (!history.contains(problem)) {
problems.add(problem);
history.add(problem);
}
}
for (int i = 0; i <count; i++) {
String p = problems.get(i);
System.out.println((i+1)+"."+p);
}
FileUtils.saveProblems(currentUser.getUsername(), problems);
return 0;
}
private static User switchDifficulty(User currentUser) {
System.out.println("正在修改难度中,请输入 切换为小学/初中/高中");
String input1 = scanner.next();
if (input1.startsWith("切换为")) {
String target = input1.replace("切换为", "").trim();
if (target.equals("小学") || target.equals("初中") || target.equals("高中")) {
currentUser = new User(currentUser.getUsername(),
currentUser.getPassword(), target);
modifyclass("user.txt", currentUser.getUsername(), target);
System.out.println("系统提示:修改难度完成。难度为 " + target + " 难度");
} else {
System.out.println("请输入小学、初中和高中三个选项中的一个");
}
} else {
System.out.println("输入错误请重试");
}
return currentUser;
}
public static ProblemGenerator getGenerator(String type) {
switch (type) {
case "小学": return new PrimaryGenerator();
case "初中": return new MiddleGenerator();
case "高中": return new HighGenerator();
default: return null;
}
}
}
Loading…
Cancel
Save