Debug演示教学法在C程序设计教学中的应用
2019-07-08廖国富
廖国富
摘 要: 针对实际教学中初学C程序设计理解困难、调试能力弱的问题,提出Debug演示教学法,在课堂教学中反复应用,可以做到透彻的讲解,使学生更易理解核心概念,提升调试能力。
关键词: C程序设计; Debug; 演示; 教学法
中图分类号:G642 文献标志码:A 文章编号:1006-8228(2019)05-74-03
Abstract: Aiming at the problems of difficult understanding and weak debugging ability that C programming beginners are faced with, this paper puts forward the Debug demonstration teaching method. Repeatedly using it in classroom teaching can achieve understandable explanations, making students easier to grasp the core concepts and improve debugging ability.
Key words: C programming; Debug; demonstration; teaching method
0 引言
C语言是主流的编程语言,即使是近十年,C语言也一直处于TIOBE编程语言排行榜TOP2的位置。C语言在程序设计语言中的地位就像是钢琴在乐器中的地位,是程序设计语言之王,很多高级语言都有C语言的影子。目前,绝大部分工学专业选择C语言作为编程类通识课程选修课,计算机类、电子类专业选择C语言作为专业基础课程[1],力求培养学生良好的程序分析、编写、调试能力,为后续课程的学习打下良好的基础。
但是,在实际教学中,教学效果往往并不理想,主要表现为学生基本知识和技能掌握不牢,灵活应用的能力较差。笔者认为主要原因在于没有深入理解核心概念,教学中没能重视Debug调试工具的演示和剖析其重要作用,大部分教材也没有“调试技巧”章节。犯错、排错是学习程序设计的必由之路,调试程序是教学的重要组成部分,应该贯穿于C程序设计教学的始终[2]。反复应用Debug演示教学法,可以有效解决上述问题,明显改善教学效果。
1 Debug演示教学法
1.1 基本含义
学习C程序设计,先要分析问题,编写源程序,然后在集成编程环境(IDE)中编辑、编译、生成、运行。在通过编译、生成阶段后,Debug调试往往是纠正程序逻辑错误的必要步骤。用Debug就可以进行动态调试,深入分析程序流程执行情况和关键变量的值变化情况。以Visual C++为例,Debug的主要功能有单步进入(F11)、单步跳过(F10)等。
Debug演示教学法即教师借助Debug调试工具把典型的程序例子简单明了地演示给学生,通过观察流程执行情况和关键变量的值,揭示程序设计概念、原理的本质,帮助学生加深对概念、原理的理解。
1.2 作用和价值
用Debug演示教学法,能让学生清清楚楚的看到代码执行的全过程,每一步的执行效果,变量值如何变化的,都明明白白[3]。不停留在表面的代码上,而是让学生透彻理解核心概念,这样才能让学生灵活运用基础知识和基本技能进行编程。
用Debug演示教学法,不但可以增强学生的感性认识,正确理解概念,还可以充分调动学生的学习积极性,提高学生学习兴趣,活跃课堂气氛,有利于学生观察、分析、调试能力的培养。
2 用Debug演示教学法讲解C语言的几个核心概念
2.1 三种基本结构
顺序、分支和循环三种基本结构是任何一门程序设计语言的基础。虽然画流程图、写伪代码、读程序都是常用的讲解程序流程的具体方法,但是它们都不如Debug调试程序来得直接、深入、透彻。要让初学者真正的理解程序流程,最好在流程图讲解之后再演示一下程序执行的全过程,用单步跳过(F10)执行,学生一看就能明白程序是如何一步一步执行的,再多加练习,就能理解程序的执行过程了。
例如,编程实现,输入一个年份,判断是否闰年。如图1所示,在程序编辑、编译、生成、执行都完成后,再用单步跳过(F10)执行,代码窗口中,黄色箭头指示的就是当前代码行,此时,变量year的值已经通过scanf()函数输入,是2000。&year是year的地址,值是0x0019ff3c。接着,按F10,程序执行当前行,也就是if语句,判断,是闰年,可以看到,黄箭头指向下一行待执行的代码,运行结果及时输出到控制台。
类似的,对于for循环,重点演示循环控制变量是如何变化的,对于while循环,则重点演示循环条件是如何变化的,这样就可以做到一目了然。
2.2 数组
数组是C语言的一个难点。数组就是,用同一个数组变量名字,引用批量的同类型数据,不同的数组元素用数组变量名字加不同的下标来引用。很多学生对组数的基本概念和基本操作理解不透,主要原因就是不理解数组中各元素在内存中是连续分配的。
冒泡排序是数组应用的典型例子,用Debug演示,不但可以把排序的过程看明白,还可以把数组元素的变化看明白。如图2所示,数组f未赋值之前,每一個数组元素的值都是未确定的,只有数组f的地址是确定的:0x0019ff08。值-858993460只是Debug模式下编译器对未初始化的变量赋的缺省值。接下来,按F10,执行了int f[]={2,1,9,10,17,6,7,5,12,4};这一行,数组的各元素值如图3所示。显然,每一个数组元素分量都是按顺序排列的,用同一个名字f,不同的下标0,1,2,3,…来引用。
2.3 函数与递归
函数也是C语言的难点。如:调用函数时,程序流程是如何跳转的;调用函数时,实际参数是如何传递给形式参数的;为什么数组作为参数就是传地址呢。
如图4、图5所示,借助Debug,可以看到,在main()函数中,当程序执行到BubbleSort(f);按F11,程序流程跳转到函数BubbleSort(int a[])里执行。实际参数f和形式参数a,值都是0x0019ff14。这是一个地址,是数组f的地址,这样,就很好理解。实际参数f传递给形式参数a的,就是这个地址。因此,在函数BubbleSort里任何对数组a的修改就意味着是对数组f的修改,对a[i]的改变就是对f[i]的改变。这样,就实现了本来无序的数组元素,进入函数BubbleSort后,经过排序后,变成了有序的数组元素,而这个结果是“带出”到函数BubbleSort之外了,数据的传递“感觉上”是双向的,实际上还是单向的,只是不同的是传递的是地址。不像普通的传值参数,是单向的,传值的形式参数也只是一个局部变量而已,你要想返回值,必须用return來返回。这样,学生就容易理解并区分两种参数传递方式的基本原理。
递归是函数定义和调用的一种特例[4]。用Debug演示,通过逐语句的执行,可以观察到递归调用的全过程。另外,用Call Stack工具也可以清晰地显示出各个函数之间的调用顺序。
除了上述核心概念外,指针是最难理解的。应用Debug,也可以很好的理解指针就是地址。
3 应用Debug演示教学法需注意的几个问题
⑴ 用实际的、有趣的例子,循序渐进,不断迭代,用不同的知识技能不断改写程序。学生既通过不断获得小小的成就感来增强自信,培养兴趣,又通过不断解决难度加大的问题来提升编程能力。
⑵ 演示要不紧不慢,严谨细致,讲解要切中要害。
⑶ 单个演示时间不宜太长,太冗长的演示会让学生的注意力明显下降。但是,演示的目的是让学生看明白,必要时可以重复演示。一定要给学生留够时间练习强化。
⑷ 可用设置断点(Breakpoint)、Memory、Wactch等多种技巧和工具来观察关键变量的值[5]。也可在程序中适当的地方插入printf函数来输出关键变量的动态值。
⑸ 注意在演示教学中培养学生良好的编码习惯,良好的编码习惯才能锻炼出优秀的程序设计能力[6]。
⑹ 如果作为专业基础课,要注意适当的结合计算机的基本原理和编译程序的基本原理来讲解。
4 结束语
本文在提出Debug演示教学法的含义、作用和价值的基础上,阐述了具体应用它来讲解C程序设计核心概念的教学实践要点,最后对需注意的问题进行了总结。Debug演示教学法能让讲解更加生动直观,让初学者更易理解,分析、调试的能力明显提升。不言而喻,Debug演示教学法还可以推广到Java、Python等其他程序设计语言的教学中。
参考文献(References):
[1] 闯跃龙.C语言、VB还是 Python?—谈高校非计算机专业学生编程入门课程选择[J].计算机教育,2018.7:32-34
[2] 陈圣磊,刘林源.调试技术在C语言程序设计教学中的作用探讨[J].电脑知识与技术,2015.11(24):80-82
[3] 岳俊梅.单步运行调试技术在C++语言教学中的重要性研究[J].计算机教育,2008.4:91-93
[4] 郑晓健.C语言程序设计(第2版)[M].清华大学出版社,2017.
[5] 王洋.浅谈调试技术在非计算机专业的C语言程序设计教学中的应用[J].教育教学论坛,2016.10(42):177-178
[6] 文艾,陈卫卫.高效程序设计的七个习惯[J].计算机教育,2017.4:41-42