python练习项目

项目名称:简易学生成绩管理系统

功能要求:
  1. 主菜单:循环显示「1-添加成绩 2-查询成绩 3-统计分析 4-退出」;
  2. 添加成绩:输入姓名+成绩(校验0-100),追加写入student_grade.txt
  3. 查询成绩:输入姓名,读取文件返回对应成绩(无则提示);
  4. 统计分析:计算所有成绩的平均分、及格人数、优秀人数(≥90),打印结果;
  5. 退出:打印"退出系统",终止程序;
  6. 要求:用函数封装各功能,处理输入异常(非数字、负数等)。

思路:

主菜单循环显示:while True

添加成绩:用两个列表,通过格式化字符串写文件

查询成绩:读出文件每行内容,在字符串中查找指定名字,返回整行内容

统计分析:读出文件每行内容,提取数字。提取数字可以拆分,也可以直接提取数字后组合。

我的答案:

python 复制代码
#添加成绩到文件
def score_input(name,score):
    lst = []
    if score == 0:
        return 0
    else:
        lst.append(name)
        lst.append(score)
    with open("student_grade.txt",mode="a",encoding="utf-8") as f:
        f.write(f"姓名:{name},分数:{score}\n")
    return "已保存"

#查询成绩
def find_score(name):
    with open("student_grade.txt",mode="r",encoding="utf-8") as f:
            for i in  f.readlines():
                if name in i.strip():
                    print(i)
            if not name in i.strip():
                    print("姓名不存在")

#统计成绩所有成绩的平均分、及格人数、优秀人数(≥90)
def score_info():
    good = 0
    best = 0
    with open("student_grade.txt",mode="r",encoding="utf-8") as f:
        lst = f.readlines()
        scores = []
        good = 0
        best = 0
    for s in lst:
        score = int("".join(c for c in s if c.isdigit()))
        if score >= 60:
            good += 1
            if score >= 90:
                best += 1
        scores.append(score)
    total = sum(scores)
    avg = total / len(scores)#平均分
    return f"平均分:{avg:.2f},及格人数:{good}人,优秀人数:{best}人"

while True:
    func = input("「1-添加成绩 2-查询成绩 3-统计分析 4-退出」")
    if func == "4":
        break
    elif func == "1":
        name = input("请输入姓名").strip()
        score = int(input("请输入成绩"))
        score_input(name, score)
    elif func == "2":
        name2 = input("请输入姓名").strip()
        find_score(name2)
    elif func == "3":
        print(score_info())

错误分析:

问题类型 具体表现 影响
1. 输入校验缺失 成绩未校验 0-100 范围、非数字输入直接报错、空姓名未过滤 输入负数 / 101 / 字母会崩溃,空姓名写入文件导致统计错误
2. 统计逻辑漏洞 提取成绩时若字符串无数字(如 "姓名:张三,分数:")会报错;统计时未处理空行 文件有异常行 / 空行时,int()转换失败,统计功能崩溃
3. 查询逻辑错误 if not name in i.strip() 仅判断最后一行,姓名不存在时提示不生效 若查询的姓名不在最后一行,即使不存在也不会提示 "姓名不存在"
4. 冗余代码 score_inputlst无实际作用;score_info中重复初始化good/best 代码冗余,增加理解成本
5. 格式不统一 写入格式为 "姓名:XX,分数:XX",提取成绩依赖数字提取,易出错

参考答案:

python 复制代码
# 1. 添加成绩(优化:输入校验+格式统一)
def score_input(name, score):
    # 输入校验:姓名非空、成绩0-100整数
    if not name.strip():
        return "错误:姓名不能为空!"
    try:
        score = int(score)
        if not (0 <= score <= 100):
            return "错误:成绩需在0-100之间!"
    except ValueError:
        return "错误:成绩必须是整数!"
    
    # 统一格式:姓名 成绩(空格分隔,便于后续拆分)
    with open("student_grade.txt", mode="a", encoding="utf-8") as f:
        f.write(f"{name.strip()} {score}\n")
    return "✅ 成绩添加成功!"

# 2. 查询成绩(优化:遍历所有行+明确提示)
def find_score(name):
    if not name.strip():
        return "错误:姓名不能为空!"
    # 标记是否找到
    found = False
    with open("student_grade.txt", mode="r", encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if not line:  # 跳过空行
                continue
            # 按空格拆分姓名和成绩(兼容统一格式)
            if " " in line:
                stu_name, stu_score = line.split(maxsplit=1)
                if stu_name == name.strip():
                    print(f"🔍 找到成绩:{stu_name} {stu_score}分")
                    found = True
    if not found:
        print(f"❌ 未找到姓名为「{name}」的成绩记录")

# 3. 统计分析(优化:容错提取成绩+处理空文件)
def score_info():
    scores = []
    pass_count = 0  # 及格人数(≥60)
    excellent_count = 0  # 优秀人数(≥90)
    
    # 处理文件不存在/空文件
    try:
        with open("student_grade.txt", mode="r", encoding="utf-8") as f:
            lines = [line.strip() for line in f if line.strip()]  # 过滤空行
    except FileNotFoundError:
        return "❌ 暂无成绩记录(文件不存在)"
    
    if not lines:
        return "❌ 暂无成绩记录(文件为空)"
    
    # 遍历提取成绩(容错处理)
    for line in lines:
        try:
            # 按空格拆分,提取成绩(兼容统一格式)
            _, score_str = line.split(maxsplit=1)
            score = int(score_str)
            scores.append(score)
            # 统计及格/优秀
            if score >= 60:
                pass_count += 1
                if score >= 90:
                    excellent_count += 1
        except (ValueError, IndexError):
            # 跳过格式错误的行
            print(f"⚠️ 忽略无效行:{line}")
            continue
    
    if not scores:
        return "❌ 无有效成绩记录"
    
    # 计算平均分
    avg_score = sum(scores) / len(scores)
    return (f"📊 成绩统计结果:\n"
            f"平均分:{avg_score:.2f}分\n"
            f"及格人数:{pass_count}人\n"
            f"优秀人数(≥90):{excellent_count}人")

# 4. 主循环(优化:交互提示+异常处理)
def main():
    print("===== 学生成绩管理系统 =====")
    while True:
        func = input("\n请选择操作:「1-添加成绩 2-查询成绩 3-统计分析 4-退出」\n").strip()
        if func == "4":
            print("👋 退出系统,感谢使用!")
            break
        elif func == "1":
            name = input("请输入学生姓名:")
            score = input("请输入成绩(0-100):")
            result = score_input(name, score)
            print(result)
        elif func == "2":
            name2 = input("请输入要查询的学生姓名:")
            find_score(name2)
        elif func == "3":
            print(score_info())
        else:
            print("❌ 输入错误,请选择1-4!")

# 启动系统
if __name__ == "__main__":
    main()	
相关推荐
周杰伦_Jay3 小时前
【Python开发面试题及答案】核心考点+原理解析+实战场景
开发语言·python
HyperAI超神经3 小时前
【vLLM 学习】vLLM TPU 分析
开发语言·人工智能·python·学习·大语言模型·vllm·gpu编程
爱笑的眼睛113 小时前
FastAPI 请求验证:超越 Pydantic 基础,构建企业级验证体系
java·人工智能·python·ai
拉姆哥的小屋3 小时前
基于深度学习的瞬变电磁法裂缝参数智能反演研究
人工智能·python·深度学习
码界奇点4 小时前
Python与OpenCV集成海康威视工业相机从基础配置到高级应用的全方位指南
python·数码相机·opencv·相机·python3.11
来两个炸鸡腿4 小时前
DW动手学大模型应用全栈开发 - (1)大模型应用开发应知必会
python·深度学习·学习·nlp
qq_418247884 小时前
恒源云/autodl与pycharm远程连接
ide·人工智能·python·神经网络·机器学习·pycharm·图论
我命由我123454 小时前
Python Flask 开发 - Flask 快速上手(Flask 最简单的案例、Flask 处理跨域、Flask 基础接口)
服务器·开发语言·后端·python·学习·flask·学习方法
大飞记Python4 小时前
从零配置Python测试环境:详解路径、依赖与虚拟环境最佳实践
开发语言·python·环境配置·安装目录