学生的属性包括学号、姓名、年龄等。每个学生要学习若干课程,每门课程有平时成绩、其中考试成实习成绩、期末考试成绩以及总评成绩等多个成绩,其中平时成绩的数目不定(因为不同课程的教师布置的平时 不同),而总评绩、成绩是其它成绩的平均值。请先设计合理的类存放这些信息,然后设计程序完成以下功能: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);
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:为了存储学生的信息和成绩,我们可以设计两个类: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;
}
}
对于每位学生,可以通过调用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); // 输出学生的成绩信息
要获取某门课程每个学生的总评成绩,可以先调用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);
要分区段统计某门课程的学生总评成绩,可以先获取该课程的所有选课学生,然后根据总评成绩的分数段进行统计。
例如,要统计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() + "人");
}