Java线程的三种创建方式
2025/12/17 23:21:35
student_grade.txt;思路:
主菜单循环显示: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_input中lst无实际作用;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()