当前位置: 首页 > news >正文

python练习项目

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

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

思路:
主菜单循环显示:while True
添加成绩:用两个列表,通过格式化字符串写文件
查询成绩:读出文件每行内容,在字符串中查找指定名字,返回整行内容
统计分析:读出文件每行内容,提取数字。提取数字可以拆分,也可以直接提取数字后组合。

我的答案:

#添加成绩到文件defscore_input(name,score):lst=[]ifscore==0:return0else:lst.append(name)lst.append(score)withopen("student_grade.txt",mode="a",encoding="utf-8")asf:f.write(f"姓名:{name},分数:{score}\n")return"已保存"#查询成绩deffind_score(name):withopen("student_grade.txt",mode="r",encoding="utf-8")asf:foriinf.readlines():ifnameini.strip():print(i)ifnotnameini.strip():print("姓名不存在")#统计成绩所有成绩的平均分、及格人数、优秀人数(≥90)defscore_info():good=0best=0withopen("student_grade.txt",mode="r",encoding="utf-8")asf:lst=f.readlines()scores=[]good=0best=0forsinlst:score=int("".join(cforcinsifc.isdigit()))ifscore>=60:good+=1ifscore>=90:best+=1scores.append(score)total=sum(scores)avg=total/len(scores)#平均分returnf"平均分:{avg:.2f},及格人数:{good}人,优秀人数:{best}人"whileTrue:func=input("「1-添加成绩 2-查询成绩 3-统计分析 4-退出」")iffunc=="4":breakeliffunc=="1":name=input("请输入姓名").strip()score=int(input("请输入成绩"))score_input(name,score)eliffunc=="2":name2=input("请输入姓名").strip()find_score(name2)eliffunc=="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”,提取成绩依赖数字提取,易出错

参考答案:

# 1. 添加成绩(优化:输入校验+格式统一)defscore_input(name,score):# 输入校验:姓名非空、成绩0-100整数ifnotname.strip():return"错误:姓名不能为空!"try:score=int(score)ifnot(0<=score<=100):return"错误:成绩需在0-100之间!"exceptValueError:return"错误:成绩必须是整数!"# 统一格式:姓名 成绩(空格分隔,便于后续拆分)withopen("student_grade.txt",mode="a",encoding="utf-8")asf:f.write(f"{name.strip()}{score}\n")return"✅ 成绩添加成功!"# 2. 查询成绩(优化:遍历所有行+明确提示)deffind_score(name):ifnotname.strip():return"错误:姓名不能为空!"# 标记是否找到found=Falsewithopen("student_grade.txt",mode="r",encoding="utf-8")asf:forlineinf:line=line.strip()ifnotline:# 跳过空行continue# 按空格拆分姓名和成绩(兼容统一格式)if" "inline:stu_name,stu_score=line.split(maxsplit=1)ifstu_name==name.strip():print(f"🔍 找到成绩:{stu_name}{stu_score}分")found=Trueifnotfound:print(f"❌ 未找到姓名为「{name}」的成绩记录")# 3. 统计分析(优化:容错提取成绩+处理空文件)defscore_info():scores=[]pass_count=0# 及格人数(≥60)excellent_count=0# 优秀人数(≥90)# 处理文件不存在/空文件try:withopen("student_grade.txt",mode="r",encoding="utf-8")asf:lines=[line.strip()forlineinfifline.strip()]# 过滤空行exceptFileNotFoundError:return"❌ 暂无成绩记录(文件不存在)"ifnotlines:return"❌ 暂无成绩记录(文件为空)"# 遍历提取成绩(容错处理)forlineinlines:try:# 按空格拆分,提取成绩(兼容统一格式)_,score_str=line.split(maxsplit=1)score=int(score_str)scores.append(score)# 统计及格/优秀ifscore>=60:pass_count+=1ifscore>=90:excellent_count+=1except(ValueError,IndexError):# 跳过格式错误的行print(f"⚠️ 忽略无效行:{line}")continueifnotscores:return"❌ 无有效成绩记录"# 计算平均分avg_score=sum(scores)/len(scores)return(f"📊 成绩统计结果:\n"f"平均分:{avg_score:.2f}分\n"f"及格人数:{pass_count}人\n"f"优秀人数(≥90):{excellent_count}人")# 4. 主循环(优化:交互提示+异常处理)defmain():print("===== 学生成绩管理系统 =====")whileTrue:func=input("\n请选择操作:「1-添加成绩 2-查询成绩 3-统计分析 4-退出」\n").strip()iffunc=="4":print("👋 退出系统,感谢使用!")breakeliffunc=="1":name=input("请输入学生姓名:")score=input("请输入成绩(0-100):")result=score_input(name,score)print(result)eliffunc=="2":name2=input("请输入要查询的学生姓名:")find_score(name2)eliffunc=="3":print(score_info())else:print("❌ 输入错误,请选择1-4!")# 启动系统if__name__=="__main__":main()
http://www.cnnetsun.cn/news/115473.html

相关文章:

  • jquery的基本使用(2)
  • HTML5结合Vue3实现超大文件分片上传的加密传输方案?
  • 基于增量动力分析方法IDA求解易损性曲线的Matlab代码探秘
  • mysql面试题整理
  • 瞄准科技特长生!3 大核心编程考级赛事(CTL/YCL/GESP)深度对比
  • day38打卡
  • JavaEE进阶——SpringBoot日志从入门到精通
  • 结构体简单题
  • 时间序列回归预测:LSTM、CNN - LSTM、PSO - CNN - LSTM、GAPSO - CNN - LSTM大比拼
  • 飞轮储能系统的建模与 MATLAB 仿真:永磁同步电机作为飞轮驱动电机
  • 车间进度总卡壳?生产小工单的3个必备功能,90%企业都用错了
  • 如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
  • 基于MPC的永磁同步电机非线性终端滑模控制仿真研究
  • ISSA - CNN - BiLSTM多输入单输出回归的Python实现与改进
  • Q学习(Q-learning)路径规划算法实战
  • ANSYS/LS - dyna防爆涂层砂浆砖框架结构爆破荷载损伤响应案例探索
  • 基于TOA/FOA的无源定位方法MATLAB仿真探索
  • 基于一致性算法改进的自适应虚拟阻抗控制:解决双机并联功率分布不均
  • springboot框架对接物联网,配置TCP协议依赖,与设备通信,让TCP变的如此简单
  • 微软和布朗大学最新发现:让AI助手拥有18000多种技能的革命性突破
  • MATLAB仿真:二维TOA传感器网络定位与时钟偏差拟合,最小二乘求解
  • 【参数辨识】基于卡尔曼滤波(KF)估计离散线性系统对垂直起降(VTOL)飞行器的鲁棒辨识附matlab代码
  • 桥梁与隧道安全守护者 抗冰冻型风速监测方案
  • 05-FreeRTOS的内存管理
  • 基于改进蛇优化算法(GOSO/ISO)优化随机森林数据回归预测模型(含初始化种群混沌映射、减法...
  • 基于大数据的人脸识别系统设计与实现开题报告
  • 车载 Android 系统稳定性问题全解析:从性能到黑屏的排查指南
  • 气象在线监测系统助力智慧环境管理,金叶仪器专业气象监测解决方案
  • 【TVM 教程】交叉编译与 RPC
  • 腾讯云国际站代理商的QAPM服务能提供哪些专属服务?