田立业,邵作浩,刘剑
海军潜艇学院
摘要:分析了在程序设计教学中何时讲授程序调试这一悖论,提出要化解这一悖论则不能将程序的设计和调试孤立,应当将他们有机穿插起来,并给出了教学示例。
关键词:程序调试,悖论,教学设计
一、引言
程序调试指排除程序中的错误,让程序能按照设计者所设想的方式运行的过程[1]。在程序设计或者编程语言类课程的教学中,程序调试是学员需要掌握的必备技能[2]。不论是作为IDE的使用方法,还是程序设计的相关知识,程序调试方法的教学都是课程中十分重要的环节。甚至有老师尝试以程序调试为主线来进行教学设计[3-4]。在这类课程中,关于程序调试的教学内容如何在教学中编排设计,存在逻辑上的悖论,这是教学中的一个难点。
二、程序调试悖论分析
程序调试通常是指在程序代码部分或全部完成编写后,开发者发现程序无法正常运行,或者虽然能够正常运行但是运行结果与预期不符的时候,使用IDE所提供的调试工具或方法技巧排除程序代码中存在的错误,使程序能够按照预期正常运行。
关于程序调试的教学存在这样一个逻辑悖论:在编排教学内容的时候,程序调试的内容安排在什么时机讲授?先教程序调试还是先教程序设计?如果先讲程序调试,那么所调试的程序是无中生有?如果先讲程序设计,那么如何不经调试就设计出好用的程序?这几个问题就像“先有蛋还是先有鸡”一样让人难以找到完美的标准答案。
在讲授程序调试方法的时候,教员必然会针对某一个程序或者程序中某一段代码来进行讲解演示,被调试的代码应当是由学员亲手编写的,这样才更有意义。而此时如果学员还没有学会程序设计,或者只学了少量程序设计的内容,他们是无法编写出一个稍微复杂、复杂到需要调试的程序的,所以学习程序调试是无从谈起的。如果先讲授程序设计,让学员能够编写出一个复杂到需要经过调试才能够正常运行的程序,那么对于未掌握调试方法的学员来说这也是一个不可能做到的伪命题。在教学中,教员似乎无法完美解决这一难题。
三、悖论的化解
笔者查阅了大量国内外讲授C语言程序设计的书籍、教材,虽然程序调试技能非常重要,但许多书本对此问题进行了回避,不去讲解程序调试的有关知识,仅有少量文献安排了有关程序调试的内容,所占篇幅也较小。文献[5]中在详细讲授程序设计之前安排了第2.4节为程序调试,首个示例是在MFC单文档程序View类OnDraw函数中进行的。而此时学员对OnDraw函数和View类的意义和用法是不掌握的,只能囫囵吞枣地尝试调试。文献[6]中安排了2.15节讲授调试输出,简述了几种调试信息输出和查看的方式,篇幅为1页。
化解这一悖论应把握两个原则,一是不回避问题,承认这是一个无法完美解决的悖论,转而寻找一种最优教学方式,即便对学员的洞察力和悟性有较高依赖;二是以学员的体验和感受为牵引,将程序设计和程序调试两部分教学内容有机结合并穿插起来,而不是以教学内容为牵引,将程序设计和程序调试分为不同的教学部分、安排在不同的章节。
四、教学过程设计
现在几乎所有的IDE都带有程序调试菜单和功能,本文以笔者在教学工作中使用的微软Visual Studio 2010为例探讨如何进行C++和VC程序调试教学,这是一个强大的Windows应用程序开发平台,许多高校的程序设计教学都以它作为开发环境,它提供了包括调试在内的丰富功能。
程序的错误和程序调试教学最好贯穿始终,从讲解数据类型和语法时就开始,从宏观上讲程序调试和程序设计两者应穿插并行开展,从微观上讲首次引入程序错误和程序调试概念应当在编写程序之后,两者紧密结合。
1、在讲授数据结构和C++语法时首次引入
①带领学员新建一个Win32控制台应用程序debug,在主函数_tmain中定义a、b两个整形变量:
int a=6;
int b=7
②点击“生成”菜单中的“生成debug”
③引导学员在输出窗口中查看错误提示:
\debug.cpp(11): error C2143: 语法错误 : 缺少“;”(在“return”的前面)
④讲解缺少分号这一语法错误的含义、错误提示中的行号、错误类型、运行程序时的现象、改错方法等。
⑤重新定义三个变量:
int a=6,b=7,c;
⑥生成“debug”,并按F5键启动调试,引导学员观察程序运行情况和提示:
\debug.cpp(10): warning C4101: “c”: 未引用的局部变量
⑦讲解“警告”的含义、对程序运行的影响、改进方法等。酌情演示另一种常见警告,也就是数据类型转换警告,代码如下:
int a=6,b=7;
float d;
d=a,b=d;
2、在学习循环语句时讲授断点的用法
①带领学员新建一个Win32控制台应用程序debug,计算0到10之间所有奇数之和,在return之前添加代码:
int a[5]={1,3,5,7,9},sum=0,loop;
for(loop=1;loop<=5;loop++)
sum=sum+a[loop];
printf("sum=%d",sum);
②运行程序,发现并没有得到设想的结果。此时引导学员思考如何剖析程序的运行过程,将光标分别移动到循环体和打印这两行,按下F9键,观察新增的红点并讲解断点的概念。按F5键启动调试,观察红点中的黄箭头、软件界面的变化,详细介绍自动窗口及其中内容。再次按F5键,观察箭头的移动、自动窗口内容的变化。反复按F5键,并讲解局部变量窗口和监视窗口中如何添加监视变量。
③依次点击调试菜单中的停止调试、删除所有断点、逐过程或逐语句,教会学员在无断点情况下如何使用调试窗口调试程序。
3、在讲授MFC程序设计之前,酌情讲解其他有关调试的常用方法
例如,内存观察窗口是默认不显示的,在调试时依次点击调试菜单中的窗口、内存,讲授内存窗口用法。又如,在调试状态下点击调试菜单中的快速监视,讲授快速监视的用法和调试菜单中的其他功能。
五、总结
教学设计1中将数据结构和语法知识与程序调试的知识技能较好融合,让学员在不知不觉中领会到了警告、语法错误的含义和应对方法。2中的断点在大型程序的设计过程中是必然使用的,必须在编写大型MFC程序之前让学员掌握其用法,此例还可以让学员直观地学会逻辑错误的含义,一举两得。笔者在程序设计课堂上将程序设计和程序调试两方面内容有机穿插进行,取得较好的效果,学员们在学习MFC程序设计之前就熟练掌握了调试方法,为编写复杂程序扫清了障碍。
参考文献
[1]刘模群. 基于Visual Basic的程序错误及调试技术. 电脑知识与技术,2018,14(34),pp62-63.
[2]谢红霞,罗国明,吴红梅. 基于程序调试的C程序设计教学与实践. 信息技术,2011,11, pp174-177.
[3]李夏君. 培养中职计算机专业学生程序调试能力的探析. 广东教育职教,2017,4,pp86.
[4]浦路平. 用程序调试器动态可视化运行程序进行程序设计教学的方法. 高教论坛,2016,1,pp57-59.
[5]马石安,魏文平. Visual C++程序设计与应用教程(第二版). 清华大学出版社,2011年3月.
[6]朱文伟. Visual C++2013从入门到精通. 清华大学出版社,2017年4月.