Python成绩计算器范围校验与进度结果输出异常问题求助
Python成绩计算器问题修复方案
需求说明
开发一款Python成绩计算器,要求:
- 当输入的Pass、Defer、Fail学分不在集合
{0,20,40,60,80,100,120}内时,程序显示Out of range - 根据输入学分计算并输出学业进度结果:
- Pass=120 → Progress
- Pass=100 → Progress (module trailer)
- Fail≥80 → Exclude
- 其他情况 → Do not progress – module retriever
- 总分不等于120时显示
Total incorrect - 输入非整数时显示
Integer required
当前存在的问题
- 旧实现(进度正常但范围校验失效):范围校验逻辑错误,不符合要求的学分(如输入10)只会触发
Total incorrect,而非Out of range;且仅通过%20 !=0判断,无法识别140这类是20倍数但超出范围的学分。 - 新实现(范围校验正常但进度结果异常):总分判断逻辑完全写反,导致符合条件的输入(如Pass=120)无法触发进度结果输出,反而打印
Total incorrect;同时依赖全局变量,代码健壮性差。
旧方法代码(进度正常但范围校验失效)
def Main_Version(): if StudentPassCredits == 120: print('Your academic year progression outcome is :', 'Progress') elif StudentPassCredits == 100: print('Your academic year progression outcome is :', 'Progress (module trailer)') elif StudentFailCredits >= 80: print('Your academic year progression outcome is :', 'Exclude') else: print('Your academic year progression outcome is :', 'Do not progress – module retriever') def Validation(StudentPassCredits, StudentDeferCredits, StudentFailCredits): if StudentPassCredits + StudentDeferCredits + StudentFailCredits == 120: if StudentPassCredits % 20 != 0 or StudentDeferCredits % 20 != 0 or StudentFailCredits % 20 != 0: print('Range error') else: Main_Version() else: print('Total incorrect') try: StudentPassCredits = int(input('Please enter your current pass credits: ')) StudentDeferCredits = int(input('Please enter your current defer credits: ')) StudentFailCredits = int(input('Please enter your current fail credits: ')) Validation(StudentPassCredits, StudentDeferCredits, StudentFailCredits) except ValueError: print('Integer required')
新方法代码(范围校验正常但进度结果异常)
def Main_Version(): if StudentPassCredits == 120: print('Your academic year progression outcome is :', 'Progress') elif StudentPassCredits == 100: print('Your academic year progression outcome is :', 'Progress (module trailer)') elif StudentFailCredits >= 80: print('Your academic year progression outcome is :', 'Exclude') else: print('Your academic year progression outcome is :', 'Do not progress – module retriever') def _validate_credits_in_range(credits: int, container: "Container[int]" = range(0, 121, 20)) -> bool: return credits in container def Validation(StudentPassCredits: int, StudentDeferCredits: int, StudentFailCredits: int) -> None: if all(_validate_credits_in_range(credits) for credits in(StudentPassCredits, StudentDeferCredits, StudentFailCredits)): if StudentPassCredits + StudentDeferCredits + StudentFailCredits == 120: print('Total incorrect') else: Main_Version() else: print('Range error') try: StudentPassCredits = int(input('Please enter your current pass credits: ')) StudentDeferCredits = int(input('Please enter your current defer credits: ')) StudentFailCredits = int(input('Please enter your current fail credits: ')) Validation(StudentPassCredits, StudentDeferCredits, StudentFailCredits) except ValueError: print('Integer required')
修复方案及完整代码
关键修改点
- 修正范围校验:用明确的集合
ALLOWED_CREDITS = {0,20,40,60,80,100,120}判断,替代仅检查是否为20倍数的逻辑,避免误判超出范围的20倍数学分。 - 修正总分判断逻辑:将新代码中颠倒的总分判断条件改回正确逻辑——总分等于120时才计算进度结果,否则打印
Total incorrect。 - 移除全局变量依赖:将进度计算函数改为接收参数,直接使用传入的学分值,避免全局变量引发的潜在问题。
- 统一错误提示文本:将范围错误提示改为需求要求的
Out of range。 - 优化代码结构:拆分功能模块,让每个函数职责单一,可读性更强。
修复后的完整代码
ALLOWED_CREDITS = {0, 20, 40, 60, 80, 100, 120} def get_progression_outcome(pass_credits, fail_credits): if pass_credits == 120: return 'Progress' elif pass_credits == 100: return 'Progress (module trailer)' elif fail_credits >= 80: return 'Exclude' else: return 'Do not progress – module retriever' def validate_and_calculate(pass_credits, defer_credits, fail_credits): # 校验每个学分是否在允许范围内 if not all(credits in ALLOWED_CREDITS for credits in (pass_credits, defer_credits, fail_credits)): print('Out of range') return # 校验总分是否正确 total = pass_credits + defer_credits + fail_credits if total != 120: print('Total incorrect') return # 计算并输出进度结果 outcome = get_progression_outcome(pass_credits, fail_credits) print(f'Your academic year progression outcome is : {outcome}') try: pass_credits = int(input('Please enter your current pass credits: ')) defer_credits = int(input('Please enter your current defer credits: ')) fail_credits = int(input('Please enter your current fail credits: ')) validate_and_calculate(pass_credits, defer_credits, fail_credits) except ValueError: print('Integer required')
代码说明
ALLOWED_CREDITS常量定义了所有合法的学分值,清晰直观,便于后续维护。get_progression_outcome函数专注于进度结果计算,仅接收必要参数,逻辑独立清晰。validate_and_calculate函数按顺序执行范围校验、总分校验,最后触发结果计算,完全符合需求流程。- 变量名采用下划线命名法,符合Python编码规范,可读性更强。
内容的提问来源于stack exchange,提问作者user20578059
相关产品推荐
相关产品推荐

