Educoder-简易考试系统
太久没写Javase的内容,去头歌找了题练练手。感觉这题有些地方不太合理,比如答案那块,不过为了过测试就将就下。有几次卡住了就看看别人咋写的,发现他们的MenuExam都是从头写到尾,一开始觉得好难看,我就分块写了。写到后面有时候方法名忘记了,有时候报空指针,人都麻了,搞得我再也不想分块写了 。 =_=
package easyExam;
import java.io.*;
import java.util.Scanner;
public class MenuExam {
static boolean flag;
static Scanner scan = new Scanner(System.in); //因为我分模块写了,就将Scanner类提前了
static User loginedUser = new User(); //设置一个已登录账号用来后续操作
public static void menu(){
//登陆菜单
System.out.println("线上考试系统");
System.out.println("**********");
System.out.println("1. 新用户注册");
System.out.println("2. 用户登录");
System.out.println("3. 退出系统");
System.out.println("**********");
System.out.println("请输入选择的操作:");
}
public static void examMenu(){
//考试菜单
System.out.println(
"选择考试科目\n"+
"**********\n" +
"1. 英语\n"+
"2. 数学\n"+
"3. 返回上一级菜单\n"+
"4. 退出系统\n"+
"5. 查询考试成绩\n"+
"**********"
);
}
public static void main(String[] args) throws IOException {
User[] users= new User[50];
User user1 = new User("111", "222");
users[0] = user1; //这个是本地测试用的,不能用user[0].set()来赋值,因为数组是空的
// 实例化 ExamManage 对象
ExamManage examManage = new ExamManage();
// 获取键盘输入
userLoginList(examManage, users);
}
public static void userLoginList(ExamManage examManage, User[] users) throws IOException{
while(true){
//可以用if来判断,我觉得switch-case看的方便好修改就用了
menu();
String userChoice = scan.next();
//保存用户输入数值
switch (userChoice){
case "1":
userRegister(examManage,users); //用户注册
break;
case "2":
userLogin(examManage,users); //用户登陆
break;
case "3": //退出系统
break;
default: //其他输入报错
System.out.println("选择错误");
break;
}
if(userChoice.equals("2") && flag){ //登陆账户合法,进行考试模块
examMenu();
choiceExamList(examManage, users);
break;
}
if(userChoice.equals("3")){ //退出死循环
System.out.println("退出成功!"); break;
}
}
}
public static void userRegister(ExamManage examManage, User[] users){
//注册模块
System.out.println("请输入你要注册的用户名:");
String userName = scan.next();
System.out.println("请输入你要注册的密码:");
String pwd = scan.next();
examManage.register(userName,pwd,users);
}
public static void userLogin(ExamManage examManage, User[] users){
//登录模块
flag = false; //登陆成功与否判断
System.out.println("请输入你的用户名:");
String loginName = scan.next();
System.out.println("请输入你的密码:");
String loginPwd = scan.next();
if(examManage.login(loginName,loginPwd,users)){
flag = true; //表示登陆成功
loginedUser.setName(loginName); //保存已登录账户信息
loginedUser.setPwd(loginPwd);
}else{
System.out.println("用户名或密码错误,登录失败!");
}
}
public static void choiceExamList(ExamManage examManage, User[] users) throws IOException {
//考试菜单选择
System.out.println("请输入选择的操作:");
String userChoice = scan.next();
switch (userChoice){
case "1":
//英语考试
engExam(examManage,users);
repeat(examManage,users);
break;
case "2":
//数学考试
mathExam(examManage,users);
repeat(examManage,users);
break;
case "3":
//回退
userLoginList(examManage,users);
break;
case "4":
//退出
break;
case "5":
//查成绩
examManage.show(loginedUser.getName(), loginedUser.getPwd(), users);
repeat(examManage,users);
default:
break;
}
}
public static void engExam(ExamManage examManage, User[] users) throws IOException {
//英语考试模块
System.out.println("欢迎参加英语考试,开始答卷");
//IO流输出试卷内容
try(BufferedReader bf = new BufferedReader(new FileReader("/root/english.txt"));){
String text;
while((text = bf.readLine())!=null){
System.out.println(text);
}
}catch (IOException e){
e.printStackTrace();
}
String name = loginedUser.getName(); String pwd = loginedUser.getPwd(); //保存已登录账号进行传参
System.out.println("请输入答案,答案之间用英文逗号分开");
String answers = scan.next();
examManage.engExam(answers,name,pwd,users);
}
public static void repeat(ExamManage examManage, User[] users) throws IOException{
//重复菜单展示
examMenu();
choiceExamList(examManage, users);
}
public static void mathExam(ExamManage examManage, User[] users) throws IOException {
//数学考试模块,同上
System.out.println("欢迎参加数学考试,开始答卷");
try (BufferedReader bf = new BufferedReader(new FileReader("/root/math.txt"))) {
String text;
while ((text = bf.readLine()) != null) {
System.out.println(text);
}
} catch (IOException e) {
e.printStackTrace();
}
String name = loginedUser.getName(); String pwd = loginedUser.getPwd();
System.out.println("请输入答案,答案之间用英文逗号分开");
String answers = scan.next();
examManage.mathExam(answers,name,pwd,users);
examManage.mathExam(answers,name,pwd,users);
}
}
```java
package easyExam;
public class ExamManage {
public void register(String name, String pwd, User[] users) {
// 判断用户名是否规范
if (name.matches("^[^0-9][\\w_]{5,9}$")){
//要求用户名必须是 6-10 位字母、数字、下划线
if (!findUser(name, users)) {
if (pwd.matches("^[\\w_]{6,10}$")){
//要求密码必须是 6-10 位字母、数字、下划线
User user = new User(name, pwd);
for (int i = 0; i < users.length; i++) {
if (users[i] == null) {
users[i] = user;
break;
}
}
}else{
System.out.println("密码不合规范");
}
}else{
System.out.println("用户名已存在!");
}
}else{
System.out.println("用户名不合规范!");
}
}
public boolean findUser (String name, User[]users) {
//遍历查找用户
for (User user : users) {
if(user != null && name.equals(user.getName())){
return true;
}
}
return false;
}
public boolean login(String name, String pwd, User[] users){
//登陆模块
boolean flag = false;
for (User user : users) {
if(user!=null){
if(user.getPwd().equals(pwd) && user.getName().equals(name)) {
flag = true; //判断是否为合法账号
}
}else{break;}
}
return flag;
}
public void engExam(String answers, String name, String pwd, User[] users){
//英语模块
double sum = 0.0;
String[] str = answers.split(","); //split分割字符串形成数组
if(str[0].toUpperCase().equals("A")) sum+=5; //因为答案是写死的所以就直接判断了,我怕觉得蛮不合理的,but要过关只能这样
if(str[1].toUpperCase().equals("C")) sum+=5;
for (User user : users) {
if(user!=null&&user.getName().equals(name)&&user.getPwd().equals(pwd)){
user.setEnglish(sum); //测试完记录分数
}
}
// System.out.println("本次考试的分数为:"+sum);
}
public void mathExam(String answers1, String name, String pwd, User[] users) {
//数学模块,同上
// 切分用户的答案
double sum = 0.0;
String[] str1 = answers1.split(",");
if(str1[0].toUpperCase().equals("C")) sum+=5;
if(str1[1].toUpperCase().equals("A")) sum+=5;
for (User user : users) {
if (user != null&&user.getName().equals(name)&&user.getPwd().equals(pwd)) {
user.setMath(sum);
}
}
// System.out.println("本次考试的分数为:"+sum);
}
public void show(String name, String pwd, User[] users) {
//展示模块,输出成绩
System.out.println("用户名称"+"\t"+
"英语成绩"+"\t"+
"数学成绩");
double engSum = 0.0, mathSum = 0.0; //初始化
String username = "";
for (User user : users) {
if (user != null&& name.equals(user.getName()) && pwd.equals(user.getPwd())) {
engSum = user.getEnglish();
mathSum = user.getMath();
username = user.getName();
}
}
System.out.println(username+"\t"+
engSum+"\t"+
mathSum);
}
}
```java
package easyExam;
//@Data
public class User {
private String name; // 用户姓名
private String pwd; // 密码
private double math; // 数学成绩
private double english; // 英语成绩
// 无参构造
public User() {
}
// 有参构造
public User(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
// 设置和获取用户属性信息
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public double getMath() {
return math;
}
public void setMath(double math) {
this.math = math;
}
public double getEnglish() {
return english;
}
public void setEnglish(double english) {
this.english = english;
}
}