Python如何用try、except、assert校验GPA程序的等级输入
学生GPA计算程序修正方案
原代码现存问题
- 未按要求对字母等级做合法性校验,缺少
try/except/assert校验逻辑,非法输入会导致程序崩溃 - 绩点映射存在逻辑错误:B+等级的小写判断误写为
b,和B级判断冲突,且缺失F等级(0绩点)的映射 - 绩点、学分值存储为带单位的字符串,后续数值计算时强转int/float会直接报错
- 课程信息打印时变量引用错误,误将单门课程名变量写为全量课程字典
- GPA计算逻辑错误:仅累加绩点和学分的乘积,未除以总学分得出正确平均绩点
核心实现规则匹配
- 等级校验环节使用
assert判断输入是否属于A+到F的合法区间,搭配try/except捕获断言错误、输入类型错误,非法输入时循环提示重输 - 所有课程的名称、字母等级、对应绩点、学分数据统一存储在
courses字典中 - 修复原有逻辑bug,保证GPA计算结果准确
完整可运行代码
from num2words import num2words # 合法字母等级集合 VALID_GRADES = {"A+", "A", "B+", "B", "C+", "C", "D+", "D", "F", "a+", "a", "b+", "b", "c+", "c", "d+", "d", "f"} courses = {} # 绩点映射函数,返回浮点型绩点数值 def get_point_value(grade): grade_upper = grade.upper() point_map = { "A+": 4.2, "A": 4.0, "B+": 3.5, "B": 3.0, "C+": 2.5, "C": 2.0, "D+": 1.5, "D": 1.0, "F": 0.0 } return point_map[grade_upper] # 录入课程名称 while True: course_name = input("Enter course name: ").strip() if not course_name: break courses[course_name] = {} # 录入每门课的等级和学分,带输入校验 for cname in courses.keys(): # 校验字母等级输入 while True: letter_grade = input(f"Enter letter grade for {cname}: ").strip() try: # 断言判断等级是否合法 assert letter_grade in VALID_GRADES, "等级必须属于A+到F的合法区间" break except AssertionError as e: print(f"输入错误:{e},请重新输入") # 校验学分输入 while True: credit_input = input(f"Enter course credit for {cname}: ").strip() try: course_credit = float(credit_input) assert course_credit > 0, "学分必须为大于0的数值" break except (ValueError, AssertionError) as e: print(f"输入错误:学分必须是大于0的数字,请重新输入") # 所有信息存入同一个courses字典 point = get_point_value(letter_grade) courses[cname] = { "letter_grade": letter_grade.upper(), "grade_point": point, "credit": course_credit } print("\n") # 打印单门课程信息 for cname, course_info in courses.items(): print(f"Course {cname} student grade as follows: 字母等级{course_info['letter_grade']},绩点{course_info['grade_point']} points,学分{course_info['credit']} credits") print("\n") # 计算GPA total_weighted = 0 total_credit = 0 course_count = len(courses) print(f"The GPA for this student with {num2words(course_count).upper()} courses would be: ") for idx, (cname, course_info) in enumerate(courses.items()): gp = course_info["grade_point"] credit = course_info["credit"] total_weighted += gp * credit total_credit += credit if idx == 0: print(f" ( {gp} points * {credit} credits )") else: print(f" + ( {gp} points * {credit} credits )") final_gpa = total_weighted / total_credit print("----------------------------------------------") print(f"Total weighted points: {round(total_weighted,2)} , total credits: {total_credit}") print(f"Final GPA: {round(final_gpa,2)}")
代码说明
- 等级校验逻辑:输入等级后通过
assert判断是否在预定义的合法等级集合中,若断言失败则由except块捕获错误并提示重新输入,符合要求的校验规则 - 数据存储:所有课程的等级、绩点、学分都作为
courses字典的嵌套值存储,满足单字典存储所有数据的要求 - 输入学分时额外增加了数值合法性校验,避免非数字、负数学分导致程序崩溃
- 绩点映射统一转大写处理,避免大小写重复判断的冗余逻辑,同时补全了F等级的0绩点映射
- 最终GPA按加权平均逻辑计算,结果保留2位小数,符合常规GPA计算规则
内容的提问来源于stack exchange,提问作者NoobProgrammer
相关产品推荐
相关产品推荐

