廖國(guó)富
摘? 要: 針對(duì)實(shí)際教學(xué)中初學(xué)C程序設(shè)計(jì)理解困難、調(diào)試能力弱的問(wèn)題,提出Debug演示教學(xué)法,在課堂教學(xué)中反復(fù)應(yīng)用,可以做到透徹的講解,使學(xué)生更易理解核心概念,提升調(diào)試能力。
關(guān)鍵詞: C程序設(shè)計(jì); Debug; 演示; 教學(xué)法
中圖分類(lèi)號(hào):G642? ? ? ? ? 文獻(xiàn)標(biāo)志碼:A? ? ?文章編號(hào):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語(yǔ)言是主流的編程語(yǔ)言,即使是近十年,C語(yǔ)言也一直處于TIOBE編程語(yǔ)言排行榜TOP2的位置。C語(yǔ)言在程序設(shè)計(jì)語(yǔ)言中的地位就像是鋼琴在樂(lè)器中的地位,是程序設(shè)計(jì)語(yǔ)言之王,很多高級(jí)語(yǔ)言都有C語(yǔ)言的影子。目前,絕大部分工學(xué)專(zhuān)業(yè)選擇C語(yǔ)言作為編程類(lèi)通識(shí)課程選修課,計(jì)算機(jī)類(lèi)、電子類(lèi)專(zhuān)業(yè)選擇C語(yǔ)言作為專(zhuān)業(yè)基礎(chǔ)課程[1],力求培養(yǎng)學(xué)生良好的程序分析、編寫(xiě)、調(diào)試能力,為后續(xù)課程的學(xué)習(xí)打下良好的基礎(chǔ)。
但是,在實(shí)際教學(xué)中,教學(xué)效果往往并不理想,主要表現(xiàn)為學(xué)生基本知識(shí)和技能掌握不牢,靈活應(yīng)用的能力較差。筆者認(rèn)為主要原因在于沒(méi)有深入理解核心概念,教學(xué)中沒(méi)能重視Debug調(diào)試工具的演示和剖析其重要作用,大部分教材也沒(méi)有“調(diào)試技巧”章節(jié)。犯錯(cuò)、排錯(cuò)是學(xué)習(xí)程序設(shè)計(jì)的必由之路,調(diào)試程序是教學(xué)的重要組成部分,應(yīng)該貫穿于C程序設(shè)計(jì)教學(xué)的始終[2]。反復(fù)應(yīng)用Debug演示教學(xué)法,可以有效解決上述問(wèn)題,明顯改善教學(xué)效果。
1 Debug演示教學(xué)法
1.1 基本含義
學(xué)習(xí)C程序設(shè)計(jì),先要分析問(wèn)題,編寫(xiě)源程序,然后在集成編程環(huán)境(IDE)中編輯、編譯、生成、運(yùn)行。在通過(guò)編譯、生成階段后,Debug調(diào)試往往是糾正程序邏輯錯(cuò)誤的必要步驟。用Debug就可以進(jìn)行動(dòng)態(tài)調(diào)試,深入分析程序流程執(zhí)行情況和關(guān)鍵變量的值變化情況。以Visual C++為例,Debug的主要功能有單步進(jìn)入(F11)、單步跳過(guò)(F10)等。
Debug演示教學(xué)法即教師借助Debug調(diào)試工具把典型的程序例子簡(jiǎn)單明了地演示給學(xué)生,通過(guò)觀察流程執(zhí)行情況和關(guān)鍵變量的值,揭示程序設(shè)計(jì)概念、原理的本質(zhì),幫助學(xué)生加深對(duì)概念、原理的理解。
1.2 作用和價(jià)值
用Debug演示教學(xué)法,能讓學(xué)生清清楚楚的看到代碼執(zhí)行的全過(guò)程,每一步的執(zhí)行效果,變量值如何變化的,都明明白白[3]。不停留在表面的代碼上,而是讓學(xué)生透徹理解核心概念,這樣才能讓學(xué)生靈活運(yùn)用基礎(chǔ)知識(shí)和基本技能進(jìn)行編程。
用Debug演示教學(xué)法,不但可以增強(qiáng)學(xué)生的感性認(rèn)識(shí),正確理解概念,還可以充分調(diào)動(dòng)學(xué)生的學(xué)習(xí)積極性,提高學(xué)生學(xué)習(xí)興趣,活躍課堂氣氛,有利于學(xué)生觀察、分析、調(diào)試能力的培養(yǎng)。
2 用Debug演示教學(xué)法講解C語(yǔ)言的幾個(gè)核心概念
2.1 三種基本結(jié)構(gòu)
順序、分支和循環(huán)三種基本結(jié)構(gòu)是任何一門(mén)程序設(shè)計(jì)語(yǔ)言的基礎(chǔ)。雖然畫(huà)流程圖、寫(xiě)偽代碼、讀程序都是常用的講解程序流程的具體方法,但是它們都不如Debug調(diào)試程序來(lái)得直接、深入、透徹。要讓初學(xué)者真正的理解程序流程,最好在流程圖講解之后再演示一下程序執(zhí)行的全過(guò)程,用單步跳過(guò)(F10)執(zhí)行,學(xué)生一看就能明白程序是如何一步一步執(zhí)行的,再多加練習(xí),就能理解程序的執(zhí)行過(guò)程了。
例如,編程實(shí)現(xiàn),輸入一個(gè)年份,判斷是否閏年。如圖1所示,在程序編輯、編譯、生成、執(zhí)行都完成后,再用單步跳過(guò)(F10)執(zhí)行,代碼窗口中,黃色箭頭指示的就是當(dāng)前代碼行,此時(shí),變量year的值已經(jīng)通過(guò)scanf()函數(shù)輸入,是2000。&year是year的地址,值是0x0019ff3c。接著,按F10,程序執(zhí)行當(dāng)前行,也就是if語(yǔ)句,判斷,是閏年,可以看到,黃箭頭指向下一行待執(zhí)行的代碼,運(yùn)行結(jié)果及時(shí)輸出到控制臺(tái)。
類(lèi)似的,對(duì)于for循環(huán),重點(diǎn)演示循環(huán)控制變量是如何變化的,對(duì)于while循環(huán),則重點(diǎn)演示循環(huán)條件是如何變化的,這樣就可以做到一目了然。
2.2 數(shù)組
數(shù)組是C語(yǔ)言的一個(gè)難點(diǎn)。數(shù)組就是,用同一個(gè)數(shù)組變量名字,引用批量的同類(lèi)型數(shù)據(jù),不同的數(shù)組元素用數(shù)組變量名字加不同的下標(biāo)來(lái)引用。很多學(xué)生對(duì)組數(shù)的基本概念和基本操作理解不透,主要原因就是不理解數(shù)組中各元素在內(nèi)存中是連續(xù)分配的。
冒泡排序是數(shù)組應(yīng)用的典型例子,用Debug演示,不但可以把排序的過(guò)程看明白,還可以把數(shù)組元素的變化看明白。如圖2所示,數(shù)組f未賦值之前,每一個(gè)數(shù)組元素的值都是未確定的,只有數(shù)組f的地址是確定的:0x0019ff08。值-858993460只是Debug模式下編譯器對(duì)未初始化的變量賦的缺省值。接下來(lái),按F10,執(zhí)行了int f[]={2,1,9,10,17,6,7,5,12,4};這一行,數(shù)組的各元素值如圖3所示。顯然,每一個(gè)數(shù)組元素分量都是按順序排列的,用同一個(gè)名字f,不同的下標(biāo)0,1,2,3,…來(lái)引用。
2.3 函數(shù)與遞歸
函數(shù)也是C語(yǔ)言的難點(diǎn)。如:調(diào)用函數(shù)時(shí),程序流程是如何跳轉(zhuǎn)的;調(diào)用函數(shù)時(shí),實(shí)際參數(shù)是如何傳遞給形式參數(shù)的;為什么數(shù)組作為參數(shù)就是傳地址呢。
如圖4、圖5所示,借助Debug,可以看到,在main()函數(shù)中,當(dāng)程序執(zhí)行到BubbleSort(f);按F11,程序流程跳轉(zhuǎn)到函數(shù)BubbleSort(int a[])里執(zhí)行。實(shí)際參數(shù)f和形式參數(shù)a,值都是0x0019ff14。這是一個(gè)地址,是數(shù)組f的地址,這樣,就很好理解。實(shí)際參數(shù)f傳遞給形式參數(shù)a的,就是這個(gè)地址。因此,在函數(shù)BubbleSort里任何對(duì)數(shù)組a的修改就意味著是對(duì)數(shù)組f的修改,對(duì)a[i]的改變就是對(duì)f[i]的改變。這樣,就實(shí)現(xiàn)了本來(lái)無(wú)序的數(shù)組元素,進(jìn)入函數(shù)BubbleSort后,經(jīng)過(guò)排序后,變成了有序的數(shù)組元素,而這個(gè)結(jié)果是“帶出”到函數(shù)BubbleSort之外了,數(shù)據(jù)的傳遞“感覺(jué)上”是雙向的,實(shí)際上還是單向的,只是不同的是傳遞的是地址。不像普通的傳值參數(shù),是單向的,傳值的形式參數(shù)也只是一個(gè)局部變量而已,你要想返回值,必須用return來(lái)返回。這樣,學(xué)生就容易理解并區(qū)分兩種參數(shù)傳遞方式的基本原理。
遞歸是函數(shù)定義和調(diào)用的一種特例[4]。用Debug演示,通過(guò)逐語(yǔ)句的執(zhí)行,可以觀察到遞歸調(diào)用的全過(guò)程。另外,用Call Stack工具也可以清晰地顯示出各個(gè)函數(shù)之間的調(diào)用順序。
除了上述核心概念外,指針是最難理解的。應(yīng)用Debug,也可以很好的理解指針就是地址。
3 應(yīng)用Debug演示教學(xué)法需注意的幾個(gè)問(wèn)題
⑴ 用實(shí)際的、有趣的例子,循序漸進(jìn),不斷迭代,用不同的知識(shí)技能不斷改寫(xiě)程序。學(xué)生既通過(guò)不斷獲得小小的成就感來(lái)增強(qiáng)自信,培養(yǎng)興趣,又通過(guò)不斷解決難度加大的問(wèn)題來(lái)提升編程能力。
⑵ 演示要不緊不慢,嚴(yán)謹(jǐn)細(xì)致,講解要切中要害。
⑶ 單個(gè)演示時(shí)間不宜太長(zhǎng),太冗長(zhǎng)的演示會(huì)讓學(xué)生的注意力明顯下降。但是,演示的目的是讓學(xué)生看明白,必要時(shí)可以重復(fù)演示。一定要給學(xué)生留夠時(shí)間練習(xí)強(qiáng)化。
⑷ 可用設(shè)置斷點(diǎn)(Breakpoint)、Memory、Wactch等多種技巧和工具來(lái)觀察關(guān)鍵變量的值[5]。也可在程序中適當(dāng)?shù)牡胤讲迦雙rintf函數(shù)來(lái)輸出關(guān)鍵變量的動(dòng)態(tài)值。
⑸ 注意在演示教學(xué)中培養(yǎng)學(xué)生良好的編碼習(xí)慣,良好的編碼習(xí)慣才能鍛煉出優(yōu)秀的程序設(shè)計(jì)能力[6]。
⑹ 如果作為專(zhuān)業(yè)基礎(chǔ)課,要注意適當(dāng)?shù)慕Y(jié)合計(jì)算機(jī)的基本原理和編譯程序的基本原理來(lái)講解。
4 結(jié)束語(yǔ)
本文在提出Debug演示教學(xué)法的含義、作用和價(jià)值的基礎(chǔ)上,闡述了具體應(yīng)用它來(lái)講解C程序設(shè)計(jì)核心概念的教學(xué)實(shí)踐要點(diǎn),最后對(duì)需注意的問(wèn)題進(jìn)行了總結(jié)。Debug演示教學(xué)法能讓講解更加生動(dòng)直觀,讓初學(xué)者更易理解,分析、調(diào)試的能力明顯提升。不言而喻,Debug演示教學(xué)法還可以推廣到Java、Python等其他程序設(shè)計(jì)語(yǔ)言的教學(xué)中。
參考文獻(xiàn)(References):
[1] 闖躍龍.C語(yǔ)言、VB還是 Python?—談高校非計(jì)算機(jī)專(zhuān)業(yè)學(xué)生編程入門(mén)課程選擇[J].計(jì)算機(jī)教育,2018.7:32-34
[2] 陳圣磊,劉林源.調(diào)試技術(shù)在C語(yǔ)言程序設(shè)計(jì)教學(xué)中的作用探討[J].電腦知識(shí)與技術(shù),2015.11(24):80-82
[3] 岳俊梅.單步運(yùn)行調(diào)試技術(shù)在C++語(yǔ)言教學(xué)中的重要性研究[J].計(jì)算機(jī)教育,2008.4:91-93
[4] 鄭曉健.C語(yǔ)言程序設(shè)計(jì)(第2版)[M].清華大學(xué)出版社,2017.
[5] 王洋.淺談?wù){(diào)試技術(shù)在非計(jì)算機(jī)專(zhuān)業(yè)的C語(yǔ)言程序設(shè)計(jì)教學(xué)中的應(yīng)用[J].教育教學(xué)論壇,2016.10(42):177-178
[6] 文艾,陳衛(wèi)衛(wèi).高效程序設(shè)計(jì)的七個(gè)習(xí)慣[J].計(jì)算機(jī)教育,2017.4:41-42