Python成绩计算器范围错误问题:需实现指定学分范围校验
问题修复方案
核心问题
你的代码当前校验逻辑顺序错误:先判断学分总和是否为120,再校验学分是否为20的倍数。但当输入学分不在允许集合({0,20,40,60,80,100,120})中时,总和大概率不等于120,导致直接触发“Total incorrect”,无法进入范围校验分支。此外,仅靠倍数判断存在漏洞(比如140是20的倍数但不在允许范围内),且Main_Version依赖全局变量,耦合性高。
修复后的代码
ALLOWED_CREDITS = {0, 20, 40, 60, 80, 100, 120} def Main_Version(pass_credits, defer_credits, fail_credits): if pass_credits == 120: print('Your academic year progression outcome is :', 'Progress') elif pass_credits == 100: print('Your academic year progression outcome is :', 'Progress (module trailer)') elif fail_credits >= 80: print('Your academic year progression outcome is :', 'Exclude') else: print('Your academic year progression outcome is :', 'Do not progress – module retriever') def Validation(pass_credits, defer_credits, fail_credits): # 优先校验每个学分是否在允许范围内 if (pass_credits not in ALLOWED_CREDITS or defer_credits not in ALLOWED_CREDITS or fail_credits not in ALLOWED_CREDITS): print('Out of range') return # 再校验学分总和是否合规 if pass_credits + defer_credits + fail_credits != 120: print('Total incorrect') return # 校验通过后执行结果判定 Main_Version(pass_credits, defer_credits, fail_credits) 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集合,明确允许的学分值,直接校验输入是否在集合内,避免仅靠倍数判断的漏洞 - 调整校验顺序:先检查范围再检查总和,确保范围错误优先触发
- 修改
Main_Version函数,通过参数传递学分值,消除对全局变量的依赖,提升代码健壮性
内容的提问来源于stack exchange,提问作者user20578059
相关产品推荐
相关产品推荐

