Python课程设计:学生成绩管理系统

# Python课程设计:学生成绩管理系统

> **关键词:** Python课程设计、学生成绩管理系统、Python大作业、Python期末项目

>

> **适用课程:** Python程序设计、程序设计基础、计算机导论

## 一、项目简介

学生成绩管理系统是高校Python课程设计中最常见的选题之一。本文提供一个**基于Python + 文件存储**的完整实现,包含增删改查、成绩统计、数据排序、文件读写等核心功能,代码结构清晰,可直接用于课程设计提交。

**功能清单:**

- 学生信息录入(学号、姓名、各科成绩)

- 成绩查询(按学号/姓名)

- 成绩修改与删除

- 成绩统计(平均分、最高分、最低分、及格率)

- 成绩排名(按总分/单科排序)

- 数据持久化(CSV文件存储)

- 数据导出(生成成绩报告)

## 二、项目结构

```

student_grade_system/

├── main.py          # 主程序入口

├── student.py       # 学生类定义

├── manager.py       # 成绩管理核心逻辑

├── utils.py         # 工具函数

├── data.csv         # 数据文件

└── README.md        # 使用说明

```

## 三、完整代码

### 3.1 student.py — 学生类

```python

class Student:

    """学生类,封装学生基本信息和成绩"""

    def __init__(self, sid, name, chinese=0, math=0, english=0, python_score=0):

        self.sid = sid              # 学号

        self.name = name            # 姓名

        self.chinese = chinese      # 语文

        self.math = math            # 数学

        self.english = english      # 英语

        self.python_score = python_score  # Python

    @property

    def total(self):

        """计算总分"""

        return self.chinese + self.math + self.english + self.python_score

    @property

    def average(self):

        """计算平均分"""

        return self.total / 4

    def to_dict(self):

        """转为字典,用于CSV存储"""

        return {

            '学号': self.sid,

            '姓名': self.name,

            '语文': self.chinese,

            '数学': self.math,

            '英语': self.english,

            'Python': self.python_score,

            '总分': self.total,

            '平均分': round(self.average, 2)

        }

    def __str__(self):

        return (f"{self.sid:<12}{self.name:<8}{self.chinese:<8}"

                f"{self.math:<8}{self.english:<8}{self.python_score:<10}"

                f"{self.total:<8}{self.average:.2f}")

```

### 3.2 manager.py — 管理核心

```python

import csv

import os

from student import Student


 

class GradeManager:

    """成绩管理器,负责增删改查和统计"""

    def __init__(self, filepath='data.csv'):

        self.filepath = filepath

        self.students = []

        self.load_data()

    def load_data(self):

        """从CSV文件加载数据"""

        if not os.path.exists(self.filepath):

            return

        with open(self.filepath, 'r', encoding='utf-8-sig') as f:

            reader = csv.DictReader(f)

            for row in reader:

                s = Student(

                    sid=row['学号'],

                    name=row['姓名'],

                    chinese=int(row['语文']),

                    math=int(row['数学']),

                    english=int(row['英语']),

                    python_score=int(row['Python'])

                )

                self.students.append(s)

    def save_data(self):

        """保存数据到CSV文件"""

        with open(self.filepath, 'w', encoding='utf-8-sig', newline='') as f:

            if not self.students:

                return

            writer = csv.DictWriter(f, fieldnames=self.students[0].to_dict().keys())

            writer.writeheader()

            for s in self.students:

                writer.writerow(s.to_dict())

    def add_student(self, sid, name, chinese, math, english, python_score):

        """添加学生"""

        if self.find_by_sid(sid):

            return False, "学号已存在"

        student = Student(sid, name, chinese, math, english, python_score)

        self.students.append(student)

        self.save_data()

        return True, "添加成功"

    def find_by_sid(self, sid):

        """按学号查找"""

        for s in self.students:

            if s.sid == sid:

                return s

        return None

    def find_by_name(self, name):

        """按姓名查找(模糊匹配)"""

        return [s for s in self.students if name in s.name]

    def delete_student(self, sid):

        """删除学生"""

        student = self.find_by_sid(sid)

        if student:

            self.students.remove(student)

            self.save_data()

            return True, "删除成功"

        return False, "学号不存在"

    def update_score(self, sid, subject, new_score):

        """修改单科成绩"""

        student = self.find_by_sid(sid)

        if not student:

            return False, "学号不存在"

        if hasattr(student, subject):

            setattr(student, subject, new_score)

            self.save_data()

            return True, "修改成功"

        return False, "科目不存在"

    def sort_by_total(self, reverse=True):

        """按总分排序"""

        return sorted(self.students, key=lambda s: s.total, reverse=reverse)

    def sort_by_subject(self, subject, reverse=True):

        """按单科排序"""

        return sorted(self.students, key=lambda s: getattr(s, subject, 0), reverse=reverse)

    def get_statistics(self):

        """获取班级统计数据"""

        if not self.students:

            return None

        totals = [s.total for s in self.students]

        subjects = ['chinese', 'math', 'english', 'python_score']

        stats = {

            '总人数': len(self.students),

            '班级总分平均': round(sum(totals) / len(totals), 2),

            '最高总分': max(totals),

            '最低总分': min(totals),

            '及格率': f"{sum(1 for t in totals if t >= 240) / len(totals) * 100:.1f}%",

            '优秀率': f"{sum(1 for t in totals if t >= 360) / len(totals) * 100:.1f}%",

        }

        for subj in subjects:

            scores = [getattr(s, subj) for s in self.students]

            stats[f'{subj}_平均'] = round(sum(scores) / len(scores), 2)

            stats[f'{subj}_最高'] = max(scores)

        return stats

```

### 3.3 utils.py — 工具函数

```python

def print_header():

    """打印表头"""

    print("=" * 70)

    print(f"{'学号':<12}{'姓名':<8}{'语文':<8}{'数学':<8}"

          f"{'英语':<8}{'Python':<10}{'总分':<8}{'平均分'}")

    print("-" * 70)


 

def print_students(students):

    """打印学生列表"""

    if not students:

        print("暂无数据")

        return

    print_header()

    for s in students:

        print(str(s))

    print("=" * 70)


 

def print_statistics(stats):

    """打印统计信息"""

    if not stats:

        print("暂无数据")

        return

    print("\n" + "=" * 40)

    print("        班级成绩统计报告")

    print("=" * 40)

    for key, value in stats.items():

        label = key.replace('chinese', '语文').replace('math', '数学')\

                    .replace('english', '英语').replace('python_score', 'Python')

        print(f"  {label:<12}:{value}")

    print("=" * 40)


 

def input_score(subject_name):

    """输入单科成绩,带校验"""

    while True:

        try:

            score = int(input(f"  {subject_name}成绩(0-100): "))

            if 0 <= score <= 100:

                return score

            print("  成绩范围:0-100,请重新输入")

        except ValueError:

            print("  请输入数字")

```

### 3.4 main.py — 主程序

```python

from manager import GradeManager

from utils import print_students, print_statistics, input_score


 

def show_menu():

    print("\n" + "=" * 40)

    print("      学生成绩管理系统 v1.0")

    print("=" * 40)

    print("  1. 添加学生")

    print("  2. 查询成绩(按学号)")

    print("  3. 查询成绩(按姓名)")

    print("  4. 修改成绩")

    print("  5. 删除学生")

    print("  6. 成绩排名(按总分)")

    print("  7. 成绩排名(按单科)")

    print("  8. 班级统计报告")

    print("  9. 显示所有学生")

    print("  0. 退出系统")

    print("=" * 40)


 

def main():

    manager = GradeManager()

    while True:

        show_menu()

        choice = input("请选择操作(0-9): ").strip()

        if choice == '1':

            print("\n--- 添加学生 ---")

            sid = input("  学号: ").strip()

            name = input("  姓名: ").strip()

            chinese = input_score("语文")

            math = input_score("数学")

            english = input_score("英语")

            python_score = input_score("Python")

            ok, msg = manager.add_student(sid, name, chinese, math, english, python_score)

            print(f"\n  >> {msg}")

        elif choice == '2':

            sid = input("\n请输入学号: ").strip()

            s = manager.find_by_sid(sid)

            if s:

                print_students([s])

            else:

                print("  >> 未找到该学生")

        elif choice == '3':

            name = input("\n请输入姓名: ").strip()

            results = manager.find_by_name(name)

            print_students(results)

        elif choice == '4':

            print("\n--- 修改成绩 ---")

            sid = input("  学号: ").strip()

            print("  科目:chinese / math / english / python_score")

            subject = input("  科目名: ").strip()

            score = input_score("新")

            ok, msg = manager.update_score(sid, subject, score)

            print(f"\n  >> {msg}")

        elif choice == '5':

            sid = input("\n请输入要删除的学号: ").strip()

            ok, msg = manager.delete_student(sid)

            print(f"  >> {msg}")

        elif choice == '6':

            sorted_list = manager.sort_by_total()

            print("\n--- 按总分排名 ---")

            print_students(sorted_list)

        elif choice == '7':

            print("  可选科目:chinese / math / english / python_score")

            subject = input("  请输入科目: ").strip()

            sorted_list = manager.sort_by_subject(subject)

            print_students(sorted_list)

        elif choice == '8':

            stats = manager.get_statistics()

            print_statistics(stats)

        elif choice == '9':

            print_students(manager.students)

        elif choice == '0':

            print("\n  感谢使用,再见!")

            break

        else:

            print("\n  >> 无效选择,请重新输入")


 

if __name__ == '__main__':

    main()

```

## 四、运行效果

```

========================================

      学生成绩管理系统 v1.0

========================================

  1. 添加学生

  2. 查询成绩(按学号)

  ...

请选择操作(0-9): 1

--- 添加学生 ---

  学号: 2024001

  姓名: 张三

  语文成绩(0-100): 85

  数学成绩(0-100): 92

  英语成绩(0-100): 78

  Python成绩(0-100): 95

  >> 添加成功

```

## 五、报告撰写要点

课程设计报告一般包含以下部分:

1. **需求分析** — 系统要实现什么功能,面向什么用户

2. **系统设计** — 类图、模块划分、数据结构设计

3. **详细设计** — 每个函数的流程图和逻辑说明

4. **测试结果** — 截图展示各功能运行效果

5. **总结与体会** — 遇到的问题和解决方案

> **提示:** 在报告中重点体现你对**面向对象编程**的理解(Student类的封装)和**文件操作**的掌握(CSV读写),这两个是Python课程的核心考点。

## 六、扩展方向

如果想拿更高分,可以加这些功能:

- **图形界面** — 用 `tkinter` 做一个GUI版本

- **数据库存储** — 用 `sqlite3` 替代CSV文件

- **数据可视化** — 用 `matplotlib` 画成绩分布图

- **登录验证** — 加一个管理员登录功能

---

**完整代码已上传GitHub:** (此处放你的仓库链接)

> 如果这篇文章对你有帮助,请点赞 + 收藏 + 关注,后续会更新更多课程设计实战内容!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值