徐偉 吳超 陳凱明
摘要:針對以往程序設(shè)計課程實驗中存在的代碼規(guī)范混亂、學生調(diào)試代碼困難等問題,提出了一種強化代碼規(guī)范要求和加強程序調(diào)試教學的實驗教學方法,并從代碼規(guī)范的具體要求和評分細則方面、程序調(diào)試的要求和步驟方面分別闡述了實施方法。實際的數(shù)據(jù)說明教學情況良好,76.12%的學生的上機實驗分數(shù)在90分以上,學生的實驗完成度較高、對上機實驗掌握情況良好;此外學生的代碼規(guī)范有了明顯提升,85.81%的學生的代碼規(guī)范達到良好水平。這些教學改革應(yīng)用于今年疫情期間的在線教學中,通過這些舉措的實施,克服了在線教育的不利之處,學生的整體學習水平基本保持了穩(wěn)定。
關(guān)鍵詞:程序設(shè)計;代碼規(guī)范;程序調(diào)試;實驗教學
程序設(shè)計課程是計算機學科教育的基礎(chǔ),是計算機學科的入門課程[1-3]。該課程是一門介紹計算機程序設(shè)計基本思想和程序設(shè)計語言的課程,也是一門關(guān)于利用程序設(shè)計方法求解應(yīng)用問題的實踐性課程[4]。中國科學技術(shù)大學程序設(shè)計課程以C語言為主進行講授,為了讓學生能夠較好地掌握C程序設(shè)計語言,通過語言規(guī)則的教學和的幾個有針對性專題的實踐訓練,加深學生對C程序設(shè)計語言的理解,使學生具有編寫一定規(guī)模的程序來求解應(yīng)用問題的能力。由于程序設(shè)計課程是一門理論性、實踐性很強的課程,學生要想學好此類課程,一方面要高質(zhì)量地完成課堂知識點的教授與學習,另一方面也要多進行上機練習,通過加強課程實驗部分的管理和指導,提高學生的實踐能力[5-7]。理論知識的學習與上機實踐練習,具有互相指導、互相促進的作用。加強實踐能力的教學,也將促進學生對理論知識的掌握更加牢固。為了提高程序設(shè)計實驗檢查的效率,很多學校引入在線評測平臺(Online Judge,OJ)來對程序設(shè)計課程實驗進行自動的正確性檢查[8]。OJ系統(tǒng)的引入,大大減輕了教師對學生實驗檢查的工作量,具有進一步推廣的意義[9-10]。同時為了適應(yīng)在線教育的浪潮,很多教師也將程序設(shè)計課程搬到了網(wǎng)絡(luò)上,采用慕課等翻轉(zhuǎn)課堂的教學方法。這些教學舉措提高學生的學習效率,也更有效地培養(yǎng)學生的創(chuàng)新能力[11-13]。課題組通過數(shù)年程序設(shè)計課程的實驗教學與調(diào)研,發(fā)現(xiàn)當下還存在以下比較突出、亟待解決的問題:
(1)學生在實驗過程中多重視功能性的實現(xiàn),而忽視代碼編程規(guī)范。具體表現(xiàn)包括隨意命名變量名、代碼排版不清晰,程序可讀性差等問題。
(2)學生程序調(diào)試效率低下,對于IDE調(diào)試工具掌握不熟練。調(diào)研中發(fā)現(xiàn)學生更愿意使用printf等打印命令將需要調(diào)試的信息打印出來進行查看。
加強學生的代碼編程規(guī)范、讓學生從一開始就寫出可讀性高、邏輯清晰的代碼,具有重要的意義。而在調(diào)試過程,必須教會學生使用調(diào)試工具。正確有效的程序調(diào)試方法,將是培養(yǎng)合格的計算機人才必須掌握的能力。為了全面提高學生的編程能力,課題組經(jīng)過研討對于實驗教學環(huán)節(jié)進行以下的教學改革:
(1)課題組專門編寫了程序設(shè)計代碼規(guī)范,詳述了代碼規(guī)范具體要求,同時編寫了代碼規(guī)范的評分細則,做到“有法可依”。對于實驗中代碼規(guī)范扣分情況,會在實驗后專門反饋給學生,供學生認識和改正錯誤,從而提高代碼規(guī)范水平。
(2)將程序調(diào)試方法作為專題,進行了培訓。并以vs2017為例,著重介紹IDE等開發(fā)工具的調(diào)試辦法。通過相關(guān)工具的介紹,讓學生熟悉工具的變量查看、內(nèi)存查看等方面的使用,引導學生采用正確的調(diào)試方法,提高編碼調(diào)試效率。
今年上半年因為新冠疫情的影響,春季學期的程序設(shè)計課程的教學在線開展,課程實驗也同步在線進行。相比線下教學,線上教學存在著師生交流不便、學情反饋不及時等缺點[14-15],得益于本次教學改革的實施,學生的代碼規(guī)范有了較大幅度的提升,同時學生對程序設(shè)計課程的整體掌握程度基本保持了穩(wěn)定。
1 加強代碼規(guī)范要求
為了提高學生編程的規(guī)范程度,提高代碼的可讀性與可維護性,在課程教學中采用專題講座的形式,對于代碼規(guī)范進行了介紹,形成了專門的《代碼規(guī)范評分細則》文檔,存放在課程QQ群的共享空間上,供學生隨時查看。代碼規(guī)范以C語言為例進行了說明,分為以下五個大項進行要求:
1)縮進、括號、分行與空格
該項以學生每部分、每條代碼語句的美觀性,代碼結(jié)構(gòu)的工整性,作為根本評價依據(jù);在每個方面的整體上符合、關(guān)鍵原則上符合、細節(jié)上不完全符合,但代碼美觀性和工整得到保障的,可以得分。
具體要求包括縮進的規(guī)則(以4個空格或tab鍵進行縮進)、大括號的風格統(tǒng)一(大括號允許單獨分行或緊跟代碼之后,二者擇一使用,不要混用)、分行(對于較長的行、表達式等,應(yīng)以分行方式書寫)、小括號(有括號標識運算順序和邏輯組合要求的必須使用)、空格(在算符、逗號等,應(yīng)使用一個空格分開,保證顯示的工整與美觀)。
2)函數(shù)頭與結(jié)構(gòu)體注釋
該項以是否充分說明函數(shù)參數(shù)、返回值與結(jié)構(gòu)體成員的意義,作為根本評判依據(jù)。意義和用途,基本可以理解的,可以得分。
具體要求包括函數(shù)頭注釋(針對函數(shù)的目的、描述函數(shù)的作用、效果)、結(jié)構(gòu)體注釋(注釋結(jié)構(gòu)體用途、成員的意義,必要時說明成員取值范圍)。
3)函數(shù)、變量、常量與結(jié)構(gòu)體及其成員的命名
該項以是否滿足命名風格(格式)的要求,是否足夠“望文生義”,作為根本評判依據(jù)。命名格式需按規(guī)定條目嚴格要求;意義是否清晰應(yīng)當結(jié)合變量命名與相關(guān)注釋,一并評價。
具體要求包括命名規(guī)則(例如進行大/小駝峰命名,匈牙利命名法等,任何變量、常量、函數(shù)、結(jié)構(gòu)體的名稱都應(yīng)可以直接或比較明確地反映其用途、含義)、不允許的命名方式(例如拼音命名等,推薦使用英文短單詞(單音節(jié))的縮寫而非全拼)。
4)代碼模塊化與邏輯注釋
該項以是否清晰展現(xiàn)代碼的內(nèi)在邏輯、執(zhí)行意義和過程,作為根本評判標準。對于較長的代碼塊,有注釋注解代碼流程,基本清楚的,可以得分。
具體要求包括代碼塊邏輯(例如對于較長的代碼/函數(shù)塊,應(yīng)用多行注釋描述過程)、循環(huán)(循環(huán)的進入、退出邏輯需要說明)、分支邏輯(例如對于進入和退出時變量的變換邏輯進行說明)、運算邏輯(冗長的表達式需要說明)、變量使用邏輯(例如對結(jié)構(gòu)體成員、布爾標志變量說明以什么含義進行使用,何種情況值會變化)。
5)變量、常數(shù)與函數(shù)的使用
該項涉及變量、常數(shù)的使用中應(yīng)當避免的做法,以及函數(shù)編寫時應(yīng)當避免的寫法。這些寫法或者使得程序出現(xiàn)未定義的危險行為,或者使得程序易錯。
具體要求包括不允許的寫法(例如禁止使用未初始化的指針、類型不同的浮點數(shù)相等比較等)、需要限制的寫法(例如同類型浮點數(shù)使用==,>=,<=等比較運算符、使用goto語句等)、需要注意的寫法(例如有符號整數(shù)的負數(shù)與無符號整數(shù)之間的混合運算等)。
中國科學技術(shù)大學的近幾年的程序設(shè)計課程實驗,采用OJ系統(tǒng)進行實驗的判誤,得益于OJ系統(tǒng)的使得學生可以在離校在家的情況下,也能進行實驗作業(yè)的提交。代碼規(guī)范的評分細則中規(guī)定每個大項占一分,當學生完成實驗作業(yè)的提交后,課程助教將學生代碼從OJ后臺取出,由助教進行規(guī)范審查決定代碼規(guī)范的得分。若某次實驗存在多項練習題,該次實驗的代碼規(guī)范分取這些練習題規(guī)范分的平均。最終的代碼規(guī)范取所有實驗代碼規(guī)范的平均分。如圖1所示,課程實驗后,助教會在課程QQ群中公布出每個學生代碼規(guī)范的違反情況,讓學生了解為什么扣分,從而鞏固和提高學生代碼規(guī)范水平。
2 專題介紹程序調(diào)試方法
為了提高學生對程序調(diào)試的理解,課程專門安排了針對程序調(diào)試的專題學習。學習程序調(diào)試要求掌握以下幾點。
(1)要求學習編譯器提供的程序調(diào)試功能。
(2)熟練掌握設(shè)置斷點,單步,逐個函數(shù)(過程),單條語句的調(diào)試方法。
(3)熟練掌握程序執(zhí)行過程中的變量值的查詢。
(4)由使用輸出語句顯示中間結(jié)果逐步改為通過調(diào)試器的變量查詢功能查詢。
程序調(diào)試是指對程序的查錯和排錯。教授學生對調(diào)試程序一般應(yīng)經(jīng)過以下兩個步驟進行。
(1)先進行人工檢查,即靜態(tài)檢查。
在寫好一個程序以后,不要匆匆忙忙上機,而應(yīng)對程序進行人工檢查。這一步十分重要,它能發(fā)現(xiàn)程序設(shè)計人員由于疏忽而造成的多數(shù)錯誤。這一步往往容易被人忽視,總希望把一切都推給計算機去做,但這樣會多占用機器時間,作為一個程序人員應(yīng)當養(yǎng)成嚴謹?shù)淖黠L,每一步都要嚴格把關(guān),不把問題留給后面的工序。為了更有效地進行人工檢查,所編的程序應(yīng)力求做到以下幾點。
①應(yīng)當采用結(jié)構(gòu)化程序方法編程,以增加可讀性。
②盡可能多加注釋,以幫助理解每段程序的作用。
③在編寫復(fù)雜的程序時不要將全部語句都寫在main函數(shù)中,而要多利用函數(shù),用一個函數(shù)來實現(xiàn)一個單獨的功能。各函數(shù)之間除用參數(shù)傳遞數(shù)據(jù)外,盡量少出現(xiàn)耦合關(guān)系,這樣便于分別檢查和處理。
(2)在人工檢查無誤后,再上機調(diào)試。
通過上機發(fā)現(xiàn)錯誤稱為動態(tài)檢查。在編譯時會給出語法錯誤的信息,調(diào)試時可以根據(jù)提示信息具體找出程序中出錯之處并改正。應(yīng)注意的是有時提示出錯的地方并不是真正出錯的位置,如果在提示出錯的行找不到錯誤的話應(yīng)當?shù)缴弦恍性僬?。有時提示出錯的類型并非絕對準確,由于出錯的情況繁多且各種錯誤互有關(guān)聯(lián),因此要善于分析,找出真正的錯誤,而不要只從字面意義上找出錯信息,鉆牛角尖。如果系統(tǒng)提示的出錯信息很多,應(yīng)當從上到下逐一改正。有時顯示出一大片出錯信息往往使人感到問題嚴重,無從下手。其實可能只有一兩個錯誤。例如,對使用的變量未定義,編譯時就會對所有含該變量的語句發(fā)出出錯信息。這時只要加上一個變量定義,所有錯誤就都消除了。
對于具體的IDE工具,專題以vs2017為例進行了詳細說明,具體涉及vs2017的啟動調(diào)試、斷點設(shè)置、逐過程調(diào)試、逐語句調(diào)試、調(diào)試跳出、自動運行到指定語句暫停、內(nèi)存的查詢方法、變量內(nèi)存地址的查找、將變量地址輸入到內(nèi)存窗口中、設(shè)置內(nèi)存存儲的內(nèi)容的顯示方式。通過這些方面的介紹,覆蓋了學生常用調(diào)試,并形成了專門的《程序調(diào)試基本方法》文檔,存放在課程QQ群的共享空間,供學生隨時查看。
3 教學改革效果評估
3.1 上機實驗效果良好
圖2為中國科學技術(shù)大學2020年春季學期程序設(shè)計某班的155名學生上機實驗分數(shù)統(tǒng)計(滿分100分)。從中可以發(fā)現(xiàn)76.12%的學生的實驗分數(shù)在90分以上,85.81%的學生的實驗分數(shù)在80分以上,通過強化程序調(diào)試方法的介紹,學生的實驗完成度較高,學生對上機實驗掌握情況良好。
3.2 代碼規(guī)范進步明顯
圖3為中國科學技術(shù)大學2020年春季學期程序設(shè)計某班的155名學生上機實驗代碼規(guī)范分數(shù)統(tǒng)計(滿分5分)。從中可以發(fā)現(xiàn)85.81%的學生的代碼規(guī)范在4分以上,代碼規(guī)范掌握情況良好。同時對該課程的八次實驗,分別統(tǒng)計每次實驗的代碼規(guī)范分均值,如圖4所示。從圖4可以看出第一次~第三次實驗存在明顯的上升趨勢,說明學生通過助教的反饋,快速提升代碼規(guī)范水平,第三次試驗后仍有緩慢上升的趨勢,表明學生已基本掌握代碼規(guī)范的要求。
3.3 疫情期間成績保持穩(wěn)定
如圖5所示,分析了2018年、2019年、2020年的程序設(shè)計課程考試成績,可以發(fā)現(xiàn)這三年的80分以上人員的比例分別為79.9%、76.1%、77.9%,說明雖然2020年的線上教育存在教師與學生互動較少、學生學情不便于及時獲取等不利因素,但是通過教學改革的實施,學生的整體學習水平基本仍然保持了穩(wěn)定。
4 總結(jié)
只有結(jié)合教學實際,找到教學中存在的問題,有針對性地提出教學方案,才能真正提高程序設(shè)計的教學質(zhì)量。程序設(shè)計課程的教學改革實踐表明,雖然2020年的教學由于疫情影響改為在線教學,但是通過相關(guān)教學改革方案的實施,程序設(shè)計課程的教學效果明顯,特別是代碼規(guī)范部分的進步尤其明顯。接下來,課題組將驗證和完善課程的教學改革方案,進一步鞏固和提高程序設(shè)計課程的教學質(zhì)量。
參考文獻:
[1] 中國科學技術(shù)大學計算機科學與技術(shù)學院. 計算機科學與技術(shù)專業(yè)本科培養(yǎng)計劃[EB/OL]. 合肥: 中國科學技術(shù)大學, 2013: 1-16. https://www.teach.ustc.edu.cn/education/241.html.
[2] 蔣社想,陳輝,梁興柱.“雙一流”背景下程序設(shè)計課程教學改革[J].軟件導刊,2020,19(9):270-273.
[3] 羅迅,雷盟,郭曉艷,等.程序設(shè)計基礎(chǔ)類課程教學改革的探索與實踐[J].電腦與信息技術(shù),2020,28(2):71-74.
[4] 原松梅.“雙一流”背景下C++程序設(shè)計雙語教學實踐與探索[J].計算機教育,2018(10):110-112,117.
[5] 劉國梅,孫新德.C程序設(shè)計課程教學改革與實踐[J].電腦知識與技術(shù),2020,16(7):130-131,135.
[6] 王芳,張睿,司玉杰.以提升程序分析與設(shè)計能力為導向的C語言程序設(shè)計教學改革研究[J].計算機教育,2020(9):168-173.
[7] 潘飛,付景順,李強,等.新工科背景下《C語言程序設(shè)計》課程教學體系改革探索[J].教育教學論壇,2020(14):163-164.
[8] 鄒運蘭,柴本成.互聯(lián)網(wǎng)+教育背景下的C語言程序設(shè)計教學改革探究[J].計算機教育,2020(5):72-74.
[9] 叢麗暉,范純龍,王丹,等.面向?qū)I(yè)素質(zhì)與能力培養(yǎng)的程序設(shè)計類課程改革與實踐[J].沈陽航空航天大學學報,2017,34(S1):100-103.
[10] 王金鵬,曹旗磊,王涵.基于Online Judge的程序設(shè)計基礎(chǔ)教學改革與實踐[J].計算機教育,2020(2):101-104.
[11] 吳玫,王海暉,李偉波,等.面向混合學習的Java課程教學設(shè)計——以武漢工程大學為例[J].軟件導刊,2018,17(4):220-221,226.
[12] 白魚秀.“C語言程序設(shè)計”課程案例教學法研究[J].微型電腦應(yīng)用,2018,34(3):55-57.
[13] 何迎生,王從銀.基于慕課的C語言程序設(shè)計翻轉(zhuǎn)課堂教學實踐[J].計算機教育,2020(1):160-163.
[14] 楊惠榮,周珺.疫情期間面向?qū)ο蟪绦蛟O(shè)計課程線上教學實踐[J].計算機教育,2020(8):1-5.
[15] 敬超.疫情下ACM程序設(shè)計實踐課程線上教學探索[J].電腦知識與技術(shù),2020,16(24):157-158.
【通聯(lián)編輯:代影】