Java学生管理系统

学生的属性包括学号、姓名、年龄等。每个学生要学习若干课程,每门课程有平时成绩、其中考试成实习成绩、期末考试成绩以及总评成绩等多个成绩,其中平时成绩的数目不定(因为不同课程的教师布置的平时 不同),而总评绩、成绩是其它成绩的平均值。请先设计合理的类存放这些信息,然后设计程序完成以下功能:1.列出某个学生的所有成绩;2.列出某门课程每个学生的总评成绩,及所有学生总评成绩的总评分;3.分区段统计某门课程的学生总评成绩,例如60分以下的学生人数、60至70分的学生人数等。运行效果该学生的成绩是Grade[course=高数.dailyGrade=50.midGrade=95,doGrade=45.endGrade=78,SumGrade=76.0]Grade[course=语文.dailyGrade=50.midgrade=95.dograde=45.endGrade=78,sumrade=76.01Grade[course-英语,dailyGrade=50,midGrade=95.dograde=45,endGrade=78,sumgrade=76.0]Grade[course=计算机,dailyGrade=50,midgrade=95,dorade=45,endgrade=78,sumGrade=76.01小明的总评分是76.8小红的总评分是76.0小上的总评分是76.8小蓝的总评分是76.0所有学生的总评分是:76.068分以下的有8人68-78分以下的有4人

可以设计以下三个类:Student、Course和Score。其中,Student 类表示学生,Course 类表示课程,Score 类表示成绩。下面分别给出这三个类的实现及相关方法:

Student 类的实现

class Student:
    def __init__(self, id, name, age):
        self.id = id
        self.name = name
        self.age = age
        self.courses = []  # 该学生学习的所有课程

    def add_course(self, course):
        self.courses.append(course)

    def get_scores(self):
        scores = []
        for course in self.courses:
            for score in course.scores:
                if score.student_id == self.id:
                    scores.append(score)
        return scores

在 Student 类中,用于存储学生的基本属性:学号、姓名、年龄,以及一个 courses 列表,用于存储学生学习的所有课程。其中,add_course 方法用于给学生添加一门新的课程,而 get_scores 方法用于返回该学生的所有成绩对象。

Course 类的实现

class Course:
    def __init__(self, name):
        self.name = name
        self.students = []  # 学习该课程的所有学生
        self.scores = []  # 该课程的所有成绩

    def add_student(self, student):
        self.students.append(student)

    def add_score(self, score):
        self.scores.append(score)

    def eval_scores(self):
        eval_scores = []
        for student in self.students:
            total = 0.0
            count = 0
            for score in self.scores:
                if score.student_id == student.id:
                    total += score.daily_score + score.exam_score + score.practice_score
                    count += 1
            if count > 0:
                eval_score = total / count
                student_eval_score = {'student_id': student.id, 'eval_score': eval_score}
                eval_scores.append(student_eval_score)
        return eval_scores

    def total_eval_score(self):
        eval_scores = self.eval_scores()
        total_eval_score = sum([s['eval_score'] for s in eval_scores])
        return total_eval_score

    def score_statistic(self):
        grades = {'0-59': 0, '60-69': 0, '70-79': 0, '80-89': 0, '90-100': 0}
        eval_scores = [s['eval_score'] for s in self.eval_scores()]
        for score in eval_scores:
            if score < 60:
                grades['0-59'] += 1
            elif score < 70:
                grades['60-69'] += 1
            elif score < 80:
                grades['70-79'] += 1
            elif score < 90:
                grades['80-89'] += 1
            else:
                grades['90-100'] += 1
        return grades

在 Course 类中,用于存储课程的基本属性:课程名称、学习该课程的所有学生以及该课程的所有成绩。其中,add_student 方法用于添加一个学生对象到课程中,而 add_score 方法用于将一个成绩对象添加到课程中。eval_scores 方法用于计算每个学生的总评成绩,并返回一个列表。total_eval_score 方法用于返回该课程所有学生的总评成绩之和。score_statistic 方法用于统计该课程总评成绩在不同分段的学生人数。

Score 类的实现

class Score:
    def __init__(self, student_id, daily_score, exam_score, practice_score):
        self.student_id = student_id
        self.daily_score = daily_score
        self.exam_score = exam_score
        self.practice_score = practice_score
        self.eval_score = (daily_score + exam_score + practice_score) / 3

在 Score 类中,用于存储成绩的基本属性:学生 ID、平时成绩、考试成绩、实习成绩以及总评

import java.util.ArrayList;
import java.util.List;

 
public class Student {
    private String studentNumber;
    private String name;
    private int age;
    private List<Grade> grades;

    public String getStudentNumber() {
        return studentNumber;
    }

    public void setStudentNumber(String studentNumber) {
        this.studentNumber = studentNumber;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setGrades(List<Grade> grades) {
        this.grades = grades;
    }

    public Student(String studentNumber, String name, int age) {
        this.studentNumber = studentNumber;
        this.name = name;
        this.age = age;
        this.grades = new ArrayList<>();
    }

    public void addGrade(Grade grade) {
        grades.add(grade);
    }

    public List<Grade> getGrades() {
        return grades;
    }

    public double calculateAverageGrade() {
        if (grades.isEmpty()) {
            throw new IllegalStateException("No grades available for the student.");
        }

        double sum = 0.0;
        for (Grade grade : grades) {
            sum += grade.getSumGrade();
        }

        return sum / grades.size();
    }

}


public class Grade {
    private String course;
    private double dailyGrade;
    private double midGrade;
    private double doGrade;
    private double endGrade;
    private double sumGrade;

    public Grade(String course, double dailyGrade, double midGrade, double doGrade, double endGrade) {
        this.course = course;
        this.dailyGrade = dailyGrade;
        this.midGrade = midGrade;
        this.doGrade = doGrade;
        this.endGrade = endGrade;
        this.sumGrade = (dailyGrade + midGrade + doGrade + endGrade) / 4;
    }

    public String getCourse() {
        return course;
    }

    public double getSumGrade() {
        return sumGrade;
    }

    @Override
    public String toString() {
        return "Grade[course=" + course + ", dailyGrade=" + dailyGrade + ", midGrade=" + midGrade +
                ", doGrade=" + doGrade + ", endGrade=" + endGrade + ", sumGrade=" + sumGrade + "]";
    }
}

import java.util.ArrayList;
import java.util.List;

 
public class Main {
    public static void main(String[] args) {
        // 创建学生对象
        Student student1 = new Student("001", "小明", 18);
        Student student2 = new Student("002", "小红", 19);
        Student student3 = new Student("003", "小李", 20);
        Student student4 = new Student("004", "小蓝", 19);

        // 添加成绩
        student1.addGrade(new Grade("高数", 50, 95, 45, 78));
        student1.addGrade(new Grade("语文", 50, 95, 45, 78));
        student2.addGrade(new Grade("英语", 50, 95, 45, 78));
        student2.addGrade(new Grade("计算机", 50, 95, 45, 78));
        student3.addGrade(new Grade("高数", 60, 80, 70, 90));
        student3.addGrade(new Grade("语文", 70, 75, 80, 85));
        student4.addGrade(new Grade("英语", 80, 85, 90, 95));
        student4.addGrade(new Grade("计算机", 90, 95, 85, 80));

        // 1. 列出某个学生的所有成绩
        List<Grade> student1Grades = student1.getGrades();
        System.out.println("学生 " + student1.getName() + " 的成绩是:");
        for (Grade grade : student1Grades) {
            System.out.println(grade);
        }

        System.out.println();

        // 2. 列出某门课程每个学生的总评成绩,及所有学生总评成绩的平均分
        String course = "高数";
        List<Student> students = new ArrayList<>();
        students.add(student1);
        students.add(student3);

        double courseTotalSumGrade = 0.0;
        int studentCount = 0;

        System.out.println("课程 " + course + " 每个学生的总评成绩是:");
        for (Student student : students) {
            List<Grade> studentGrades = student.getGrades();
            for (Grade grade : studentGrades) {
                if (grade.getCourse().equals(course)) {
                    System.out.println(student.getName() + " 的总评分是: " + grade.getSumGrade());
                    courseTotalSumGrade += grade.getSumGrade();
                    studentCount++;
                }
            }
        }

        double courseAverageSumGrade = courseTotalSumGrade / studentCount;
        System.out.println();
        System.out.println("所有学生的总评分平均分是: " + courseAverageSumGrade);

        System.out.println();

        // 3. 分区段统计某门课程的学生总评成绩
        double lowerBound = 60.0;
        double upperBound = 70.0;
        int belowCount = 0;
        int betweenCount = 0;

        System.out.println("课程 " + course + " 学生总评成绩分区段统计:");
        for (Student student : students) {
            List<Grade> studentGrades = student.getGrades();
            for (Grade grade : studentGrades) {
                if (grade.getCourse().equals(course)) {
                    double sumGrade = grade.getSumGrade();
                    if (sumGrade < lowerBound) {
                        belowCount++;
                    } else if (sumGrade >= lowerBound && sumGrade <= upperBound) {
                        betweenCount++;
                    }
                }
            }
        }

        System.out.println("分数低于 " + lowerBound + " 的学生人数: " + belowCount);
        System.out.println("分数在 " + lowerBound + " 至 " + upperBound + " 之间的学生人数: " + betweenCount);
    }
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:
    1. 设计合理的类去存放这些学生的信息和成绩

    为了存储学生的信息和成绩,我们可以设计两个类:Student和Course。Student类用于存储学生的姓名、学号、年龄等信息,而Course类用于存储每个课程的各项成绩和评价。

    具体实现如下:

    public class Student {
        private int studentId;
        private String name;
        private int age;
        private List<Course> courses;
    
        // 构造函数
        public Student(int studentId, String name, int age) {
            this.studentId = studentId;
            this.name = name;
            this.age = age;
            this.courses = new ArrayList<>();
        }
    
        // 添加课程
        public void addCourse(Course course) {
            courses.add(course);
        }
    
        // 获取学生信息
        public String getInfo() {
            return "学生信息:\n" +
                    "学号:" + studentId + "\n" +
                    "姓名:" + name + "\n" +
                    "年龄:" + age + "\n";
        }
    
        // 获取所有的成绩信息
        public String getAllScores() {
            StringBuilder sb = new StringBuilder();
            sb.append("学生所有成绩:\n");
            for (Course course : this.courses) {
                sb.append(course.getScoreInfo()).append("\n");
            }
            return sb.toString();
        }
    
        // 根据课程名获取课程
        public Course getCourseByName(String name) {
            for (Course course : this.courses) {
                if (course.getName().equals(name)) {
                    return course;
                }
            }
            return null;
        }
    }
    
    public class Course {
        private String name;
        private List<Double> dailyScores;
        private double midtermScore;
        private double finalScore;
        private double practiceScore;
    
        // 构造函数
        public Course(String name) {
            this.name = name;
            this.dailyScores = new ArrayList<>();
            this.midtermScore = 0;
            this.finalScore = 0;
            this.practiceScore = 0;
        }
    
        // 添加平时成绩
        public void addDailyScore(double score) {
            dailyScores.add(score);
        }
    
        // 计算总评成绩
        public double getFinalScore() {
            if (dailyScores.isEmpty()) {
                return (midtermScore + finalScore + practiceScore) / 3;
            } else {
                double dailyTotalScore = dailyScores.stream().mapToDouble(Double::doubleValue).sum();
                double dailyAverageScore = dailyTotalScore / dailyScores.size();
                return (dailyAverageScore * 0.3 + midtermScore * 0.2
                        + practiceScore * 0.2 + finalScore * 0.3);
            }
        }
    
        // 获取成绩信息
        public String getScoreInfo() {
            StringBuilder sb = new StringBuilder();
            sb.append("课程:" + this.name + "\n");
            if (!dailyScores.isEmpty()) {
                sb.append("平时成绩:");
                for (double score : dailyScores) {
                    sb.append(score).append(",");
                }
                sb.deleteCharAt(sb.length() - 1);
                sb.append("\n");
            }
            sb.append("期中考试成绩:" + this.midtermScore + "\n")
                    .append("实习成绩:" + this.practiceScore + "\n")
                    .append("期末考试成绩:" + this.finalScore + "\n")
                    .append("总评成绩:" + getFinalScore() + "\n");
            return sb.toString();
        }
    
        // Getter和Setter
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public List<Double> getDailyScores() {
            return dailyScores;
        }
    
        public void setDailyScores(List<Double> dailyScores) {
            this.dailyScores = dailyScores;
        }
    
        public double getMidtermScore() {
            return midtermScore;
        }
    
        public void setMidtermScore(double midtermScore) {
            this.midtermScore = midtermScore;
        }
    
        public double getFinalScore() {
            return finalScore;
        }
    
        public void setFinalScore(double finalScore) {
            this.finalScore = finalScore;
        }
    
        public double getPracticeScore() {
            return practiceScore;
        }
    
        public void setPracticeScore(double practiceScore) {
            this.practiceScore = practiceScore;
        }
    }
    
    1. 列出某个学生的所有成绩

    对于每位学生,可以通过调用Student类的getAllScores()方法,获取该学生的所有成绩信息。

    例如,要获取studentA的所有成绩,可以使用如下代码:

    Student studentA = new Student(1, "Tom", 18);
    Course mathCourse = new Course("Math");
    mathCourse.addDailyScore(80);
    mathCourse.addDailyScore(90);
    mathCourse.setMidtermScore(85);
    mathCourse.setFinalScore(80);
    mathCourse.setPracticeScore(90);
    studentA.addCourse(mathCourse);
    
    String scoreInfo = studentA.getAllScores();
    System.out.println(scoreInfo); // 输出学生的成绩信息
    
    1. 列出某门课程每个学生的总评成绩,及所有学生总评成绩的总评分

    要获取某门课程每个学生的总评成绩,可以先调用Student类的getCourseByName()方法获取该课程的Course对象,然后调用该对象的getFinalScore()方法获取每个学生的总评成绩。

    例如,要获取所有学生在mathCourse课程中的总评成绩以及所有学生总评成绩的总评分,可以使用如下代码:

    double sumFinalScore = 0;
    int numScores = 0;
    for (Student student : studentList) {
        Course mathCourse = student.getCourseByName("Math");
        if (mathCourse != null) {
            double finalScore = mathCourse.getFinalScore();
            // 输出每个学生的总评成绩
            System.out.println(student.getInfo() + "总评成绩为:" + finalScore);
            sumFinalScore += finalScore;
            numScores++;
        }
    }
    double avgScore = sumFinalScore / numScores;
    System.out.println("所有学生总评成绩的总评分为:" + avgScore);
    
    1. 分区段统计某门课程的学生总评成绩

    要分区段统计某门课程的学生总评成绩,可以先获取该课程的所有选课学生,然后根据总评成绩的分数段进行统计。

    例如,要统计mathCourse课程的学生总评成绩分数段情况,可以使用如下代码:

    Map<String, Integer> scoreCountMap = new LinkedHashMap<>();
    scoreCountMap.put("60以下", 0);
    scoreCountMap.put("60-70", 0);
    scoreCountMap.put("70-80", 0);
    scoreCountMap.put("80-90", 0);
    scoreCountMap.put("90以上", 0);
    
    for (Student student : studentList) {
        Course mathCourse = student.getCourseByName("Math");
        if (mathCourse != null) {
            double finalScore = mathCourse.getFinalScore();
            if (finalScore < 60) {
                scoreCountMap.put("60以下", scoreCountMap.get("60以下") + 1);
            } else if (finalScore < 70) {
                scoreCountMap.put("60-70", scoreCountMap.get("60-70") + 1);
            } else if (finalScore < 80) {
                scoreCountMap.put("70-80", scoreCountMap.get("70-80") + 1);
            } else if (finalScore < 90) {
                scoreCountMap.put("80-90", scoreCountMap.get("80-90") + 1);
            } else {
                scoreCountMap.put("90以上", scoreCountMap.get("90以上") + 1);
            }
        }
    }
    System.out.println("mathCourse课程的学生总评成绩分数段情况:");
    for (Map.Entry<String, Integer> entry : scoreCountMap.entrySet()) {
        System.out.println(entry.getKey() + ":" + entry.getValue() + "人");
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^