调试技术在C语言程序设计教学中的作用探讨

2015-11-17 12:05陈圣磊刘林源
电脑知识与技术 2015年24期
关键词:C语言程序设计调试

陈圣磊 刘林源

摘要:C语言程序设计是计算机相关专业的一门重要课程,但是在实际教学中该课程的教学效果并不能令人满意。本文认为学生没有掌握调试技术是根本的原因。因此,本文讨论了如何在C语言程序设计的各部分内容中使用调试技术加深学生的理解,从而培养学生独立调试程序的能力,提高编写程序的兴趣。

关键词:程序设计;调试;C语言

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)24-0080-03

Discussion of the Usefulness of Debug Techniques in Teaching of C Programming Language

CHEN Sheng-lei, LIU Lin-yuan

(Department of Electronic Commerce, Nanjing Audit University, Nanjing 211815, China)

Abstract:C programming language is an important course for computer related majors. However, the teaching effect of this course is not satisfying in practice. The paper argues the fundamental reason is that students did not master debug technique. Consequently, the paper discusses how to use debug techniques to deepen the students understanding of different part of C language. This could train the students capabilities to debug the program independently and increase the interests of programming.

Key words: Programming; Debug; C language

C语言程序设计是计算机相关专业的一门重要课程,它能让学生理解程序设计中流程控制、模块化设计的概念,为后续课程奠定基础。大多数学校也对这门课程给予了足够的重视,设置了较多的学分和学时。但是在实际教学中,这门课程的教学效果并不令人满意,学生普遍反映这门课程的内容较难掌握,老师总是觉得自己尽了最大努力,却不能取得令人满意的效果。

根据近年来讲授C语言程序设计这门课程的观察,笔者发现妨碍学生掌握程序设计能力的原因在于没有掌握调试技术,学生不能把自己所写的程序调试正确。这会使学生在编写程序时没有成就感,慢慢对编写程序失去兴趣。因此学生在学完这门课程后,读程序仍然非常吃力,当然也不能熟练地编写程序了。

许多教育工作者已经意识到调试技术的掌握对于提高教学效果的重要作用,黎自强等[1]探讨了宏getch()在程序调试中的应用,谢红霞等[2]强调了程序调试在C程序设计教学中的重要性,潘黎阳[3]探讨了让高职高专院校中的学生学好C语言程序设计这门课程的方法,吴奇英[4]阐述了C语言程序设计中的调试技术,宋雅娟等[5]提出如何使用调试工具辅助C语言程序设计的教学。本文认为调试技术不应该仅仅被看做是教学内容的一部分,而是应该贯穿于C程序设计教学的始终。因此,本文阐述了VC++6.0中的调试技术在变量的存储、程序的流程控制、数组以及函数的调用中如何加深学生的理解。通过让学生掌握调试技术,培养学生独立调试程序的能力,提高编写程序的兴趣。

1 变量的存储

变量的概念以及数据如何在变量中存储是在C程序设计教学中的第一个难点。学生需要理解变量是计算机内存中的一段存储空间,这样才能理解数据的各种存储形式以及变量的赋值等操作。在实际教学中,我们可以通过调试技术让学生“看见”内存中的存储空间是如何存储数据、以何种形式存储数据的,从而加深对变量的理解。

比如,对于程序片段,

int a;

a=4;

a=-5;

我们在第2行程序上设置断点,然后按F5键进入调试模式,单击Debug工具栏中的Memory按钮打开Memory窗口,在Address后面填写&a后按回车键,这里需要给学生解释&a表示变量a的地址,那么在第2行程序执行之前、第2行执行后、第3行执行前,我们观察到的Memory窗口如图1所示。

程序的第一行声明了变量a,我们观察到在图1(1)中变量a的地址为十六进制的0018FF40,变量a就是从0018FF40开始的四个字节的存储空间。由于a未初始化,其值为CCCCCCCC,这是一个我们无法预期的值。由于a占4个字节,所以共有8个十六进制位。第2行执行后,我们看到图1(2)中的红色部分表示的a值为04000000。需要注意的是,存储数据时先使用低地址字节,再使用高地址字节。由于4为正数,所以在内存中存储的就是4的二进制。当执行第3行后,变量a的空间中的值变为FBFFFFFF。由于-5为负数,所以需要先转化为补码。5的二进制位为101,不考虑符号位时在4字节空间中取反为111 1111 1111 1111 1111 1111 1111 1010,加1后为111 1111 1111 1111 1111 1111 1111 1011,在符号位设置1后,整个数据变为1111 1111 1111 1111 1111 1111 1111 1011。那么转化为十六进制,就是FF FF FF FB。在内存中先存低字节,再存高字节,即为FB FF FF FF。

2 程序流程控制

程序的流程控制包括顺序、分支和循环三种结构,其中后面两种是同学们容易出错的,尤其是当分支和循环结合在一起时,同学们更不容易理清程序的执行过程。要想解决这些问题,必须让学生理解每种结构的执行过程,并且要掌握得非常熟练,这样在阅读复杂的程序时才不会出错。那么,如何让学生深入理解每种结构的执行过程呢?单步调试程序为我们提供了一种“看清”程序执行过程的方式,通过单步调试,就能让学生理解程序是如何一步一步执行的,多加练习,就能理解程序的执行过程。

在此,我们以判断素数为例。判断素数是C程序设计中的一个典型例题,它结合了顺序、分支和循环三种结构,并且包含了循环的中断结束,需要在循环结束后根据不同的结束条件进行判断处理。程序片段如下:

int i,n;

scanf("%d",&n);

for(i=2;i

{

if(n%i==0)

break;

}

if(i

printf("It is not a prime number.\n");

else

printf("It is a prime number.\n");

在Debug工具栏中单击Variable按钮,可以打开变量窗口,能够看到当前程序中变量的值,如图2。单击Debug工具栏中的Step Over按钮可以单步执行,此时可以观察程序中变量的变化情况。当程序输入为13时,我们可以观察到循环变量i从2到12,循环体中的if条件均不成立,因此当i=13时循环结束。循环后面的if条件不成立,所以输出It is a prime number。当程序输入为15时,可以观察到i=2时,循环中的if条件不成立,所以执行i++,然后进行下一次循环。i=3时,条件成立,执行break退出循环。循环后面的if条件成立,所以输出It is not a prime number。

3 利用数组处理批量数据

数组能够存储、处理一批数据,这些数据具有相同的类型和不同的含义,数组中的元素能够通过下标这一统一的方式访问。所以,数组是一种处理批量数据的方式。数组的这一功能需要通过循环来实现。从另外一个角度讲,我们也可以认为学习了数组后,循环结构能够完成更多的任务。

在此,我们以求数组元素的平方为例来说明单步调试中观察数组的方法。代码片段如下:

int i, a[5]={3,2,5,7,9};

for(i=0;i<5;i++)

a[i]=a[i]+3;

在第2行代码设置断点,进入单步调试后,打开变量窗口,在底部点击Locals选项卡,可以观察到数组变量,这里Local表示本函数中的局部变量。变量名a前面的符号+表示a是数组变量,单击符号+后就能看到数组a的所有元素,如图3所示。当单步运行时,就可以观察到变量i和数组a中元素的变化情况。

4 函数的使用

函数体现了C语言中的模块化程序设计思想,通过函数定义,可以封装某一特定的功能,在需要使用这个功能的时候只要调用该函数即可。在调用函数时,只需要了解函数的功能、参数和返回值,不需要关注函数是如何实现的。而在定义函数时,要考虑函数的对外接口(即参数与返回值)和函数功能的实现。

在实际教学中,学生往往容易混淆函数的定义和调用,混淆实际参数和形式参数。这些概念也可以通过单步调试来加深理解。

在此,我们以求最大值函数为例来说明,程序代码如下:

#include

int main()

{

int add(int x,int y);

int a,b,c;

scanf("%d,%d",&a,&b);

c=add(a,b);

printf("sum is %d\n",c);

return 0;}

int add(int x,int y)

{int z;

z=x+y;

return z;}

在行c=add(a,b);上设置断点,进入单步调试模式,这时需要在Debug工具栏上单击Step Into按钮,它的作用是进入当前行程序中的函数。单击后,我们发现表示当前程序暂停位置的黄色箭头停在了add函数定义的第一行。这时我们也可以单击Debug工具栏上的Call Stack(调用堆栈)按钮,打开Call Stack窗口,可以看到main函数中第8行调用了add函数,如图4所示。程序在add函数中执行时,我们可以单击Step Over按钮观察Variable窗口中局部变量的变化情况。当黄色箭头停在add函数最后一行时,再点击Step Over,黄色箭头就又回到行c=add(a,b);上,表示函数调用结束,返回调用的地方继续执行。如果在add函数中想直接返回调用点,也可以单击Step Out按钮。

5 结束语

通过程序调试技术,我们可以深入地观察变量的存储、程序的流程控制、数组以及函数的调用。由于篇幅的限制,我们省去了如何在指针以及链表中利用调试技术加深理解。

当学生慢慢学会使用调试工具后,就能自己发现程序中的错误,并把程序调试正确。在这个过程中,学生能够解决问题,也增强了调试程序的信心,提高了编写程序的兴趣。当学生掌握了独立调试程序的能力后,老师也不用在实验课上再疲于奔命给学生找错误了。因此,掌握程序调试技术对于教学双方都能起到事半功倍的效果。

当然,调试过程中还有很多技巧和经验,需要学生反复琢磨,在实践中慢慢提高。只有学会了程序调试,才能独立解决程序中的错误,才算是真正学会了编写程序。

参考文献:

[1] 黎自强,罗翠英. C语言程序设计和调试的探讨[J]. 计算机教育,2009(12):96-97.

[2] 谢红霞,罗国明. 吴红梅,基于程序调试的C程序设计教学与实践[J]. 信息技术,2011(11):174-176.

[3] 潘黎阳. 《C语言程序设计》教学改革探讨[J]. 电脑知识与技术,2015,11(12):141-142.

[4] 吴奇英. 浅谈C语言程序设计调试技术[J]. 哈尔滨职业技术学院学报,2008(1):111-112.

[5] 宋雅娟,边晶. VC++6.0调试方法在C语言程序设计中教学的应用[J]. 长春大学学报,2008,18(3):61-64.

猜你喜欢
C语言程序设计调试
基于Visual Studio Code的C语言程序设计实践教学探索
从细节入手,谈PLC程序设计技巧
基于C语言的计算机软件编程
基于航拍无人机的设计与调试
FOCAS功能在机床调试中的开发与应用
无线通信中频线路窄带临界调试法及其应用
高职高专院校C语言程序设计教学改革探索
调压柜的调试与试运行探讨
PLC梯形图程序设计技巧及应用
论子函数在C语言数据格式输出中的应用