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

CS50 Python课程Little Professor程序无法通过检查器求助

CS50《Python编程导论》Little Professor作业问题修复

我的代码

import random
import sys

# generate 10 math problems
def main():
    n = get_level()
    for _ in range(10):
        x, y = generate_integer(n)
        for i in range(3):
            try:
                answ = int(input(f"{x} + {y} = "))
            except ValueError:
                continue
            else:
                if answ == x + y:
                    break
                else:
                    print("EEE")
                    if i == 2:
                        print(f"{x} + {y} = {x+y}")
                    continue
    sys.exit()
            
# ask user for a number between 1 and 3: n
def get_level():
    while True:
        try:
            n = int(input("Level: "))
            if 0 < n < 4:
                return n
            else:
                raise ValueError
        except ValueError:
            continue
            
# generate values
# digits of x and y are == n
def generate_integer(level):
    min_value = 10**(level-1)
    max_value = 10**level - 1
    x = random.randint(min_value, max_value)
    y = random.randint(min_value, max_value)
    return x, y
        
if __name__ == "__main__":
    main()

检查器报错

:) professor.py exists
:) Little Professor rejects level of 0
:) Little Professor rejects level of 4
:) Little Professor rejects level of "one"
:) Little Professor accepts valid level
:( At Level 1, Little Professor generates addition problems using 0–9
    Did not find "6 + 6 =" in "Level: 7 + 7 =..."
:) At Level 2, Little Professor generates addition problems using 10–99
:) At Level 3, Little Professor generates addition problems using 100–999
:| Little Professor generates 10 problems before exiting
    can't check until a frown turns upside down
:| Little Professor displays number of problems correct
    can't check until a frown turns upside down
:| Little Professor displays EEE when answer is incorrect
    can't check until a frown turns upside down
:| Little Professor shows solution after 3 incorrect attempts
    can't check until a frown turns upside down

作业要求

Little Professor是David小时候的一款玩具,它会生成10道不同的数学题让用户解答。例如,玩具显示4 + 0 = 时,用户应该回答4;显示4 + 1 = 时,回答5。如果用户答错,玩具会显示EEE;同一道题连续答错3次后,玩具会直接显示正确答案(如4 + 0 = 4或4 + 1 = 5)。

请在professor.py文件中实现以下功能:

  • 提示用户输入难度等级n,如果用户输入的不是1、2或3,则重新提示。
  • 随机生成10道格式为X + Y = 的加法题,其中X和Y是n位非负整数,无需支持加法以外的运算。
  • 提示用户解答每道题:如果答案错误(或不是数字),输出EEE并重新提示,每道题最多允许尝试3次;若3次都答错,输出正确答案。
  • 最终输出用户的得分:10道题中答对的数量。

程序结构需遵循以下模板:

import random

def main():
    ...

def get_level():
    ...

def generate_integer(level):
    ...

if __name__ == "__main__":
    main()

问题分析与修复方案

1. Level 1生成的数字不符合要求

原代码中generate_integer函数对Level 1的处理是生成1-9的数字,但作业要求是0-9的非负整数。修改该函数:

def generate_integer(level):
    if level == 1:
        min_value = 0
    else:
        min_value = 10 ** (level - 1)
    max_value = 10 ** level - 1
    x = random.randint(min_value, max_value)
    y = random.randint(min_value, max_value)
    return x, y

2. 非数字输入未输出EEE

原代码捕获ValueError后直接continue,没有输出错误提示。需要在异常块中添加打印逻辑:

try:
    answ = int(input(f"{x} + {y} = "))
except ValueError:
    print("EEE")
    continue

3. 未统计并输出得分

在main函数中添加得分计数器,每答对一题加分,最后输出得分:

def main():
    n = get_level()
    score = 0  # 初始化得分计数器
    for _ in range(10):
        x, y = generate_integer(n)
        correct = False  # 标记是否答对本题
        for i in range(3):
            try:
                answ = int(input(f"{x} + {y} = "))
            except ValueError:
                print("EEE")
                continue
            else:
                if answ == x + y:
                    score += 1
                    correct = True
                    break
                else:
                    print("EEE")
        # 三次答错后显示正确答案
        if not correct:
            print(f"{x} + {y} = {x + y}")
    print(f"Score: {score}")  # 输出最终得分

4. 优化错误处理逻辑

将三次答错后的正确答案打印逻辑移到循环外,代码结构更清晰,避免嵌套判断。

修复后的完整代码

import random

def main():
    n = get_level()
    score = 0
    for _ in range(10):
        x, y = generate_integer(n)
        correct = False
        for _ in range(3):
            try:
                answer = int(input(f"{x} + {y} = "))
            except ValueError:
                print("EEE")
                continue
            if answer == x + y:
                score += 1
                correct = True
                break
            else:
                print("EEE")
        if not correct:
            print(f"{x} + {y} = {x + y}")
    print(f"Score: {score}")

def get_level():
    while True:
        try:
            level = int(input("Level: "))
            if level in (1, 2, 3):
                return level
        except ValueError:
            pass

def generate_integer(level):
    if level not in (1, 2, 3):
        raise ValueError
    if level == 1:
        min_val = 0
    else:
        min_val = 10 ** (level - 1)
    max_val = 10 ** level - 1
    return random.randint(min_val, max_val), random.randint(min_val, max_val)

if __name__ == "__main__":
    main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:54:53