《数据结构课程设计》——学生成绩档案管理系统(代码实现)

《数据结构课程设计》——学生成绩档案管理系统(代码实现)


前言

本文是学生成绩档案管理系统的代码实现


用户包:

一、学生类

/**
 * 学生用户类
 */
public class Student implements Serializable {
    //学号
    private String id;
    //姓名
    private String name;
    //专业
    private String profession;
    //java课程成绩
    private double java;
    //cpp课程成绩
    private double cpp;
    //sql课程成绩
    private double sql;
    //web课程成绩
    private double web;
    //总分
    private double sumScore;
    //排名
    private int rank;

    public Student(String id, String name, String profession, double java, double cpp, double sql, double web) {
        this.id = id;
        this.name = name;
        this.profession = profession;
        this.java = java;
        this.cpp = cpp;
        this.sql = sql;
        this.web = web;
        this.sumScore = java+cpp+sql+web;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getProfession() {
        return profession;
    }

    public void setProfession(String profession) {
        this.profession = profession;
    }

    public double getJava() {
        return java;
    }

    public void setJava(double java) {
        this.java = java;
    }

    public double getCpp() {
        return cpp;
    }

    public void setCpp(double cpp) {
        this.cpp = cpp;
    }

    public double getSql() {
        return sql;
    }

    public void setSql(double sql) {
        this.sql = sql;
    }

    public double getWeb() {
        return web;
    }

    public void setWeb(double web) {
        this.web = web;
    }

    public double getSumScore() {
        return sumScore;
    }

    public void setSumScore(double sumScore) {
        this.sumScore = sumScore;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }
}

二、管理员类

public class User implements Serializable {
    //用户名
    private String username;
   //密码
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

Dao包:

三、学生操作类:

public class StudentDao {
    DataBase dataBase;

    public StudentDao(DataBase dataBase) {
        this.dataBase = dataBase;
    }

    /**
     * 新增学生信息
     * @param student
     */
    public void insertStudent(Student student){
        dataBase.getStudentList().add(student);
    }

    /**
     * 浏览学生信息
     */
    public void display(){
        List<Student>list=dataBase.getStudentList();
        //序号
        int num=0;
        //遍历学生信息并输出
        for (Student student : list) {
            System.out.println("序号:"+(num+1)+"\t学号:"+student.getId()+"\t姓名:"+student.getName()+"\t专业:"+student.getProfession()
            +"\tjava成绩:"+student.getJava()+"\tc++成绩:"+student.getCpp()+"\tsql成绩:"+student.getSql()+"\tweb成绩:"+student.getWeb()
            +"\t总分:"+student.getSumScore());
            num++;
        }
    }

    /**
     * 删除学生信息
     * @param student
     */
    public void deleteStudent(Student student){
        Student stu=null;
        for (Student student1 : dataBase.getStudentList()) {
            if(student.getId().equals(student1.getId())){
                stu=student1;
            }
        }
        dataBase.getStudentList().remove(stu);
    }

    /**
     * 通过学号查询学生信息
     * @param id
     * @return
     */
    public Student searchById(String id){
        Student stu=null;
        for (Student student1 : dataBase.getStudentList()) {
            if(id.equals(student1.getId())){
                stu=student1;
            }
        }
        return stu;
    }

    /**
     * 通过姓名查询学生信息
     * @param name
     * @return
     */
    public Student searchByName(String name){
        Student stu=null;
        for (Student student : dataBase.getStudentList()) {
            if(name.equals(student.getName())){
                stu=student;
            }
        }
        return stu;
    }

    /**
     * 双向冒泡排序
     * @param studentList
     * @return
     */
    public List<Student>doubleBubbleSort(List<Student>studentList){
        List<Student>list=studentList;
        Student stu=null;
        int left=0;
        int right=studentList.size()-1;
        while(left<right){
            for(int i=left+1;i<right;i++){
                if(list.get(left).getSumScore()<list.get(i).getSumScore()){
                    stu=list.get(i);
                    list.set(i,list.get(left));
                    list.set(left,stu);
                }
            }
            left++;
            for(int i=right-1;i>=left;i--){
                if(list.get(right).getSumScore()>list.get(i).getSumScore()){
                    stu=list.get(i);
                    list.set(i,list.get(right));
                    list.set(right,stu);
                }
            }
            right--;
        }
        return list;
    }

    /**
     * 快速排序
     * @param studentList
     * @return
     */
    public List<Student>quickSort(List<Student>studentList){
        List<Student>list=studentList;
        quickSort1(list,0,list.size()-1);
        return list;
    }
    public void quickSort1(List<Student>studentList,int left,int right){
        if(left<right){
            int i=left,j=right;
            Student student=studentList.get(left);
            double x=student.getSumScore();
            while(i<j){
                while((i<j)&&(studentList.get(j).getSumScore()<x)){
                    j--;
                }
                if(i<j){
                    studentList.set(i,studentList.get(j));
                    i++;
                }
                while((i<j)&&(studentList.get(i).getSumScore()>x)){
                    i++;
                }
                if(i<j){
                    studentList.set(j,studentList.get(i));
                    j--;
                }
            }
            studentList.set(i,student);
            quickSort1(studentList,left,i-1);
            quickSort1(studentList,i+1,right);
        }
    }

    /**
     * 希尔排序
     * @param studentList
     * @return
     */
    public List<Student>shellSort(List<Student>studentList){
        List<Student>list=studentList;
        Student student=null;
        int j=0;
        for(int gap=list.size()/2;gap>0;gap/=2){
            for(int i=gap;i<list.size();i++){
                student =list.get(i);
                double tmp=student.getSumScore();
                for(j=i;j>gap&&tmp>list.get(j-gap).getSumScore();j-=gap){
                    list.set(j,list.get(j-gap));
                }
                list.set(j,student);
            }
        }
        return list;
    }

    /**
     * 堆排序
     * @param studentList
     * @return
     */
    public List<Student>heapSort(List<Student>studentList){
        List<Student>list=studentList;
        int len=list.size();
        buildMaxHeap(list,len);
        for(int i=len-1;i>0;i--){
            swap(list,0,1);
            len--;
            heapify(list,0,len);
        }
        return list;
    }

    /**
     * 构造大根堆
     * @param studentList
     * @param len
     */
    private void buildMaxHeap(List<Student>studentList,int len){
        for(int i=(int)Math.floor(len/2);i>=0;i--){
            heapify(studentList,i,len);
        }
    }
    private void heapify(List<Student>studentList,int i,int len){
        int left=2*i+1;
        int right=2*i+2;
        int largest=i;
        if (left < len && studentList.get(left).getSumScore() <studentList.get(largest).getSumScore()) {
            largest = left;
        }

        if (right < len && studentList.get(right).getSumScore() < studentList.get(largest).getSumScore()) {
            largest = right;
        }

        if (largest != i) {
            swap(studentList, i, largest);
            heapify(studentList, largest, len);
        }
    }

    /**
     * 交换节点
     * @param studentList
     * @param i
     * @param j
     */
    private void swap(List<Student>studentList,int i,int j){
        Student student=studentList.get(i);
        studentList.set(i,studentList.get(j));
        studentList.set(j,student);
    }

    /**
     * 排名赋值、信息输出
     * @param studentList
     */
    public void printRank(List<Student>studentList){
        for(int i=0;i<studentList.size();i++){
            studentList.get(i).setRank(i+1);
        }
        int i=1;
        for (Student student : studentList) {
            System.out.println(i+" "+"\t学号:"+student.getId()+"\t姓名:"+student.getName()+"\t专业:"+student.getProfession()
                    +"\tjava成绩:"+student.getJava()+"\tc++成绩:"+student.getCpp()+"\tsql成绩:"+student.getSql()+"\tweb成绩:"+student.getWeb()
                    +"\t总分:"+student.getSumScore()+"\t排名:"+student.getRank());
            i++;
        }

    }
}

四、管理员操作类:

public class UserDao {
    DataBase dataBase;

    public UserDao(DataBase dataBase) {
        this.dataBase = dataBase;
    }

    /**
     * 新增新用户
     * @param user
     */
    public void add(User user){
        dataBase.getUserList().add(user);
    }
}

文档保存包:

五、学生信息保存类:

public class StudentSave {
    /**
     * 写入学生信息
     * @param list
     */
    public void writeStudent(List<Student> list){
        File file=new File("F://大二下//数据结构实践课//student.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            FileOutputStream fs=new FileOutputStream(file);
            ObjectOutputStream op=new ObjectOutputStream(fs);
            op.writeObject(list);
            op.flush();
            op.close();
            fs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 学生信息读取
     * @return list
     */
    public List<Student>fileRead() throws IOException, ClassNotFoundException {
        File file=new File("F://大二下//数据结构实践课//student.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
            FileInputStream fs=new FileInputStream(file);
            ObjectInputStream os=new ObjectInputStream(fs);
            List<Student>list1= (List<Student>) os.readObject();
            os.close();
            fs.close();
            return list1;
    }
}

六、管理员信息保存类:

public class UserSave {
    /**
     * 写入用户登陆信息
     *
     * @param list
     */
    public void write(List<User> list) {
        File file = new File("F://大二下//数据结构实践课//user.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            FileOutputStream fs = new FileOutputStream(file);
            ObjectOutputStream os = new ObjectOutputStream(fs);
            //User user1 = new User("moon", "123");
           // list.add(user1);
            os.writeObject(list);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 用户登录信息读取
     *
     * @return
     */
    public List<User> fileRead() throws IOException, ClassNotFoundException {
        File file = new File("F://大二下//数据结构实践课//user.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        FileInputStream is = new FileInputStream(file);
        ObjectInputStream oi = new ObjectInputStream(is);
        List<User> list1 = (List<User>) oi.readObject();
        oi.close();
        is.close();
        return list1;
    }
}

数据库包:

七、数据库类

public class DataBase implements Serializable {
    List<User>userList=new ArrayList<>();
    List<Student>studentList=new ArrayList<>();
    StudentSave ss=new StudentSave();
    UserSave us=new UserSave();
    public DataBase() {
       try {
           userList = us.fileRead();
           studentList = ss.fileRead();
       }catch(Exception e){
           System.out.println(e.getMessage());
        }
    }
    public void ss(List<Student>list){
        ss.writeStudent(list);
    }
    public void us(List<User>list){
        us.write(list);
    }

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }

    public List<Student> getStudentList() {
        return studentList;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }
}

八、系统实现类:

public class SystemService {
    //键盘扫描器
    private Scanner sc = new Scanner(System.in);
    //验证码生成器
    private Random random = new Random();
    DataBase dataBase;
    StudentDao studentDao;
    UserDao userDao;

    public SystemService(DataBase dataBase) {
        this.dataBase = dataBase;
        studentDao = new StudentDao(dataBase);
        userDao = new UserDao(dataBase);
    }

    /**
     * 起始菜单
     */
    public void startMenu() {
        System.out.println("************************************学生成绩档案管理系统入口******************************");
        System.out.println("1.登陆");
        System.out.println("2.注册");
        System.out.println("3.退出系统");
        System.out.println("请选择:");
        String choice = sc.next();
        switch (choice) {
            case "1":
                login();
                break;
            case "2":
                registerSys();
                login();
                break;
            case "3":
                System.out.println("系统即将退出!");
                System.exit(0);
                break;
            default:
                System.out.println("非法输入!");
                login();
        }
    }

    /**
     * 登陆
     */
    public void login() {
        User user = null;
        Boolean find = false;
        System.out.println("请输入账号:");
        String username = sc.next();
        List<User> list = dataBase.getUserList();
        for (User user1 : list) {
            if (username.equals(user1.getUsername())) {
                user = user1;
                find = true;
                break;
            }
        }
        if (find) {
            System.out.println("请输入密码:");
            String passward = sc.next();
            if (passward.equals(user.getPassword())) {
                boolean jud = verifyNumber();
                if (jud) {
                    System.out.println("登陆成功!");
                    mainMenu();
                } else {
                    System.out.println("验证码输入错误!");
                    startMenu();
                }
            } else {
                System.out.println("密码错误!");
                startMenu();
            }
        } else {
            System.out.println("账号不存在!请先进行注册");
            startMenu();
        }
    }

    /**
     * 验证码生成以及验证器
     */
    public boolean verifyNumber() {
        //获取4位验证码
        int[] verify = new int[4];
        for (int i = 0; i < verify.length; i++) {
            verify[i] = random.nextInt(10);
            System.out.print(verify[i] + "\t");
        }
        System.out.println();
        //验证码计数器
        int count = 0;
        System.out.println("请输入验证码:");
        for (int i = 0; i < verify.length; i++) {
            int number1 = 0;
            int number = errorMessage(number1);
            if (number == verify[i])
                count++;
        }
        if (count == verify.length)
            return true;
        else
            return false;
    }

    /**
     * 输入不匹配问题InputMismatchException
     */
    public int errorMessage(int choice) {
        while (true) {
            try {
                choice = sc.nextInt();
                break;
            } catch (Exception e) {
                System.out.println("输入类型错误,请重新输入!");
                sc = new Scanner(System.in);
            }
        }
        return choice;
    }

    /**
     * 注册
     */
    public void registerSys() {
        System.out.println("请输入账号:");
        String username = sc.next();
        for (User user : dataBase.getUserList()) {
            if(user.getUsername().equals(username)){
                System.out.println("管理员已存在!");
                System.out.println("是否继续注册?(Y/N)");
                String result=sc.next();
                if(result.equalsIgnoreCase("Y")){
                    registerSys();
                }else{
                    login();
                }
            }
        }
        System.out.println("请输入密码:");
        String password = sc.next();
        User u = new User(username, password);
        userDao.add(u);
        System.out.println("注册成功!");
        dataBase.us(dataBase.getUserList());
    }

    /**
     * 主菜单
     */
    public void mainMenu() {
        System.out.println("1.新增学生信息");
        System.out.println("2.浏览学生信息");
        System.out.println("3.查找学生信息");
        System.out.println("4.删除学生信息");
        System.out.println("5.退出登陆");
        System.out.println("请输入你的选择:(输入0返回上一层菜单!)");
        String choice = sc.next();
        switch (choice) {
            case "1":
                insertStudent();
                mainMenu();
                break;
            case "2":
                display();
                mainMenu();
                break;
            case "3":
                searchStudent();
                break;
            case "4":
                delete();
                mainMenu();
                break;
            case "0":
                login();
                break;
            case "5":
                System.out.println("系统即将退出!");
                System.exit(0);
                break;
            default:
                System.out.println("非法输入!");
                startMenu();

        }
    }

    /**
     * 新增学生信息
     */
    public void insertStudent() {
        System.out.println("学生学号:");
        String id = sc.next();
        for (Student student : dataBase.getStudentList()) {
            if (student.getId().equals(id)) {
                System.out.println("该学生已存在!");
                System.out.println("是否继续添加?(Y/N)");
                String result = sc.next();
                if (result.equalsIgnoreCase("Y")) {
                    insertStudent();
                } else {
                    mainMenu();
                }
            }
        }
        System.out.println("学生姓名:");
        String name = sc.next();
        System.out.println("学生专业:");
        String profession = sc.next();
        System.out.println("java成绩:");
        double java = sc.nextDouble();
        System.out.println("c++成绩:");
        double cpp = sc.nextDouble();
        System.out.println("sql成绩:");
        double sql = sc.nextDouble();
        System.out.println("web成绩:");
        double web = sc.nextDouble();
        studentDao.insertStudent(new Student(id, name, profession, java, cpp, sql, web));
        dataBase.ss(dataBase.getStudentList());
        System.out.println("添加成功!");
        System.out.println("是否继续添加?(Y/N)");
        String result = sc.next();
        if (result.equalsIgnoreCase("Y")) {
            insertStudent();
        } else {
            mainMenu();
        }

    }

    /**
     * 浏览学生信息
     */
    public void display() {
        List<Student> list = null;
        studentDao.display();
        System.out.println("选择排序方法:");
        System.out.println("1.双向冒泡排序:");
        System.out.println("2.希尔排序");
        System.out.println("3.快速排序");
        System.out.println("4.堆排序");
        System.out.println("请选择:(输入0返回上一层菜单!)");
        String choice = sc.next();
        switch (choice) {
            case "1":
                list = studentDao.doubleBubbleSort(dataBase.getStudentList());
                studentDao.printRank(list);
                break;
            case "2":
                list = studentDao.shellSort(dataBase.getStudentList());
                studentDao.printRank(list);
                break;
            case "3":
                list = studentDao.quickSort(dataBase.getStudentList());
                studentDao.printRank(list);
                break;
            case "4":
                list = studentDao.heapSort(dataBase.getStudentList());
                studentDao.printRank(list);
                break;
            case "0":
                mainMenu();
                break;
            default:
                System.out.println("非法输入!");
                display();
        }
    }

    /**
     * 查询学生信息
     */
    public void searchStudent() {
        studentDao.display();
        System.out.println("1.按学号查找:");
        System.out.println("2.按姓名查找");
        System.out.println("请选择:(输入0返回上一层菜单!)");
        String choice = sc.next();
        switch (choice) {
            case "1":
                searchById();
                break;
            case "2":
                searchByName();
                break;
            case "0":
                mainMenu();
                break;
            default:
                System.out.println("非法输入!");
                searchStudent();
        }
    }

    /**
     * 删除学生信息
     */
    public void delete() {
        studentDao.display();
        System.out.println("请输入要删除的学号:(输入0返回上一层菜单!)");
        String id = sc.next();
        if(id.equals("0")) {
            mainMenu();
        }
        for (Student stu : dataBase.getStudentList()) {
            if(stu.getId().equals(id)){
                Student student = studentDao.searchById(id);
                studentDao.deleteStudent(student);
                System.out.println("删除成功!");
                System.out.println("是否继续进行删除?(Y/N)");
                String result=sc.next();
                if(result.equalsIgnoreCase("Y")){
                    delete();
                }else{
                    mainMenu();
                }
            }
        }
        System.out.println("此学生不存在!");
        System.out.println("是否继续进行删除?(Y/N)");
        String result=sc.next();
        if(result.equalsIgnoreCase("Y")){
            delete();
        }else{
            mainMenu();
        }

    }

    /**
     * 按姓名查找
     */
    public void searchByName() {
        System.out.println("请输入要查找的姓名:");
        String name = sc.next();
        Student student;
        student = studentDao.searchByName(name);
        System.out.println("学号:" + student.getId() + "\t姓名:" + student.getName() + "\t专业:" + student.getProfession() +
                "\tjava成绩:" + student.getJava() + "\tc++成绩:" + student.getCpp() + "\tsql成绩:" + student.getSql() + "\tweb成绩:" + student.getWeb());
        System.out.println("是否修改成绩?(Y/N)");
        String result = sc.next();
        if (result.equalsIgnoreCase("Y")) {
            System.out.println("1.java");
            System.out.println("2.c++");
            System.out.println("3.sql");
            System.out.println("4.web");
            System.out.println("请输入要修改的课程的编号:(输入0返回上一层菜单!)");
            String option = sc.next();
            double score;
            switch (option) {
                case "1":
                    score = sc.nextDouble();
                    student.setJava(score);
                    break;
                case "2":
                    score = sc.nextDouble();
                    student.setCpp(score);
                    break;
                case "3":
                    score = sc.nextDouble();
                    student.setSql(score);
                    break;
                case "4":
                    score = sc.nextDouble();
                    student.setWeb(score);
                    break;
                case "0":
                    searchStudent();
                    break;
                default:
                    System.out.println("非法输入!");
                    searchByName();
            }
            student.setSumScore(student.getJava() + student.getCpp() + student.getSql() + student.getWeb());
            mainMenu();
        } else {
            mainMenu();
        }
    }

    /**
     * 按学号修改成绩
     */
    public void searchById() {
        System.out.println("请输入要查找的学号:");
        String id = sc.next();
        Student student;
        student = studentDao.searchById(id);
        System.out.println("学号:" + student.getId() + "姓名:" + student.getName() + "专业:" + student.getProfession() +
                "java成绩:" + student.getJava() + "c++成绩:" + student.getCpp() + "sql成绩:" + student.getSql() + "web成绩:" + student.getWeb());
        System.out.println("是否修改成绩?(Y/N)");
        String result = sc.next();
        if (result.equalsIgnoreCase("Y")) {
            System.out.println("1.java");
            System.out.println("2.c++");
            System.out.println("3.sql");
            System.out.println("4.web");
            System.out.println("请输入要修改的课程的编号:(输入0返回上一层菜单!)");
            String option = sc.next();
            double score;
            switch (option) {
                case "1":
                    score = sc.nextDouble();
                    student.setJava(score);
                    break;
                case "2":
                    score = sc.nextDouble();
                    student.setCpp(score);
                    break;
                case "3":
                    score = sc.nextDouble();
                    student.setSql(score);
                    break;
                case "4":
                    score = sc.nextDouble();
                    student.setWeb(score);
                    break;
                case "0":
                    searchStudent();
                    break;
                default:
                    System.out.println("非法输入!");
                    searchById();
            }
            student.setSumScore(student.getJava() + student.getCpp() + student.getSql() + student.getWeb());
            mainMenu();
        } else {
            mainMenu();
        }
    }

}

九、主方法测试:

public class Main {
    public static void main(String[] args) {
        DataBase dataBase=new DataBase();
        SystemService sys=new SystemService(dataBase);
        sys.startMenu();
    }
}

十、运行截图(部分截图)

1.登陆界面:
在这里插入图片描述
2.功能界面:
在这里插入图片描述

2.1新增学生信息:
在这里插入图片描述
2.2.浏览学生信息:
在这里插入图片描述
2.3查找学生信息:
在这里插入图片描述
2.4删除学生信息:
在这里插入图片描述

十一、总结

本文主要实现了对学生信息的增删改查,其中主要用到的算法有:双向冒泡排序、快速排序、希尔排序、堆排序,在实现本项目的过程中,出现了一个巨大的问题,一开始,我采用的是链表进行实现,用链表实现的过程中,是非常麻烦的,尤其是在处理成绩排名这个问题时,很多算法用链表来操作都是非常困难的,尽管如此,我还是使用冒泡排序、快速排序、归并排序进行实现,如有对链表实现感兴趣,可以和我进行交流沟通,所以,这个问题也是给我一个很大的警醒,那就是,在项目开始实现之前,一定要对项目进行深刻的剖析,将框架打好之后,再进行操作。

  • 4
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值