Python练习4—学生成绩管理系统

2 阅读5分钟
import csv
import os

# =========================
# 文件名
# =========================
FILENAME = "students.csv"

# =========================
# 从 CSV 文件读取学生数据
# 返回:学生列表(列表里装字典)
# =========================
def load_students():
    students = []

    # 如果文件不存在,那么就创建一个新的
    if not os.path.exists(FILENAME):
        with open(FILENAME, mode="w", newline="", encoding="utf-8") as f:
            writer = csv.DictWriter(f, fieldnames=["name", "score"])
            writer.writeheader()  # 写表头
        return students

    # 打开文件读取
    with open(FILENAME, mode="r", newline="", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            row["score"] = int(row["score"])  # 成绩转为整数
            students.append(row)

    return students


# =========================
# 把学生数据写入 CSV 文件
# =========================
def save_students(students):
    with open(FILENAME, mode="w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=["name", "score"])
        writer.writeheader()  # 写表头
        for student in students:
            writer.writerow(student)


# =========================
# 添加学生
# =========================
def add_student(students):
    name = input("请输入学生姓名:")
    score = int(input("请输入学生成绩:"))

    student = {
        "name": name,
        "score": score
    }

    students.append(student)
    save_students(students)
    print("✅ 学生添加成功!")


# =========================
# 显示所有学生
# =========================
def show_students(students):
    if not students:
        print("📭 当前没有学生信息")
        return

    print("📋 学生列表:")
    for student in students:
        print(f"姓名:{student['name']},成绩:{student['score']}")


# =========================
# 查询学生成绩
# =========================
def search_student(students):
    name = input("请输入要查询的学生姓名:")

    for student in students:
        if student["name"] == name:
            print(f"🎯 {name} 的成绩是:{student['score']}")
            return

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


# =========================
# 修改学生成绩
# =========================
def update_student(students):
    name = input("请输入要修改的学生姓名:")

    for student in students:
        if student["name"] == name:
            new_score = int(input("请输入新的成绩:"))
            student["score"] = new_score
            save_students(students)
            print("✅ 成绩修改成功!")
            return

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


# =========================
# 删除学生
# =========================
def delete_student(students):
    name = input("请输入要删除的学生姓名:")

    for student in students:
        if student["name"] == name:
            students.remove(student)
            save_students(students)
            print("🗑 学生已删除")
            return

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


# =========================
# 主菜单
# =========================
def menu():
    print("\n====== 学生成绩管理系统 ======")
    print("1. 添加学生")
    print("2. 显示所有学生")
    print("3. 查询学生成绩")
    print("4. 修改学生成绩")
    print("5. 删除学生")
    print("0. 退出系统")


# =========================
# 主程序入口
# =========================
def main():
    students = load_students()

    while True:
        menu()
        choice = input("请选择功能:")

        if choice == "1":
            add_student(students)
        elif choice == "2":
            show_students(students)
        elif choice == "3":
            search_student(students)
        elif choice == "4":
            update_student(students)
        elif choice == "5":
            delete_student(students)
        elif choice == "0":
            print("👋 已退出系统")
            break
        else:
            print("⚠ 输入错误,请重新选择")


# 运行程序
main()
import csv
import random

FILENAME = "students_full.csv"

# 学生名单(示例,你可以修改)
students_names = ["张三", "李四", "王五", "赵六", "钱七","王沁","颜奕","杨胤隆","童圆","李金铭","莫文蔚","张嘉涵","李佳妍"]

# 科目及满分
subjects = {
    "math": 120,
    "english": 120,
    "chinese": 120,
    "history": 100,
    "politics": 100,
    "geography": 100,
    "biology": 100,
    "chemistry": 100,
    "physics": 100
}

# =========================
# 自动生成成绩
# =========================
students = []

#对应每一个名字生成相对应的成绩部分
for name in students_names:
    student = {"name": name}
    total = 0
    # 随机生成每科成绩
    for subject, max_score in subjects.items():
        score = random.randint(int(max_score*0.5), max_score)  # 50分到满分之间
        student[subject] = score # 字典结构的定义,是添加修改的意思,没有这个键就会新增一个,原本有这个键就会修改原本的值
        total += score
    student["total"] = total
    student["average"] = round(total / len(subjects), 2)
    students.append(student)

# =========================
# 根据总分生成排名
# =========================
students.sort(key=lambda x: x["total"], reverse=True)  # 总分降序
for idx, student in enumerate(students, start=1):
    student["rank"] = idx

# =========================
# 写入 CSV 文件
# =========================
fieldnames = ["name"] + list(subjects.keys()) + ["total", "average", "rank"]

with open(FILENAME, mode="w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()
    for student in students:
        writer.writerow(student)

print("✅ 成绩文件已生成:students_full.csv")
import csv
import os

FILENAME = "students_full.csv"

subjects = ["math", "english", "chinese", "history", "politics", "geography", "biology", "chemistry", "physics"]

# =========================
# 读取学生数据
# =========================
def load_students():
    students = []
    if not os.path.exists(FILENAME):
        print("📭 成绩文件不存在,请先生成。")
        return students
    with open(FILENAME, mode="r", newline="", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            # 转整数成绩
            for subject in subjects + ["total", "rank"]:
                row[subject] = int(row[subject]) if subject not in ["average"] else float(row["average"])
            students.append(row)
    return students

# =========================
# 保存学生数据
# =========================
def save_students(students):
    fieldnames = ["name"] + subjects + ["total", "average", "rank"]
    # 根据总分重新计算排名
    students.sort(key=lambda x: x["total"], reverse=True)
    for idx, student in enumerate(students, start=1):
        student["rank"] = idx
    with open(FILENAME, mode="w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        for student in students:
            writer.writerow(student)

# =========================
# 添加学生
# =========================
def add_student(students):
    name = input("请输入学生姓名:")
    total = 0
    student = {"name": name}
    for subject in subjects:
        score = int(input(f"请输入{subject}成绩:"))
        student[subject] = score
        total += score
    student["total"] = total
    student["average"] = round(total / len(subjects), 2)
    students.append(student)
    save_students(students)
    print("✅ 学生成绩已添加!")

# =========================
# 显示所有学生
# =========================
def show_students(students):
    if not students:
        print("📭 当前没有学生信息")
        return
    for student in students:
        print(f"姓名:{student['name']},总分:{student['total']},平均分:{student['average']},排名:{student['rank']}")

# =========================
# 查询学生成绩
# =========================
def search_student(students):
    name = input("请输入要查询的学生姓名:")
    for student in students:
        if student["name"] == name:
            print(f"🎯 {name} 的成绩:")
            for subject in subjects:
                print(f"{subject}{student[subject]}")
            print(f"总分:{student['total']},平均分:{student['average']},排名:{student['rank']}")
            return
    print("❌ 未找到该学生")

# =========================
# 修改学生成绩
# =========================
def update_student(students):
    name = input("请输入要修改的学生姓名:")
    for student in students:
        if student["name"] == name:
            total = 0
            for subject in subjects:
                score = int(input(f"请输入新的{subject}成绩:"))
                student[subject] = score
                total += score
            student["total"] = total
            student["average"] = round(total / len(subjects), 2)
            save_students(students)
            print("✅ 成绩修改完成!")
            return
    print("❌ 未找到该学生")

# =========================
# 删除学生
# =========================
def delete_student(students):
    name = input("请输入要删除的学生姓名:")
    for student in students:
        if student["name"] == name:
            students.remove(student)
            save_students(students)
            print("🗑 学生已删除")
            return
    print("❌ 未找到该学生")

# =========================
# 菜单
# =========================
def menu():
    print("\n====== 学生成绩管理系统(多科版) ======")
    print("1. 添加学生")
    print("2. 显示所有学生")
    print("3. 查询学生成绩")
    print("4. 修改学生成绩")
    print("5. 删除学生")
    print("0. 退出系统")

# =========================
# 主程序
# =========================
def main():
    students = load_students()
    if not students:
        return  # 如果文件不存在,直接退出
    while True:
        menu()
        choice = input("请选择功能:")
        if choice == "1":
            add_student(students)
        elif choice == "2":
            show_students(students)
        elif choice == "3":
            search_student(students)
        elif choice == "4":
            update_student(students)
        elif choice == "5":
            delete_student(students)
        elif choice == "0":
            print("👋 已退出系统")
            break
        else:
            print("⚠ 输入错误,请重新选择")

# 运行程序
main()