news 2025/12/28 11:15:07

python练习项目

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/21 17:56:14

jquery的基本使用(2)

在jquery重要的主干就是选择器和事件&#xff0c;其他的所有操作都是基于这两者来进行操作的。jquery选择器选择器就类似我们之前讲的getElementById之类的&#xff0c;就是查找dom中的某个元素。在jquery中&#xff0c;我们可以很简单的就能选择到我们想操作的dom元素。$(func…

作者头像 李华
网站建设 2025/12/28 6:01:42

HTML5结合Vue3实现超大文件分片上传的加密传输方案?

中石油旗下子公司大文件传输系统技术方案 一、项目背景与需求分析 作为中石油集团旗下专注于能源信息化领域的子公司&#xff0c;我司长期服务于政府及军工单位&#xff0c;在能源管理、安全生产等关键领域积累了丰富的行业经验。本次政府招投标项目提出的大文件传输需求具有…

作者头像 李华
网站建设 2025/12/27 12:49:18

基于增量动力分析方法IDA求解易损性曲线的Matlab代码探秘

基于增量动力分析方法IDA求解易损性曲线matlab代码&#xff0c;代码源文件在结构工程领域&#xff0c;评估结构在不同强度地震作用下的易损性至关重要。增量动力分析方法&#xff08;Incremental Dynamic Analysis&#xff0c;IDA&#xff09;就是一种强大的工具&#xff0c;通…

作者头像 李华
网站建设 2025/12/26 10:30:12

mysql面试题整理

1.mysql mvcc 机制 在 MySQL 面试中&#xff0c;MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是一个高频考点&#xff0c;主要考察候选人对事务隔离级别和并发控制机制的理解。以下是针对 MVCC 的核心知识点总结&#xff1a;1. m…

作者头像 李华
网站建设 2025/12/26 13:28:22

瞄准科技特长生!3 大核心编程考级赛事(CTL/YCL/GESP)深度对比

一、核心推荐&#xff1a;两大权威编程考级赛事 &#xff08;一&#xff09;全国青少年计算思维等级测评活动&#xff08;CTL 等级测评&#xff09; 官网&#xff1a;智启未来-青少年人工智能素养提升公益计划 作为以 C 编程语言为核心的人工智能能力测评体系&#xff0c;CTL …

作者头像 李华
网站建设 2025/12/27 7:20:54

day38打卡

import torch from torch.utils.data import Dataset, DataLoader from torchvision import datasets, transforms import matplotlib.pyplot as plt# # 1. 深入理解 Dataset (自定义演示) # class SimpleNumberDataset(Dataset):def __init__(self, start, end):# 模拟数据&…

作者头像 李华