陳圣磊 劉林源
摘要:C語(yǔ)言程序設(shè)計(jì)是計(jì)算機(jī)相關(guān)專業(yè)的一門(mén)重要課程,但是在實(shí)際教學(xué)中該課程的教學(xué)效果并不能令人滿意。本文認(rèn)為學(xué)生沒(méi)有掌握調(diào)試技術(shù)是根本的原因。因此,本文討論了如何在C語(yǔ)言程序設(shè)計(jì)的各部分內(nèi)容中使用調(diào)試技術(shù)加深學(xué)生的理解,從而培養(yǎng)學(xué)生獨(dú)立調(diào)試程序的能力,提高編寫(xiě)程序的興趣。
關(guān)鍵詞:程序設(shè)計(jì);調(diào)試;C語(yǔ)言
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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語(yǔ)言程序設(shè)計(jì)是計(jì)算機(jī)相關(guān)專業(yè)的一門(mén)重要課程,它能讓學(xué)生理解程序設(shè)計(jì)中流程控制、模塊化設(shè)計(jì)的概念,為后續(xù)課程奠定基礎(chǔ)。大多數(shù)學(xué)校也對(duì)這門(mén)課程給予了足夠的重視,設(shè)置了較多的學(xué)分和學(xué)時(shí)。但是在實(shí)際教學(xué)中,這門(mén)課程的教學(xué)效果并不令人滿意,學(xué)生普遍反映這門(mén)課程的內(nèi)容較難掌握,老師總是覺(jué)得自己盡了最大努力,卻不能取得令人滿意的效果。
根據(jù)近年來(lái)講授C語(yǔ)言程序設(shè)計(jì)這門(mén)課程的觀察,筆者發(fā)現(xiàn)妨礙學(xué)生掌握程序設(shè)計(jì)能力的原因在于沒(méi)有掌握調(diào)試技術(shù),學(xué)生不能把自己所寫(xiě)的程序調(diào)試正確。這會(huì)使學(xué)生在編寫(xiě)程序時(shí)沒(méi)有成就感,慢慢對(duì)編寫(xiě)程序失去興趣。因此學(xué)生在學(xué)完這門(mén)課程后,讀程序仍然非常吃力,當(dāng)然也不能熟練地編寫(xiě)程序了。
許多教育工作者已經(jīng)意識(shí)到調(diào)試技術(shù)的掌握對(duì)于提高教學(xué)效果的重要作用,黎自強(qiáng)等[1]探討了宏getch()在程序調(diào)試中的應(yīng)用,謝紅霞等[2]強(qiáng)調(diào)了程序調(diào)試在C程序設(shè)計(jì)教學(xué)中的重要性,潘黎陽(yáng)[3]探討了讓高職高專院校中的學(xué)生學(xué)好C語(yǔ)言程序設(shè)計(jì)這門(mén)課程的方法,吳奇英[4]闡述了C語(yǔ)言程序設(shè)計(jì)中的調(diào)試技術(shù),宋雅娟等[5]提出如何使用調(diào)試工具輔助C語(yǔ)言程序設(shè)計(jì)的教學(xué)。本文認(rèn)為調(diào)試技術(shù)不應(yīng)該僅僅被看做是教學(xué)內(nèi)容的一部分,而是應(yīng)該貫穿于C程序設(shè)計(jì)教學(xué)的始終。因此,本文闡述了VC++6.0中的調(diào)試技術(shù)在變量的存儲(chǔ)、程序的流程控制、數(shù)組以及函數(shù)的調(diào)用中如何加深學(xué)生的理解。通過(guò)讓學(xué)生掌握調(diào)試技術(shù),培養(yǎng)學(xué)生獨(dú)立調(diào)試程序的能力,提高編寫(xiě)程序的興趣。
1 變量的存儲(chǔ)
變量的概念以及數(shù)據(jù)如何在變量中存儲(chǔ)是在C程序設(shè)計(jì)教學(xué)中的第一個(gè)難點(diǎn)。學(xué)生需要理解變量是計(jì)算機(jī)內(nèi)存中的一段存儲(chǔ)空間,這樣才能理解數(shù)據(jù)的各種存儲(chǔ)形式以及變量的賦值等操作。在實(shí)際教學(xué)中,我們可以通過(guò)調(diào)試技術(shù)讓學(xué)生“看見(jiàn)”內(nèi)存中的存儲(chǔ)空間是如何存儲(chǔ)數(shù)據(jù)、以何種形式存儲(chǔ)數(shù)據(jù)的,從而加深對(duì)變量的理解。
比如,對(duì)于程序片段,
int a;
a=4;
a=-5;
我們?cè)诘?行程序上設(shè)置斷點(diǎn),然后按F5鍵進(jìn)入調(diào)試模式,單擊Debug工具欄中的Memory按鈕打開(kāi)Memory窗口,在Address后面填寫(xiě)&a后按回車鍵,這里需要給學(xué)生解釋&a表示變量a的地址,那么在第2行程序執(zhí)行之前、第2行執(zhí)行后、第3行執(zhí)行前,我們觀察到的Memory窗口如圖1所示。
程序的第一行聲明了變量a,我們觀察到在圖1(1)中變量a的地址為十六進(jìn)制的0018FF40,變量a就是從0018FF40開(kāi)始的四個(gè)字節(jié)的存儲(chǔ)空間。由于a未初始化,其值為CCCCCCCC,這是一個(gè)我們無(wú)法預(yù)期的值。由于a占4個(gè)字節(jié),所以共有8個(gè)十六進(jìn)制位。第2行執(zhí)行后,我們看到圖1(2)中的紅色部分表示的a值為04000000。需要注意的是,存儲(chǔ)數(shù)據(jù)時(shí)先使用低地址字節(jié),再使用高地址字節(jié)。由于4為正數(shù),所以在內(nèi)存中存儲(chǔ)的就是4的二進(jìn)制。當(dāng)執(zhí)行第3行后,變量a的空間中的值變?yōu)镕BFFFFFF。由于-5為負(fù)數(shù),所以需要先轉(zhuǎn)化為補(bǔ)碼。5的二進(jìn)制位為101,不考慮符號(hào)位時(shí)在4字節(jié)空間中取反為111 1111 1111 1111 1111 1111 1111 1010,加1后為111 1111 1111 1111 1111 1111 1111 1011,在符號(hào)位設(shè)置1后,整個(gè)數(shù)據(jù)變?yōu)?111 1111 1111 1111 1111 1111 1111 1011。那么轉(zhuǎn)化為十六進(jìn)制,就是FF FF FF FB。在內(nèi)存中先存低字節(jié),再存高字節(jié),即為FB FF FF FF。
2 程序流程控制
程序的流程控制包括順序、分支和循環(huán)三種結(jié)構(gòu),其中后面兩種是同學(xué)們?nèi)菀壮鲥e(cuò)的,尤其是當(dāng)分支和循環(huán)結(jié)合在一起時(shí),同學(xué)們更不容易理清程序的執(zhí)行過(guò)程。要想解決這些問(wèn)題,必須讓學(xué)生理解每種結(jié)構(gòu)的執(zhí)行過(guò)程,并且要掌握得非常熟練,這樣在閱讀復(fù)雜的程序時(shí)才不會(huì)出錯(cuò)。那么,如何讓學(xué)生深入理解每種結(jié)構(gòu)的執(zhí)行過(guò)程呢?單步調(diào)試程序?yàn)槲覀兲峁┝艘环N“看清”程序執(zhí)行過(guò)程的方式,通過(guò)單步調(diào)試,就能讓學(xué)生理解程序是如何一步一步執(zhí)行的,多加練習(xí),就能理解程序的執(zhí)行過(guò)程。
在此,我們以判斷素?cái)?shù)為例。判斷素?cái)?shù)是C程序設(shè)計(jì)中的一個(gè)典型例題,它結(jié)合了順序、分支和循環(huán)三種結(jié)構(gòu),并且包含了循環(huán)的中斷結(jié)束,需要在循環(huán)結(jié)束后根據(jù)不同的結(jié)束條件進(jìn)行判斷處理。程序片段如下:
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按鈕,可以打開(kāi)變量窗口,能夠看到當(dāng)前程序中變量的值,如圖2。單擊Debug工具欄中的Step Over按鈕可以單步執(zhí)行,此時(shí)可以觀察程序中變量的變化情況。當(dāng)程序輸入為13時(shí),我們可以觀察到循環(huán)變量i從2到12,循環(huán)體中的if條件均不成立,因此當(dāng)i=13時(shí)循環(huán)結(jié)束。循環(huán)后面的if條件不成立,所以輸出It is a prime number。當(dāng)程序輸入為15時(shí),可以觀察到i=2時(shí),循環(huán)中的if條件不成立,所以執(zhí)行i++,然后進(jìn)行下一次循環(huán)。i=3時(shí),條件成立,執(zhí)行break退出循環(huán)。循環(huán)后面的if條件成立,所以輸出It is not a prime number。 3 利用數(shù)組處理批量數(shù)據(jù) 數(shù)組能夠存儲(chǔ)、處理一批數(shù)據(jù),這些數(shù)據(jù)具有相同的類型和不同的含義,數(shù)組中的元素能夠通過(guò)下標(biāo)這一統(tǒng)一的方式訪問(wèn)。所以,數(shù)組是一種處理批量數(shù)據(jù)的方式。數(shù)組的這一功能需要通過(guò)循環(huán)來(lái)實(shí)現(xiàn)。從另外一個(gè)角度講,我們也可以認(rèn)為學(xué)習(xí)了數(shù)組后,循環(huán)結(jié)構(gòu)能夠完成更多的任務(wù)。 在此,我們以求數(shù)組元素的平方為例來(lái)說(shuō)明單步調(diào)試中觀察數(shù)組的方法。代碼片段如下: int i, a[5]={3,2,5,7,9}; for(i=0;i<5;i++) a[i]=a[i]+3; 在第2行代碼設(shè)置斷點(diǎn),進(jìn)入單步調(diào)試后,打開(kāi)變量窗口,在底部點(diǎn)擊Locals選項(xiàng)卡,可以觀察到數(shù)組變量,這里L(fēng)ocal表示本函數(shù)中的局部變量。變量名a前面的符號(hào)+表示a是數(shù)組變量,單擊符號(hào)+后就能看到數(shù)組a的所有元素,如圖3所示。當(dāng)單步運(yùn)行時(shí),就可以觀察到變量i和數(shù)組a中元素的變化情況。 4 函數(shù)的使用 函數(shù)體現(xiàn)了C語(yǔ)言中的模塊化程序設(shè)計(jì)思想,通過(guò)函數(shù)定義,可以封裝某一特定的功能,在需要使用這個(gè)功能的時(shí)候只要調(diào)用該函數(shù)即可。在調(diào)用函數(shù)時(shí),只需要了解函數(shù)的功能、參數(shù)和返回值,不需要關(guān)注函數(shù)是如何實(shí)現(xiàn)的。而在定義函數(shù)時(shí),要考慮函數(shù)的對(duì)外接口(即參數(shù)與返回值)和函數(shù)功能的實(shí)現(xiàn)。 在實(shí)際教學(xué)中,學(xué)生往往容易混淆函數(shù)的定義和調(diào)用,混淆實(shí)際參數(shù)和形式參數(shù)。這些概念也可以通過(guò)單步調(diào)試來(lái)加深理解。 在此,我們以求最大值函數(shù)為例來(lái)說(shuō)明,程序代碼如下: #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);上設(shè)置斷點(diǎn),進(jìn)入單步調(diào)試模式,這時(shí)需要在Debug工具欄上單擊Step Into按鈕,它的作用是進(jìn)入當(dāng)前行程序中的函數(shù)。單擊后,我們發(fā)現(xiàn)表示當(dāng)前程序暫停位置的黃色箭頭停在了add函數(shù)定義的第一行。這時(shí)我們也可以單擊Debug工具欄上的Call Stack(調(diào)用堆棧)按鈕,打開(kāi)Call Stack窗口,可以看到main函數(shù)中第8行調(diào)用了add函數(shù),如圖4所示。程序在add函數(shù)中執(zhí)行時(shí),我們可以單擊Step Over按鈕觀察Variable窗口中局部變量的變化情況。當(dāng)黃色箭頭停在add函數(shù)最后一行時(shí),再點(diǎn)擊Step Over,黃色箭頭就又回到行c=add(a,b);上,表示函數(shù)調(diào)用結(jié)束,返回調(diào)用的地方繼續(xù)執(zhí)行。如果在add函數(shù)中想直接返回調(diào)用點(diǎn),也可以單擊Step Out按鈕。 5 結(jié)束語(yǔ) 通過(guò)程序調(diào)試技術(shù),我們可以深入地觀察變量的存儲(chǔ)、程序的流程控制、數(shù)組以及函數(shù)的調(diào)用。由于篇幅的限制,我們省去了如何在指針以及鏈表中利用調(diào)試技術(shù)加深理解。 當(dāng)學(xué)生慢慢學(xué)會(huì)使用調(diào)試工具后,就能自己發(fā)現(xiàn)程序中的錯(cuò)誤,并把程序調(diào)試正確。在這個(gè)過(guò)程中,學(xué)生能夠解決問(wèn)題,也增強(qiáng)了調(diào)試程序的信心,提高了編寫(xiě)程序的興趣。當(dāng)學(xué)生掌握了獨(dú)立調(diào)試程序的能力后,老師也不用在實(shí)驗(yàn)課上再疲于奔命給學(xué)生找錯(cuò)誤了。因此,掌握程序調(diào)試技術(shù)對(duì)于教學(xué)雙方都能起到事半功倍的效果。 當(dāng)然,調(diào)試過(guò)程中還有很多技巧和經(jīng)驗(yàn),需要學(xué)生反復(fù)琢磨,在實(shí)踐中慢慢提高。只有學(xué)會(huì)了程序調(diào)試,才能獨(dú)立解決程序中的錯(cuò)誤,才算是真正學(xué)會(huì)了編寫(xiě)程序。 參考文獻(xiàn): [1] 黎自強(qiáng),羅翠英. C語(yǔ)言程序設(shè)計(jì)和調(diào)試的探討[J]. 計(jì)算機(jī)教育,2009(12):96-97. [2] 謝紅霞,羅國(guó)明. 吳紅梅,基于程序調(diào)試的C程序設(shè)計(jì)教學(xué)與實(shí)踐[J]. 信息技術(shù),2011(11):174-176. [3] 潘黎陽(yáng). 《C語(yǔ)言程序設(shè)計(jì)》教學(xué)改革探討[J]. 電腦知識(shí)與技術(shù),2015,11(12):141-142. [4] 吳奇英. 淺談C語(yǔ)言程序設(shè)計(jì)調(diào)試技術(shù)[J]. 哈爾濱職業(yè)技術(shù)學(xué)院學(xué)報(bào),2008(1):111-112. [5] 宋雅娟,邊晶. VC++6.0調(diào)試方法在C語(yǔ)言程序設(shè)計(jì)中教學(xué)的應(yīng)用[J]. 長(zhǎng)春大學(xué)學(xué)報(bào),2008,18(3):61-64.