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