廖國富



摘? 要: 針對實際教學中初學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