diff --git a/src/main/java/com/example/myapp/service/ExamService.java b/src/main/java/com/example/myapp/service/ExamService.java new file mode 100644 index 0000000..e1bf209 --- /dev/null +++ b/src/main/java/com/example/myapp/service/ExamService.java @@ -0,0 +1,90 @@ +// ExamService.java +package com.example.myapp.service; + +import com.example.myapp.model.Exam; +import com.example.myapp.model.Question; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.Map; + +public class ExamService { + private Map userExams = new ConcurrentHashMap<>(); + private static final ExamService instance = new ExamService(); + + public static ExamService getInstance() { + return instance; + } + + public boolean generateExam(String gradeLevel, int questionCount, String email) { + try { + List questions = MathQuestionGenerator.generateQuestions(gradeLevel, questionCount); + Exam exam = new Exam(gradeLevel, questionCount, questions); + userExams.put(email, exam); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public Exam getCurrentExam(String email) { + return userExams.get(email); + } + + public boolean submitAnswer(String email, int questionIndex, String selectedAnswer) { + Exam exam = userExams.get(email); + if (exam != null && questionIndex >= 0 && questionIndex < exam.getQuestions().size()) { + exam.getQuestions().get(questionIndex).setUserAnswer(selectedAnswer); + return true; + } + return false; + } + + // 在 ExamService.java 的 calculateScore 方法中修改答案比较逻辑 + public int calculateScore(String email) { + Exam exam = userExams.get(email); + if (exam == null) return 0; + + int correctCount = 0; + for (Question question : exam.getQuestions()) { + String userAnswer = question.getUserAnswer(); + String correctAnswer = question.getCorrectAnswer(); + + // 使用容差比较答案(针对小数) + if (isAnswerCorrect(userAnswer, correctAnswer)) { + correctCount++; + } + } + + int score = (int) ((correctCount * 100.0) / exam.getQuestions().size()); + exam.setScore(score); + return score; + } + + // 新增答案比较方法,支持小数容差 + private boolean isAnswerCorrect(String userAnswer, String correctAnswer) { + if (userAnswer == null || correctAnswer == null) { + return false; + } + + try { + // 去除选项标签(如"A. ") + String cleanUserAnswer = userAnswer.replaceAll("^[A-D]\\.\\s*", ""); + String cleanCorrectAnswer = correctAnswer.replaceAll("^[A-D]\\.\\s*", ""); + + // 尝试解析为数字进行比较 + double userValue = Double.parseDouble(cleanUserAnswer); + double correctValue = Double.parseDouble(cleanCorrectAnswer); + + // 使用容差比较 + return Math.abs(userValue - correctValue) < 0.01; + } catch (NumberFormatException e) { + // 如果无法解析为数字,进行字符串比较 + return userAnswer.trim().equals(correctAnswer.trim()); + } + } + + public void clearExam(String email) { + userExams.remove(email); + } +} \ No newline at end of file