假如有若干学生数据(学生数不超过50),每个学生数据包含、姓名、班级编号和若干门课程成绩,每个学生学号是唯一的,但学生记录不一定按学号顺序存放 每个学生所选课程数目可能不相等,但不会超过6门。请设计一个程序输出每个学生的学号、姓名和平均分以及每门课程(课程编号从1~6)的平均分。
时间: 2024-09-07 20:02:28 浏览: 89
为了实现这个功能,你可以采用以下步骤来设计一个简单的数据结构和算法:
1. **数据结构**:
- 使用一个 `Student` 类来表示单个学生,包含属性如 `studentId`, `name`, `classId`, 和一个成绩列表 `grades`,用于存储每个学生选修的所有课程的成绩。
- 创建一个哈希表或集合(例如Python的`dict`或`set`),键是学号,值是对应的 `Student` 对象。
```python
class Student:
def __init__(self, student_id, name, class_id):
self.student_id = student_id
self.name = name
self.class_id = class_id
self.grades = []
def add_grade(self, course_id, grade):
self.grades.append((course_id, grade))
@property
def average_score(self):
if not self.grades:
return 0
total = sum(grade for _, grade in self.grades)
return total / len(self.grades)
```
2. **初始化和输入数据**:
- 如果已有学生数据,直接读取并保存到上述 `Student` 对象字典中;如果需要动态输入,可以从文件或用户那里收集数据,然后创建相应的 `Student` 对象。
3. **计算平均分**:
- 遍历 `students` 字典,对于每个学生,计算其所有课程的平均分,并更新 `average_score` 属性。
- 同时,计算每门课程的平均分,可以使用另一个字典(比如Python的`defaultdict`)来存储课程ID和对应的所有分数,最后除以选修该课程的学生人数。
4. **输出结果**:
- 输出每个学生的学号、姓名和平均分,以及每门课程的平均分。可以使用循环遍历学生和课程平均分的数据。
```python
def output_average_scores(students):
for student in students.values():
print(f"学号: {student.student_id}, 姓名: {student.name}, 平均分: {student.average_score}")
course_averages = defaultdict(list) # 存储课程ID和成绩
for course_id, grade in student.grades:
course_averages[course_id].append(grade)
for course_id, grades in course_averages.items():
avg_course_score = sum(grades) / max(len(grades), 1) # 防止除以零
print(f"课程{course_id}平均分: {avg_course_score}")
# 示例
students = {} # 这里假设你已经有了学生的数据填充了学生字典
output_average_scores(students)
```
阅读全文