22级计算机类共有5个班,每班现假定有50名同学,本学期有6门课程考试,每门课 程成绩是百分制。现规定每个同学的成绩记录包含以下数据:学号、姓名以及各门课程的 成绩共8项,其中学号是一个8位的数字,每个学生都有唯一的学号。 编写程序完成以下 操作要求:
时间: 2024-02-01 18:13:27 浏览: 93
1. 输入每个同学的学号、姓名和各门课程的成绩,将这些数据存入文件。
2. 从文件中读取数据,并计算每个同学的总分和平均分,按照平均分从高到低输出所有同学的成绩记录。
3. 按照每门课程的平均分从高到低输出该门课程的成绩记录。
4. 按照每个班级的平均分从高到低输出该班级的成绩记录。
5. 按照全校的平均分从高到低输出全校的成绩记录。
以下是一个可能的实现:
```python
class Student:
def __init__(self, sid, name, scores):
self.sid = sid
self.name = name
self.scores = scores
def __str__(self):
return f"{self.sid}\t{self.name}\t{self.scores[0]}\t{self.scores[1]}\t{self.scores[2]}\t{self.scores[3]}\t{self.scores[4]}\t{self.scores[5]}\t{self.scores[6]}\t{self.scores[7]}"
def total_score(self):
return sum(self.scores)
def avg_score(self):
return sum(self.scores) / len(self.scores)
class Class:
def __init__(self, grade, num_students):
self.grade = grade
self.students = [None] * num_students
def add_student(self, i, student):
self.students[i] = student
def avg_score(self):
return sum(student.total_score() for student in self.students) / len(self.students)
class School:
def __init__(self, num_grades, num_students_per_class):
self.classes = [Class(grade, num_students_per_class) for grade in range(1, num_grades + 1)]
def add_student(self, sid, name, grade, scores):
self.classes[grade - 1].add_student(sid % 100 - 1, Student(sid, name, scores))
def all_students(self):
return [student for cls in self.classes for student in cls.students if student is not None]
def sort_students_by_avg_score(self):
return sorted(self.all_students(), key=lambda student: student.avg_score(), reverse=True)
def sort_students_by_course(self, course):
return sorted(self.all_students(), key=lambda student: student.scores[course], reverse=True)
def sort_classes_by_avg_score(self):
return sorted(self.classes, key=lambda cls: cls.avg_score(), reverse=True)
def avg_score(self):
return sum(student.total_score() for student in self.all_students()) / len(self.all_students())
def input_scores(school):
with open("scores.txt", "w") as f:
for grade in range(1, len(school.classes) + 1):
for i in range(len(school.classes[grade - 1].students)):
sid = grade * 10000 + (i + 1)
name = f"Student {sid}"
scores = [randint(0, 100) for _ in range(6)]
student = Student(sid, name, scores)
school.add_student(sid, name, grade, scores)
f.write(f"{student}\n")
def output_scores(school):
print("All students:")
for student in school.all_students():
print(student)
print("Sorted by average score:")
for student in school.sort_students_by_avg_score():
print(f"{student}\t{student.avg_score()}")
for i in range(6):
print(f"Scores for course {i}:")
for student in school.sort_students_by_course(i):
print(f"{student.name}\t{student.scores[i]}")
for cls in school.sort_classes_by_avg_score():
print(f"Average score for class {cls.grade}: {cls.avg_score()}")
print(f"Average score for school: {school.avg_score()}")
def main():
num_grades = 5
num_students_per_class = 50
school = School(num_grades, num_students_per_class)
input_scores(school)
output_scores(school)
if __name__ == "__main__":
main()
```
这个程序首先定义了三个类,分别表示学生、班级和学校。学生类有一个 `total_score` 方法和一个 `avg_score` 方法,分别计算总分和平均分。班级类有一个 `add_student` 方法和一个 `avg_score` 方法,分别用于添加学生和计算平均分。学校类有一个 `add_student` 方法用于添加学生、一个 `all_students` 方法用于获取所有学生、一个 `sort_students_by_avg_score` 方法用于按照平均分排序所有学生、一个 `sort_students_by_course` 方法用于按照某门课程的成绩排序所有学生、一个 `sort_classes_by_avg_score` 方法用于按照平均分排序所有班级、以及一个 `avg_score` 方法用于计算全校的平均分。
然后定义了一个 `input_scores` 函数,用于随机生成学生的成绩并将其存入文件。这个函数同时也调用了 `add_student` 方法将学生添加到学校中。
最后定义了一个 `output_scores` 函数,用于输出所有学生的成绩记录,并按照平均分排序输出所有学生、按照每门课程的成绩排序输出该门课程的成绩记录、按照班级的平均分排序输出该班级的成绩记录,以及按照全校的平均分排序输出全校的成绩记录。
在 `main` 函数中,首先创建了一个学校对象,然后调用 `input_scores` 函数将学生的成绩存入文件,最后调用 `output_scores` 函数输出所有成绩记录。
阅读全文