学生成绩管理系统的模拟实现(java基础实战)

简介: 学生成绩管理系统的模拟实现(java基础实战)

关于该系统的很多细节我们在之前的博客已经讲过,这里不再赘叙

传送门图书管理系统的的实现(超详细)

一起来看看这个系统的效果吧


一、效果展示

🌰新增学生信息acb6bf8e8161475092ea9c325107e9ca.png🌰按姓名对学生的信息进行查找

ace54c44dd1f44a5b3bb4ccb99a72bd0.png

🌰按学号修改某一学生的信息

b49f018d057648618f290bcbd06197e9.png

🌰按学号删除某一学生的全部信息

e5663303b950442f8a2c2070c394ae53.png

🌰按总成绩对学生对象进行排序

93a19c5b69d0481eb60231d9970ba124.png

🌰输出不及格的学生对象信息

bb5659b93f0e439f87b4a51db6d933c6.png

🌰退出系统

8608836c177e4d02a8af9538ec039e71.png

二、代码实现

🌻主函数(程序的入口)

import Operation.*;
import Operation.studentChange;
import student.StudentList;
import java.util.Scanner;
import Operation.ioOPerate;
public class Main {
    public static void main(String[] args) {
        System.out.println("欢迎来到学生成绩管理系统");
        System.out.println("========================");
        System.out.println("0.添加学生信息");
        System.out.println("1.打印所有学生的信息");
        System.out.println("2.按姓名查找该学生的信息");
        System.out.println("3.按学号修改某一学生的成绩信息");
        System.out.println("4.按学号删除某一学生的全部信息");
        System.out.println("5.按学生总成绩进行进行升序排列");
        System.out.println("6.按科目输出不及格的学生信息");
        System.out.println("7.退出系统");
        System.out.println("=========================");
        StudentList studentList = new StudentList();
        // 这里相等于接口引用引用了不同的子类对象,发生了向上转型
        ioOPerate[] ioOperation = new ioOPerate[] {  // 对接口数组进行赋值,分别指向不同的实例化操作对象
                new AddStudent(),                   // 这样我们就可以按下标对学生对象进行不同的操作
                new printAll(),
                new studentFind(),
                new studentChange(),
                new studentDelete(),
                new studentSort(),
                new flunkPrint(),
                new exitOperation(),
        };
        while (true) {
            System.out.print("请输入你的操作:");
            Scanner sc  = new Scanner(System.in);
            int choice = sc.nextInt();
            // 体现了多态
            ioOperation[choice].work(studentList);  // work是一个被子类重写的方法,会根据当前接口对象ioOperation的不同引用来进行不同的操作
            // 接口就相等于是父类,子类实现接口就相当于是子类继承了父类
            // 多态的条件:1.有继承(实现)关系   2.父类引用(接口引用)引用子类对象(向上转型) 3.子类对象对父类(接口中的方法进行了重写)
        }
    }
}

🌻学生信息储存包

这个包有两个类,一个包含单个学生的所有属性的学生类,另一个是学生对象的集合类

Student类

/**
 * 学生类,里面一个学生的所有属性
 */
package student;
// 因为要比较Student类型的引用变量,所以要实现Comparable接口
public class Student implements Comparable<Student> {
    private long studentId;
    private String name;
    private double cGrade;
    private double dataStructureGrade;
    // 构造方法对学生的各个属性进行初始化
    public Student(long studentId, String name, double cGrade, double dataStructureGrade) {
        this.studentId = studentId;
        this.name = name;
        this.cGrade = cGrade;
        this.dataStructureGrade = dataStructureGrade;
    }
    // 对父类Object的toString方法进行重写,以便接下来对Arrays.toString(students)可以直接打印出数组中各个引用对象的值
    @Override
    public String toString() {
        return "Student{" +
                "studentId=" + studentId +
                ", name='" + name + '\'' +
                ", cGrade=" + cGrade +
                ", dataStructureGrade=" + dataStructureGrade +
                '}';
    }
    // 重写Comparable接口中的compareTo方法,按总成绩进行比较
    @Override
    public int compareTo(Student o) {
        return (int)((this.cGrade + this.dataStructureGrade) - (o.cGrade + o.dataStructureGrade));
    }
    // 修改指定学生的信息
    public void studentChange(long studentId, String name, double cGrade, double dataStructureGrade) {
        System.out.println("将学生" + this.name + "的姓名修改为:" + name);
        this.name = name;
        System.out.println("学号从" + this.studentId + "修改为:" + studentId);
        this.studentId = studentId;
        System.out.println("c语言成绩从" + this.cGrade + "修改为:" + cGrade);
        this.cGrade = cGrade;
        System.out.println("数据结构成绩从" + this.dataStructureGrade + "修改为:" + dataStructureGrade);
        this.dataStructureGrade = dataStructureGrade;
        System.out.println("恭喜,修改成功!");
    }
    public long getStudentId() {
        return studentId;
    }
    public void setStudentId(long studentId) {
        this.studentId = studentId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getcGrade() {
        return cGrade;
    }
    public void setcGrade(double cGrade) {
        this.cGrade = cGrade;
    }
    public double getDataStructureGrade() {
        return dataStructureGrade;
    }
    public void setDataStructureGrade(double dataStructureGrade) {
        this.dataStructureGrade = dataStructureGrade;
    }
}

StudentList类

/**
 * 里面存放了一群学生的信息,是学生对象的一个集合,我们对学生系统的操作主要围绕这个StudentList类来展开
 */
package student;
// 进行导包操作
import java.util.Scanner;
public class StudentList {
    private int usedSize;
    public int getUsedSize() {
        return usedSize;
    }
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
    public Student[] getStudents() {
        return students;
    }
    // 打印指定下标的学生对象
    public void printStudent(int pos) {
        System.out.println(students[pos]);
    }
    // 获取指定下标的图书
    public Student getStudent(int pos) {
        return students[pos];
    }
    // 在数组的指定位置放置图书
    public void setStudent(int pos, Student student) {
        students[pos] = student;
    }
    // 初始化学生数组
    private Student[] students = new Student[10];
    public StudentList() {
        students[0] = new Student(12345, "张三", 76, 92);
        students[1] = new Student(12346, "李四", 86, 67);
        students[2] = new Student(12347, "王五", 64, 99);
        usedSize = 3;
    }
    // 删除数组中的某一个元素
    public void delete() {
        // 删除学生信息
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要删除的学生的学号:");
        long id = sc.nextLong();
        if (students[usedSize - 1].getStudentId() == id) {
            --usedSize;  // 当删除的是数组结尾的值时,要特殊处理
            System.out.println("恭喜,删除成功!!!");
            return;
        }
        for (int i = 0; i < usedSize; i++) {
            if (students[i].getStudentId() == id) {
                for (int j = i + 1; j < usedSize; j++) {
                    students[j - 1] = students[j];
                }
                --usedSize;
                System.out.println("恭喜,删除成功!!!");
                return;
            }
        }
        System.out.println("删除失败,没有找到该学生!!!");
    }
}

🌻学生对象操作包

这个包里主要是对一些具体的各种操作


ioOperation接口

package Operation;
import student.Student;
import student.StudentList;
// 这是一个接口,其中的work抽象方法被实现该接口的不同子类所重写,实现了多态
// 接口就相等于是父类,子类实现接口就相当于是子类继承了父类
// 多态的条件:1.有继承(实现)关系   2.父类引用(接口引用)引用子类对象(向上转型) 3.子类对象对父类(接口中的方法进行了重写)
public abstract interface ioOPerate {
    public abstract void work(StudentList studentList);
}

添加学生信息

package Operation;
import student.Student;
import student.StudentList;
import java.util.Scanner;
public class AddStudent implements ioOPerate{ // 实现ioOperation接口
    @Override // 对接口中的抽象方法 work 进行重写
    public void work(StudentList studentList) {
        if (studentList.getUsedSize() > 10) {
            System.out.println("添加失败,系统中无法再添加学生了,需要扩容!!!");
            return;
        }
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要增加的学生的学号");
        long studentId = sc.nextLong();
        System.out.println("请输入你要增加的学生的姓名");
        String name = sc.next();
        System.out.println("请输入你要增加的学生的c语言成绩");
        double cGrade = sc.nextDouble();
        System.out.println("请输入你要增加的学生的数据结构的成绩");
        double dataStructureGrade = sc.nextDouble();
        Student student = new Student(studentId, name, cGrade, dataStructureGrade);
        studentList.setStudent(studentList.getUsedSize(), student); // 默认在数组的最后新增图书
        studentList.setUsedSize(studentList.getUsedSize() + 1);
        System.out.println("恭喜,添加成功!!!");
    }
}

显示所有学生的信息

package Operation;
import student.Student;
import student.StudentList;
import java.util.Arrays;
// 将所以学生的信息打印出来
public class printAll implements ioOPerate{
    @Override
    public void work(StudentList studentList) {
        // 打印所有学生的信息
        System.out.println("此时的的学生信息为:");
        for (int i = 0; i < studentList.getUsedSize(); i++) {
            studentList.printStudent(i);
        }
    }
}

按姓名查找指定学生的信息

package Operation;
import student.Student;
import student.StudentList;
import java.util.Scanner;
public class studentFind implements ioOPerate{
    @Override
    public void work(StudentList studentList) {
        // 打印指定学生的信息
        // 根据学生姓名进行打印
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要查找的学生的姓名:");
        String nameFind = sc.nextLine();
        for (int i = 0; i < studentList.getUsedSize(); i++) {
            if (studentList.getStudents()[i].getName().equals(nameFind)) {
                System.out.println("学号:" + studentList.getStudents()[i].getStudentId() + "  姓名:" + studentList.getStudents()[i].getName());
                System.out.println("c语言成绩:" + studentList.getStudents()[i].getcGrade() + "  数据结构成绩:" + studentList.getStudents()[i].getDataStructureGrade());
                return;
            }
        }
        System.out.println("没有找到该学生!!!");
    }
}

按学号修改指定的学生信息

package Operation;
import student.Student;
import student.StudentList;
import java.util.Scanner;
// 修改学生信息
public class studentChange implements ioOPerate{
    @Override
    public void work(StudentList studentList) {
        // 按学号修改学生信息
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要修改的学生的学号:");
        long id = sc.nextLong();
        for (int i = 0; i < studentList.getUsedSize(); i++) {
            if (studentList.getStudents()[i].getStudentId() == id) {
                System.out.println("请输入修改后的姓名:");
                String name = sc.next();
                System.out.println("请输入修改后的学号:");
                long studentId = sc.nextLong();
                System.out.println("请输入修改后的c语言分数:");
                double cGrade = sc.nextDouble();
                System.out.println("请输入修改后的数据结构的分数:");
                double dateStructureGrade = sc.nextDouble();
                studentList.getStudents()[i].studentChange(studentId, name, cGrade, dateStructureGrade);
                return;
            }
        }
        System.out.println("修改失败,系统里没有该学生!!!");
    }
}

按学号删除指定学生的信息

package Operation;
import student.Student;
import student.StudentList;
import java.util.Scanner;
public class studentDelete implements ioOPerate{
    @Override
    public void work(StudentList studentList) {
        // 删除学生信息
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要删除的学生的学号:");
        long id = sc.nextLong();
        if (studentList.getStudents()[studentList.getUsedSize() - 1].getStudentId() == id) {
            studentList.setStudent(studentList.getUsedSize(), null);  // 当删除的是数组结尾的值时,要特殊处理
            studentList.setUsedSize(studentList.getUsedSize() - 1);
            System.out.println("恭喜,删除成功!!!");
            return;
        }
        for (int i = 0; i < studentList.getUsedSize(); i++) {
            if (studentList.getStudents()[i].getStudentId() == id) {
                for (int j = i + 1; j < studentList.getUsedSize(); j++) {
                    Student student = studentList.getStudent(j);
                    studentList.setStudent(j - 1, student);
                }
                studentList.setUsedSize(studentList.getUsedSize() - 1);
                System.out.println("恭喜,删除成功!!!");
                return;
            }
        }
        System.out.println("删除失败,没有找到该学生!!!");
    }
}

按学生总成绩进行对学生进行升序排序

package Operation;
import student.Student;
import student.StudentList;
import java.util.Arrays;
public class studentSort implements ioOPerate{
    @Override
    public void work(StudentList studentList) {
        System.out.println("正在按总成绩对学生进行排序~~~");
        Arrays.sort(studentList.getStudents(), 0, studentList.getUsedSize());
        System.out.println("恭喜,排序成功!!!");
    }
}

输出不及格的学生信息

package Operation;
import student.Student;
import student.StudentList;
import java.util.Arrays;
// 对不及格学生的打印
public class flunkPrint implements ioOPerate{
    @Override
    public void work(StudentList studentList) {
        for (int i = 0; i < studentList.getUsedSize(); i++) {
            if (studentList.getStudents()[i].getcGrade() < 60 || studentList.getStudents()[i].getDataStructureGrade() < 60) {
                studentList.printStudent(i);
            }
        }
    }
}

退出系统

package Operation;
import student.Student;
import student.StudentList;
public class exitOperation implements ioOPerate{
    @Override
    public void work(StudentList studentList) {
        System.out.println("正在退出系统");
        for (int i = 0; i < studentList.getUsedSize(); i++) {
            studentList.setStudent(i, null);
        }
        System.out.println("退出成功!");
        System.exit(0);
    }
}

gitee代码地址:


结尾絮絮念:

在实践的时候才发现自己对很多知识只是表面上懂了,并不是真正理解了。

大家一定要多实践,把知识尝试着用起来呀!!!

138c1ebdd74e4f3b90ff7414ab1cac04.jpg


相关文章
|
26天前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
2月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
71 2
|
17天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
14天前
|
Java 程序员
Java基础却常被忽略:全面讲解this的实战技巧!
小米,29岁程序员,分享Java中`this`关键字的用法。`this`代表当前对象引用,用于区分成员变量与局部变量、构造方法间调用、支持链式调用及作为参数传递。文章还探讨了`this`在静态方法和匿名内部类中的使用误区,并提供了练习题。
18 1
|
25天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
48 6
|
24天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
2月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
1月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
81 3
|
1月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
34 1
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。