You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:06:43