【问题描述】3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
现有一个产生1000以内的完全数的程序,但是程序并没有按预期输出这些完全数,请使用pdb定位和修改错误。3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
预期结果:3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
[6,28,496]3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【题前思考】3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
根据问题描述,填写表11-2-1。3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表11-2-1 问题分析3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【解题思路】3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
通过pdb模块在源程序中指定位置设置断点,每次程序执行到断点时就暂停,可以通过命令查看此时各变量的值,如果这个值和预期值不同说明执行到此处时程序就已经出现了错误,就需要往前追查推测错误。如果循环次数太多,pdb可以设置条件断点,当满足某个条件时断点才起作用,这样可以减少暂停的次数,加快调试进度。3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【程序代码】3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【调试分析】3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
①:在PyCharm窗口底部的Terminal面板中使用cd命令将当前目录切换到被调试文件所在的目录。命令执行结果如图11-2-1所示。3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
图11-2-1 切换到“调试程序”目录3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
②:在Terminal中输入命令“python-m pdb a11_2_1使用pdb模块调试程序.py”启动pdb模块,从命令提示符“(pdb)”可以看出pdb已经开始运行,可以进行调试,如图11-2-2所示。命令中选项“-m pdb”表示执行pdb模块,“a11_2_1使用pdb模块调试程序.py”是要调试的程序文件,也是pdb模块的输入参数。3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
图11-2-2 进入pdb调试3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
③:在程序第7行即代码“if s==n:res.append(n)”处设置一个断点,观察每一次判断完全数时,s和n这两个变量的值具体是什么。其中命令“b7”表示在源代码第7行设置断点,从图11-2-3可以看出其断点号为1;命令“c”表示执行程序,直到遇到断点,命令“p n,s”表示显示变量n和s的值。3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
图11-2-3 在断点处显示变量n和s的值3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
④:因为我们已经知道6是完全数,所以可以在断点1设置一个条件断点,当n==6时才暂停执行,如图11-2-4所示。命令“condition 1 n==6”就表示在断点1设置条件n==6,即当n==6时才暂停程序执行。此时可以查看变量n和s的具体值。3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
图11-2-4 在条件断点处显示变量n和s的值3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
⑤:从图11-2-4可以看出,当n的值为6的时候,约数之和居然等于12而非实际的6,于是,我们找到了问题的关键,变量s的值计算错误。从源代码中我们可以看出,变量s只在程序开始时初始化为0,实际上应该在对每一个数求约数和之前都置初值0。如果不能确定错误,我们还需要执行命令c或其他命令继续执行查看断点的值,甚至重新设置其他断点查找问题。3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
【技术全貌】3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
除了在上述程序调试中遇到的命令外,pdb模块还提供了很多调试命令来帮助程序员调试程序,表11-2-2中仅列出了其中常见的一部分,全部命令及说明请扫描二维码查阅官网文档。3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
表11-2-2 pdb常用命令3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
续表3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
3FK100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库