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()	
相关推荐
a1117762 小时前
医院挂号预约系统(开源 Fastapi+vue2)
前端·vue.js·python·html5·fastapi
0思必得03 小时前
[Web自动化] Selenium处理iframe和frame
前端·爬虫·python·selenium·自动化·web自动化
摘星编程5 小时前
OpenHarmony + RN:Calendar日期选择功能
python
Yvonne爱编码5 小时前
JAVA数据结构 DAY3-List接口
java·开发语言·windows·python
一方_self5 小时前
了解和使用python的click命令行cli工具
开发语言·python
小芳矶5 小时前
Dify本地docker部署踩坑记录
python·docker·容器
2301_822366356 小时前
使用Scikit-learn构建你的第一个机器学习模型
jvm·数据库·python
小郎君。6 小时前
【无标题】
python
喵手6 小时前
Python爬虫实战:数据治理实战 - 基于规则与模糊匹配的店铺/公司名实体消歧(附CSV导出 + SQLite持久化存储)!
爬虫·python·数据治理·爬虫实战·零基础python爬虫教学·规则与模糊匹配·店铺公司名实体消岐
喵手6 小时前
Python爬虫实战:国际电影节入围名单采集与智能分析系统:从数据抓取到获奖预测(附 CSV 导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集数据csv导出·采集国际电影节入围名单·从数据抓取到获奖预测