楊曉波 王勇 梁燕 黃宏程
【摘要】? ? 針對學生在程序設計訓練課程的學習過程中普遍存在的問題,提出在教學過程中要強化調試能力的訓練、引導學生模塊化編程、規范編程習慣、訓練閱讀代碼的能力,使學生的編程能力明顯增強。
【關鍵詞】? ? C語言? ? 程序調試? ? 模塊化? ? 規范化編程
一、程序設計訓練課程簡介
在 “軟件定義一切”的大背景下,通信與信息大類專業涉及了信息科學、計算機、數學等交叉專業,其就業市場不僅要求學生掌握通信領域的專業知識,而且對學生通信軟件編程能力也提出了更高的要求[1]。鑒于此,在第一學期的下半期,為通信與信息大類學生開設了程序設計訓練這門必修課程,其先修課程是C語言程序設計。程序設計訓練課程旨在學生具有C語言基礎知識的基礎上,加強C語言編程應用能力的訓練,以助于后續更好地學習數據結構與算法等課程。
本課程以專題的形式進行內容設計,包含的5個專題都來自于生活或者通信專業涉及到的一些簡化實例,以期激發學生的編程興趣。老師授課時可選取其中2-3個專題進行訓練,注重培養學生的編程思維和編程方法,提高學生用計算機解決問題的能力,為后續進一步學習編程相關類課程打下必要的理論基礎。
二、存在的主要問題
該課程相對于其他應用性課程來說,實踐性很強,學生普遍反映掌握起來比較難。通過對學生的觀察,發現主要存在以下問題:
2.1 缺乏規范性編程習慣
很多學生在進入大學后才接觸編程學習,往往注重語言本身的學習,而忽視了規范性編程習慣的培養[2],導致在編程時,變量、函數、文件等的命名隨心所欲,程序段層次不清晰,缺乏注解,程序可讀性不強等等。在編寫小程序段時,這些不良習慣影響不大,但當程序段稍微復雜時,就會引起很大的問題。
2.2 缺乏代碼調試能力
編譯系統主要是語法上的檢查,無法檢查代碼邏輯上的錯誤,而這些邏輯上的錯誤往往可以通過調試來發現。因此代碼調試能力是編程能力的重要體現。“調試”功能需要在建立工程的環境下才能實現。但學生在先修課程C語言課程上,由于平時編程練習的是一個個只具有簡單功能的小程序,普遍采用建立單個源文件的方式編寫代碼,很少采用建立“工程”的方式進行項目開發,因此無法進行代碼調試。本課程中的每個專題都有較多需求,需要實現多個功能,代碼量相對較大。當遇到編譯通過而程序邏輯功能有問題時,不會調試代碼的學生就會感覺茫然無措。
2.3 過分依賴指導書,學習自主思考不足
該課程配備的實驗指導書為每個專題都附上全部源碼,希望學生掌握代碼分析和閱讀的方法,并掌握通過修改程序實現既定目標的方法。但學生在實際的學習過程中,雖然也讀懂了代碼,也能畫出程序框架,但往往受限于指導書而寫不出自己的代碼。因此需要老師采取有效的措施引導學生利用好指導書。
三、采取的措施
在程序設計訓練課程的教學過程中,老師要特別注重引導學生進一步理解編程思想,培養良好的編程習慣,提高運用計算機分析問題和解決問題的能力。
3.1 強化程序調試和排錯能力的訓練
將第一次課程用來訓練學生的程序調試和排錯能力,讓學生熟悉項目結構以及文件布局,掌握通過調試工具跟蹤程序運行并進行代碼分析、Bug排除等技能。例如,在第一次課上,老師要求學生在新建的目錄下創建一個新的C代碼空工程,并將老師編寫好的1個C文件和兩個. h文件分別拷到在該工程目錄下新創建的src、include文件夾下,同時將這3個文件添加到新創建的工程中,然后進行編譯。由于老師在代碼中故意設置了錯誤,編譯無法完成。這時老師就引導學生怎樣通過閱讀系統提示進行代碼的修改。當代碼調試通過后,再要求學生采用單步、斷點等調試手段,配合Debug? windows下的Watches和Memory Dump查看變量和內存值。
此外,在后續的編程過程中,要求學生遇到編譯方面的錯誤,首先自己設法排除;遇到邏輯方面的問題,先自己通過單步/斷點等調試手段看能不能解決。通過這一系列的訓練,學生的調試能力和排錯能力得到了明顯提高。此外,通過這一過程,學生對怎樣進行文件布局有了一個初步認識,為后續進行多文件編程打下基礎。
3.2采用模塊化思想,循序漸進引導學生進行項目開發
這部分是課程教學中最重要的內容,下面以“通信錄的開發”專題為例進行闡述。本專題的需求是用C語言設計并開發一個簡單的通訊錄管理程序,要求能夠實現通訊錄的增加、刪除、修改、查詢、存儲和導入等功能。
本專題涉及程序設計框架、程序模塊劃分、跨文件函數調用、輸出/輸入、文件操作、字符串操作、數組、結構體、指針等多項知識。本專題任務量較大,需要老師采取有效的引導方法,用好指導書,讓學生形成良好的編程習慣,從而增強編程能力。
1.首先引導學生進行需求分析,把需求細化出來;之后指導學生進行程序代碼框架的設計,建立框架的概念,引導學生進行主界面的設計。在這一階段,只需要設計出“通信錄”的框架,通過編寫空殼函數(例如寫一個最簡單的輸出語句),調試系統邏輯功能是否能實現。在這一過程中,要讓學生明白,在進行代碼設計時,主函數要干凈,功能用子函數操作,重復的功能要用函數實現。
2.然后再對模塊逐個突破、先易后難。首先設計添加和刪除、查詢模塊,掌握數組、循環等操作;導入通信錄和保存通訊錄模塊涉及文件的讀寫操作,這部分知識學生還未學習,這時可以給學生布置預習作業,自學文件相關基礎內容,并完成幾個基本的文件讀寫編程練習。回到課堂后,老師對關鍵內容進行講解和分析,這時學生就具備了基本的文件讀寫能力,可以選擇一種適合的文件讀寫方法完成上述模塊的編寫。
3.改寫代碼,用“多文件編程”方式實現。當學生已經把“通信錄”功能基本實現后,會發現所有的代碼都寫在同一個源文件中,代碼很長,不利于調試并發現問題。這時,老師以第一次課程中的示例文件為例,引出“模塊化多文件編程”的思想,并要求學生改寫代碼,采用“多文件編程”方式實現。通過改寫代碼的過程,學生會深刻體會到通過多文件編程,程序脈絡結構會更加清楚,也更易于維護,同時也利于代碼的重復利用,從而提高編程效率[3]。
3.3規范編程習慣
從進入第一次課開始,老師就要給學生建立規范編程的意識。在第一次課上,給學生講解基本的編程規范,例如怎樣給變量和文件命名、怎樣進行注解、怎樣合理使用各種變量、怎樣使用預編譯方式等,并將規范編程的要求貫穿整個課程。老師可以采用案例教學的方式,參考企業編程規范,逐步培養學生良好的編程素養。例如,定義文件名、函數名和變量名時,要見其名知其意,不要用毫無意義的a、b、c之類的定義,要用英文,不要用拼音[2];盡量不要用全局變量;要注意include的路徑問題;應學會函數之間傳參數等。編程初學者特別要注意的一個問題是盡量不要用goto語句。在授課過程中發現很多學生喜歡用goto語句,覺得簡單、方便,甚至嵌套、穿插使用,在代碼中隨意跳躍,整個代碼邏輯非常混亂,可讀性很差,甚至出現死循環。這實際體現了學生未形成良好的編程思維,不能對代碼進行清晰的流程控制。老師一定要進行糾正,指導學生修改語句,例如用條件或循環語句、用break、continue或return等,來清晰地聲明代碼執行到此處的后續行為。老師可以在教學過程中逐步積累不規范的編程案例,通過案例分析的方式對學生的編程習慣進行指導。
3.4訓練學生閱讀代碼的能力,然后借鑒并提高
在教學過程中,不要求學生一開始就去讀代碼,而是首先設計出整體框架,再對每個模塊進行具體設計。同時,在進行整體框架設計和每個模塊具體設計過程中,引導學生分析設計需求,建立設計思路,并引導學生嘗試用已有的知識自己寫出代碼后再參考指導書,這樣學生就能有的放矢地分析參考代碼的優劣,并吸收可取之處。此外,還要注重學習借鑒優秀的程序架構設計。同時,對于借鑒的代碼不是簡單的搬過來,一定要消化。例如,對于借鑒的程序中一些不理解的地方,要深鉆細研,最好能在調試中進行閱讀,并舉一反三,從而達到理解并能進一步靈活應用的目的。
四、結束語
在程序設計訓練課程的教學過程中,老師注重對學生編程思想、編程習慣的培養,訓練學生模塊化的設計方法,培養學生利用調試工具跟蹤程序的動態變化并分析程序邏輯的能力,有助于使學生具備一定的規范編程的習慣,也通過項目的實現,讓學生增加成就感,提高編程學習的興趣。同時,通過指導學生如何學生閱讀代碼、查詢資料、參考別人的代碼,培養學生的代碼閱讀能力和分析能力。此外,本專題中涉及的部分知識,在C語言課程中可能還未涉及或即使學習也沒有進行強化練習。學生在本課程中通過大量的預習和自學,養成了一定的自主學習的習慣,這也是一個編程人員非常重要的素質。在老師的有效引導下,學生通過該課程的學習,可以明顯增強C語言編程能力,并為后續的軟件課程打下堅實的基礎。
參? 考? 文? 獻
[1]王勇,楊曉波,楊小龍,等.淺談新工科背景下通信軟件課程教學改革[J].當代教育實踐與教學研究.2020(15):337-338.
[2] 尹波.“非計算機”理工科專業C++程序設計教學研究[J].科教文匯.2020(16):89-90
[3]華玉明.51單片機C語言模塊化多文件編程方法探討[J].吉林廣播電視大學學報.2014(10):11-12.
[4]曾帥,王中瑩.提升通信軟件基礎課程學生編程創新能力的研究[J].現代計算機.2016(18):39-41.
[5]王娟,孔宇彥,黃培泉,等.程序設計基礎課程混合式教學模式改革的研究與實踐[J].現代計算機.2021(20):113-117
[6]匡春臨,蔣勝利.引入計算思維的“C程序設計”教學研究與實踐[J].教育教學論壇.2020(24):363-364.
[7]元澤懷,李麗芳.單片機工程項目C語言編程規范實踐教學研究[J].肇慶學院學報.2020(2):32-36.
[8]黃曉峰.論單片機課程教學中C語言編程的規范性[J].科教導刊. 2015(23):127-128.