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

CS50P Little Professor代码未通过check50检测求助

CS50P 作业4 Little Professor 问题排查

问题描述

  • 本地运行正常,但 check50 自动检测在 Level 1、2、3 均失败
  • 错误提示:期望输出包含「6 + 6 =」,实际输出为「6 + 0 =」
  • 疑问:为何检测要求特定随机加法题目,寻求代码排查思路

代码

import random
import sys

def main():
    level = get_level()
    generate_integer(level)

    score = 0

    for i in range(10):
        a = generate_integer(level)
        b = generate_integer(level)

        for j in range(3):
            ans = input(f"{a} + {b} =")
            if int(ans) == int(a + b):
                score += 1
                break
            else:
                print("EEE")
                if j == 2:
                    print(a+b)
            j += 1

        i += 1

    print(f"Score: {score}")
    sys.exit(0)

# Prompts the user for a level, n
# If the user does not input 1, 2, or 3, the program should prompt again.

# get_level prompts (and, if need be, re-prompts) the user for a level and returns 1, 2, or 3,
def get_level():
    while True:
        try:
            level = int(input())
            if level < 1 or level > 3:
                level = input()
            else:
                break
        except ValueError:
            level = input()
    return level


# generate_integer returns a randomly generated non-negative integer with level digits or raises a ValueError if level is not 1, 2, or 3
def generate_integer(level):
    if level == 1:
        y = random.randint(0, 9)
    elif level == 2:
        y = random.randint(10, 99)
    elif level == 3:
        y = random.randint(100, 999)
    else:
        raise ValueError

    return y


if __name__ == "__main__":
    main()

错误原因分析

  1. 多余的随机数调用:
    main 函数开头的generate_integer(level)是无意义的多余调用,它会消耗一个随机数,导致后续生成的 a、b 序列与 check50 测试时预设的随机序列不一致。check50 依赖固定的随机种子生成预期题目,这个多余调用打乱了序列,从而出现「6 + 0 =」与预期「6 + 6 =」不符的错误。

  2. get_level 函数逻辑错误:
    当用户输入无效值(非 1-3 的整数或非整数)时,函数处理流程混乱:

    • 输入非 1-3 的整数时,会额外执行一次input()但不验证,下一次循环又重新要求输入,导致用户需要多次输入才能通过验证。
    • 输入非整数时,进入except块后仅执行input(),同样没有验证逻辑,后续循环仍需重新输入。
      这不符合题目要求的「输入无效时重新提示」的逻辑,也可能导致 check50 自动化输入时出现异常。
  3. 冗余的循环变量自增:
    for 循环中的i += 1和j += 1完全多余,for 循环会自动迭代变量,这些语句不影响逻辑但增加代码冗余。

修复方案

  1. 移除多余的随机数调用:
    删除 main 函数中level = get_level()后的generate_integer(level)语句。

  2. 修正 get_level 函数逻辑:
    重构函数,确保输入无效时直接重新提示:

    def get_level():
        while True:
            try:
                level = int(input())
                if 1 <= level <= 3:
                    return level
            except ValueError:
                pass
            # 输入无效时自动循环,重新提示
    
  3. 删除冗余代码:
    移除 for 循环中的i += 1和j += 1语句。

内容的提问来源于stack exchange,提问作者TravisP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:19:58