完成四则运算登陆模块(至少需要2个用户),记录具体某位用户的四则运算历史得分(需要有序号,第几次,得分时间),需要进行持久化存储学生信息以及其对应每一次的得分情况,并且实现查询历史得分,用java序列化和反序列化完成
时间: 2024-03-05 11:54:51 浏览: 23
好的,您的问题是如何完成四则运算登陆模块并记录用户的四则运算历史得分以及实现查询历史得分,同时需要使用 Java 序列化和反序列化进行持久化存储学生信息和得分情况。
首先,我们需要设计一个用户类,包含用户名、密码、历史得分等属性。然后,我们需要设计一个四则运算类,包含题目、答案、得分等属性。接着,我们需要设计一个登陆模块,允许用户输入用户名和密码进行登陆。
在用户登陆成功后,我们可以为其提供四则运算练习,每次练习完成后,将得分记录在该用户的历史得分列表中。同时,我们可以将所有用户的信息和得分情况进行序列化,存储在文件中。
当用户需要查询历史得分时,我们可以反序列化文件中的信息,找到该用户的历史得分列表,然后将其展示给用户。
下面是一个简单的示例代码:
```java
import java.io.*;
import java.util.*;
class User implements Serializable {
private String username;
private String password;
private List<Score> scores;
public User(String username, String password) {
this.username = username;
this.password = password;
scores = new ArrayList<>();
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public List<Score> getScores() {
return scores;
}
public void addScore(Score score) {
scores.add(score);
}
}
class Score implements Serializable {
private int number;
private int score;
private Date time;
public Score(int number, int score) {
this.number = number;
this.score = score;
time = new Date();
}
public int getNumber() {
return number;
}
public int getScore() {
return score;
}
public Date getTime() {
return time;
}
}
class Problem implements Serializable {
private String question;
private int answer;
private int score;
public Problem() {
Random random = new Random();
int a = random.nextInt(100);
int b = random.nextInt(100);
int op = random.nextInt(4);
switch(op) {
case 0:
question = a + " + " + b + " = ?";
answer = a + b;
break;
case 1:
question = a + " - " + b + " = ?";
answer = a - b;
break;
case 2:
question = a + " * " + b + " = ?";
answer = a * b;
break;
case 3:
question = a + " / " + b + " = ?";
answer = a / b;
break;
}
score = random.nextInt(5) + 1;
}
public String getQuestion() {
return question;
}
public int getAnswer() {
return answer;
}
public int getScore() {
return score;
}
}
public class Main {
private static final String FILENAME = "data.ser";
private static List<User> users;
private static int number = 1;
public static void main(String[] args) {
loadData();
Scanner scanner = new Scanner(System.in);
System.out.print("请输入用户名:");
String username = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine();
User user = login(username, password);
if(user == null) {
System.out.println("用户名或密码错误!");
return;
}
System.out.println("欢迎 " + user.getUsername() + " 登陆!");
while(true) {
System.out.println("请选择操作:");
System.out.println("1. 开始练习");
System.out.println("2. 查询历史得分");
System.out.println("3. 退出");
int option = scanner.nextInt();
scanner.nextLine();
switch(option) {
case 1:
startPractice(user);
break;
case 2:
showScores(user);
break;
case 3:
saveData();
return;
default:
System.out.println("无效的选项!");
break;
}
}
}
private static User login(String username, String password) {
for(User user : users) {
if(user.getUsername().equals(username) && user.getPassword().equals(password)) {
return user;
}
}
return null;
}
private static void startPractice(User user) {
Scanner scanner = new Scanner(System.in);
int totalScore = 0;
for(int i = 0; i < 10; i++) {
Problem problem = new Problem();
System.out.println("第 " + (i + 1) + " 题:" + problem.getQuestion());
int answer = scanner.nextInt();
if(answer == problem.getAnswer()) {
int score = problem.getScore();
totalScore += score;
System.out.println("回答正确!得分:" + score);
user.addScore(new Score(number++, score));
} else {
System.out.println("回答错误!");
}
}
System.out.println("练习结束,总得分:" + totalScore);
}
private static void showScores(User user) {
List<Score> scores = user.getScores();
if(scores.isEmpty()) {
System.out.println("暂无历史得分记录!");
} else {
System.out.println("历史得分记录:");
for(Score score : scores) {
System.out.println("第 " + score.getNumber() + " 次得分:" + score.getScore() + ",得分时间:" + score.getTime());
}
}
}
private static void loadData() {
File file = new File(FILENAME);
if(file.exists()) {
try {
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file));
users = (List<User>)inputStream.readObject();
inputStream.close();
} catch(IOException | ClassNotFoundException e) {
e.printStackTrace();
}
} else {
users = new ArrayList<>();
User user1 = new User("user1", "password1");
User user2 = new User("user2", "password2");
users.add(user1);
users.add(user2);
}
}
private static void saveData() {
try {
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(FILENAME));
outputStream.writeObject(users);
outputStream.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
```
在上面的代码中,我们定义了 User、Score 和 Problem 三个类,分别代表用户、得分和四则运算问题。我们使用 List 存储所有用户的信息和得分情况,并且使用一个静态变量 number 记录所有用户的得分次数。
在 main 方法中,我们首先加载之前保存的用户信息和得分情况,然后提示用户输入用户名和密码进行登陆。如果登陆成功,我们就为其提供练习和查询历史得分的功能,直到用户选择退出。
在 startPractice 方法中,我们使用 Scanner 从命令行读取用户的回答,并且记录每次得分。在 showScores 方法中,我们展示用户的历史得分记录。
最后,在 loadData 和 saveData 方法中,我们使用 ObjectInputStream 和 ObjectOutputStream 分别进行序列化和反序列化操作,将用户信息和得分情况保存在文件中。
注意,这只是一个简单的示例代码,实际应用中可能需要更加完善的用户验证和错误处理机制。同时,使用 Java 序列化和反序列化进行持久化存储可能存在一些安全风险,需要谨慎使用。