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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:51:02