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
相关产品推荐
相关产品推荐

