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

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

当前存在的问题

  1. 旧实现(进度正常但范围校验失效):范围校验逻辑错误,不符合要求的学分(如输入10)只会触发Total incorrect,而非Out of range;且仅通过%20 !=0判断,无法识别140这类是20倍数但超出范围的学分。
  2. 新实现(范围校验正常但进度结果异常):总分判断逻辑完全写反,导致符合条件的输入(如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')

修复方案及完整代码

关键修改点

  1. 修正范围校验:用明确的集合ALLOWED_CREDITS = {0,20,40,60,80,100,120}判断,替代仅检查是否为20倍数的逻辑,避免误判超出范围的20倍数学分。
  2. 修正总分判断逻辑:将新代码中颠倒的总分判断条件改回正确逻辑——总分等于120时才计算进度结果,否则打印Total incorrect。
  3. 移除全局变量依赖:将进度计算函数改为接收参数,直接使用传入的学分值,避免全局变量引发的潜在问题。
  4. 统一错误提示文本:将范围错误提示改为需求要求的Out of range。
  5. 优化代码结构:拆分功能模块,让每个函数职责单一,可读性更强。

修复后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:15:42