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;
    }
}
posted @ 2022-07-29 20:48  颜骏  阅读(301)  评论(0编辑  收藏  举报