汪香君 劉會芬
摘? 要:“C++程序設計”是計算機相關專業(yè)的核心課程,提高學生的實際編程水平是本門課程的首要任務。在教學方法上注重實踐能力的培養(yǎng),強化實驗課程與理論課程的耦合度,通過引入OJ系統(tǒng)、草料二維碼等信息化工具提升上課效率,同時強化代碼質(zhì)量管理,鼓勵學有余力的學生參與到實際項目實踐中,引導學生學以致用。在課程考核機制上,一是引入多樣化的考核方式,二是將筆試改成上機考試,進一步促進學生重視實踐能力的提升。經(jīng)過實際教學證明,教學方法和考核方式的改革,切實提高了學生的自主解決問題的能力和實踐能力。
關鍵詞:程序設計;教學方法;考核方式;實踐能力
中圖分類號:TP39;G434? ? 文獻標識碼:A? ? 文章編號:2096-4706(2023)18-0176-06
Research on the C++ Programming Teaching for the Training of Practical Ability
WANG Xiangjun, LIU Huifen
(College of Big Data and Internet, Shenzhen Technology University, Shenzhen? 518118, China)
Abstract:“C++ Programming” is the core course of computer-related majors, and improving students' actual programming level is the primary task of this course. In terms of teaching methods, teachers pay attention to the cultivation of practical ability, strengthen the coupling between experimental courses and theoretical courses, improve the efficiency of class by introducing information tools such as OJ system and forage QR code. At the same time, we strengthen code quality management, encourage top students to participate in actual project practice, and guide students to apply what they have learned. In the course assessment mechanism, we introduce a variety of assessment methods, and change the written examination into computer examination, further promoting students' attention to the improvement of practical ability. Actual teaching has proved that the reform of teaching methods and assessment methods effectively improves students' ability to solve problems independently and practical ability.
Keywords: programming; teaching method; assessment method; practical ability
0? 引? 言
現(xiàn)代教育顯著特征之一就是要尊重學生的主體地位,在教學中要充分調(diào)動學生學習的積極性、主動性和創(chuàng)造性。程序設計課程都具有較強的實踐性[1],為了全面提升學生整體程序設計能力水平,程序設計類的理論教學和實踐教學應該緊密地構(gòu)成一個整體,互相融合,相輔相成。根據(jù)學生在實踐過程中暴露出來的問題和短板,在教學中要不斷調(diào)整教學方法和內(nèi)容,探索新的教學方法和模式,培養(yǎng)學生的實際動手能力、自主解決問題的能力[2]。
“C++程序設計”是以C++編程語言為基礎,介紹面向?qū)ο蟪绦蛟O計方法,培養(yǎng)學生的面向?qū)ο缶幊趟枷?。它是高校計算機相關專業(yè)的必修課,其先導課程為“C語言程序設計”,后續(xù)課程是“數(shù)據(jù)結(jié)構(gòu)”,處于軟件類課程的核心地位。以“C++程序設計”課程為例探討程序設計類課程的實踐教學改革,通過在教學方法和課程考核方式等方面的改變,提升學生的實踐能力和自主解決問題的能力。
1? 教學方法改革
編程語言之所以稱之為“語言”,它與自然語言有其相通之處,它們都是基于一定的規(guī)則進行溝通。自然語言用于人與人之間的溝通,編程語言則是人與機器的溝通,讓機器根據(jù)人的指令完成相應的計算和操作。人類掌握自然語言需要經(jīng)過反復的練習,嬰兒在媽媽成千上萬次的示范下才會發(fā)出“媽媽”的聲音,上學后系統(tǒng)學習語法知識,知道了中文的句子由主、謂、賓、定、狀、補構(gòu)成,而后通過大量的閱讀和寫作來提升語言技能。編程語言的學習可以與自然語言類比,掌握基本的語法和編程規(guī)則之后,一定要進行實際的上機編程練習,通過實踐又可以反過來促進理論知識的思考和消化。
1.1? 理論與實踐緊密結(jié)合
“紙上得來終覺淺,絕知此事要躬行”。程序設計類課程除了讓學生掌握基本的程序語法和程序設計思想等理論知識,更重要的是讓學生掌握編程方法,切實提高動手寫代碼的能力?!癈++程序設計”課程分為理論課和實驗課兩部分,理論課由專任教師講解基本的理論知識,實驗課在機房上機練習,配備有專業(yè)的實驗教師。理論教師和實驗教師共同對學生的上機實踐提供指導,及時解決學生上機過程中遇到的問題。
像“C++程序設計”這樣的實驗與理論強相關的課程,在教務初始排課時就要特別留意,要讓每周的理論課排在實驗課的前面,否則會出現(xiàn)新學期一開始上課就要做實驗,但是理論課還沒有開始上的尷尬局面。在一個教學周內(nèi)先上理論課,再上實驗課,理論課一次2課時,實驗課一次3課時。實驗內(nèi)容與當前理論課的知識緊密相關,根據(jù)理論課的進度實時調(diào)整實驗內(nèi)容。考慮到學生在大一上學期由于開學晚和軍訓等各種原因?qū)е翪語言課時較少,而C++與C語言又具有緊密的相關性,前面三次課對C語言進行回顧,并重點復習指針和引用等內(nèi)容,為更好地學習C++打好基礎,“C++程序設計”的理論和實驗進度安排如表1所示。
在實驗內(nèi)容的安排上,實驗題目要與理論知識緊密結(jié)合,例如在理論課講完構(gòu)造函數(shù)和析構(gòu)函數(shù)后,實驗題目要體現(xiàn)不同情況下構(gòu)造函數(shù)和析構(gòu)函數(shù)自動調(diào)用過程。一般來說,前面的實驗練習的是知識點,不宜出現(xiàn)太難的題目,而靠后的實驗可以更加具有綜合性。一方面隨著時間的推移學生可能會忘記前面學過的內(nèi)容,另一方面隨著學習的深入,學生掌握的知識越來越多,就越能解決更為復雜的問題,所以后面的實驗題目除了要包含當次課程的知識點,也可以稍微提高難度,融合已經(jīng)學過的內(nèi)容,做到溫故知新,融會貫通。
1.2? 利用OJ系統(tǒng)提升上機效率
實驗課程利用在線判題系統(tǒng)[3](Online Judge System, OJ)作為實驗平臺,教師可以在OJ系統(tǒng)上發(fā)布實驗題目,學生在線提交源代碼,系統(tǒng)對源代碼進行編譯和執(zhí)行,通過驗證在輸入相同數(shù)據(jù)時,程序運行結(jié)果跟后臺給定的答案是否相同來判斷程序的正確性,題庫如圖1所示。利用OJ系統(tǒng)學生能夠?qū)崟r查看自己提交的代碼是否正確,錯誤的代碼可以當場修改,代碼提交記錄如圖2所示。另外,學生也能看到同班級同學的排名情況,相互之間形成競賽的態(tài)勢。教師可以在后臺實時查看班級實驗完成情況和同學們提交的代碼,通過后臺錯誤提示信息可以及時發(fā)現(xiàn)學生存在的問題,針對多數(shù)同學出現(xiàn)的共性問題可以當堂講解。對于排名靠后的學生在課堂上重點關注,課后提醒學生按時完成實驗。
學生課上沒有完成的實驗題目如果在課后提交代碼時遇到問題,只需要通過微信等交流工具告訴教師姓名和題號,教師就可以在OJ后臺看到學生的代碼,如圖3所示,能更方便地幫學生定位問題。利用OJ平臺能快捷地將課上和課下的輔導銜接起來,實現(xiàn)線上與線下混合式教學[4]。
1.3? 強化代碼質(zhì)量
一個優(yōu)秀的程序員不僅要完成產(chǎn)品功能的開發(fā),還要保證所交付的代碼的質(zhì)量[5]。提升代碼質(zhì)量的第一步就是培養(yǎng)學生良好的編程習慣,在第一次上機實驗之前就告訴學生基本的編碼規(guī)范,讓他們知道什么樣的代碼是高質(zhì)量代碼。OJ系統(tǒng)能夠判定學生提交的代碼能否通過測試樣例的測試,但是不能判定代碼的質(zhì)量好壞。所以每次實驗都將高質(zhì)量的參考代碼分享給學生,讓他們知道好的代碼到底是怎樣的。
代碼的質(zhì)量不僅體現(xiàn)在代碼的規(guī)范性上面,還體現(xiàn)在代碼的性能、可讀性、易擴展性等方面。以比較兩個日期的大小為例(第一個日期在第二個日期前面返回true,否則返回false),日期對象包含年、月、日三個屬性,類的界面如下所示:
class Date{
private:
int year,month,day;
public:
Date();
Date(int y,int m,int d);
int getYear();
int getMonth();
int getDay();
friend bool compareDate(Date d1,Date d2);};
其中compareDate函數(shù)大部分同學的實現(xiàn)方式是依次比較年份、月份和日期的大小,根據(jù)大小關系返回相應的結(jié)果,如果都沒有返回則說明是同年同月同日,最后返回false,代碼如下:
bool compareDate(Date d1,Date d2){
if(d1.year return true; if(d1.year>d2.year) return false; if(d1.month return true; if(d1.month>d2.month) return false; if(d1.day return true; if(d1.day>d2.day) return false; return false;} 而部分同學則將年、月、日合成一個8位的整型數(shù)據(jù),直接比較兩個整型數(shù)據(jù)的大小,如下代碼所示: bool compareDate(Date d1,Date d2){ int date1=d1.year*10000+d1.month*100+d1.day; int date2=d2.year*10000+d2.month*100+d2.day; if(date1 return true; return false; } 比較上面兩種實現(xiàn)日期比較的方法,雖然都能完成要求的功能,但是第二種方式的代碼更簡潔,不容易出錯。 將高質(zhì)量代碼發(fā)給學生參考,學生才能看到自己的代碼和優(yōu)秀代碼的差距,找到努力的方向。每次實驗結(jié)束時選取優(yōu)秀代碼生成答案文檔,利用草料二維碼工具將答案文檔生成二維碼在微信教學群分享給學生。通過二維碼分享實驗答案,學生只能查看代碼,不能復制,能很好地防止學生將標準答案保存下來發(fā)給其他還未上課的班級同學。在選取優(yōu)秀代碼的過程中會瀏覽同學們提交的代碼,發(fā)現(xiàn)代碼中存在的共性問題,在下次實驗開始之前針對上一次實驗的共性問題進行講解,將有限的課堂時間用在解決大多數(shù)同學碰到的問題上面,實現(xiàn)課堂效益的最大化。 1.4? 因材施教 “十根手指有長短”,在每一個班級中,個體差異總是客觀存在的。作為教師應注重發(fā)現(xiàn)學生的自身優(yōu)勢,揚長避短,促進學生的個性化發(fā)展[6]。實驗課上可以給學有余力的學生額外提供難度稍高一些的題目,考試時增加附加題,促使尖子生在學好教學大綱規(guī)定的知識之外進一步提升編程水平。另外,現(xiàn)在“以賽促學、以賽促教”的教學模式已逐漸受到了老師和學生的歡迎[7],讓學生參與專業(yè)的編程比賽,可以充分調(diào)動他們學習的積極性和主動性。課程借助OJ系統(tǒng)以及基于OJ系統(tǒng)開發(fā)的成績統(tǒng)計工具,可以快速匯總每次的實驗成績,得到當前總體實驗成績的排名情況,快速識別出編程能力強的同學,鼓勵學有余力的同學參與程序設計大賽,參與教師項目或者申請學校的創(chuàng)新創(chuàng)業(yè)項目。通過競賽和項目進一步提高學生的理論水平,提升動手能力,促進學生主體的個性化發(fā)展。 2? 考核方式改革 合理的課程考核機制可以檢驗學生對課程的學習掌握情況,幫助教師不斷總結(jié)經(jīng)驗,改進教學方法,同時也能對學生的學習成績做出客觀公正的評價,引導其明確學習方向。考慮到程序設計類課程實踐性強的特點,一方面引入多樣化的考核方式來綜合評價學生的學習態(tài)度和學習效果,另一方面將筆試改為上機考試來檢驗學生的實際編碼水平。 2.1? 考核方式多樣化 大學教育的目的是讓學生通過專業(yè)課程的學習掌握專業(yè)技能,不能唯分數(shù)論,所以大學課程也不宜單憑期末考試成績來判定學生的學習情況?!癈++程序設計”課程的考核采用考勤、實驗成績、期中考試和期末考試相結(jié)合的方式,從多個維度來考察學生的學習態(tài)度和知識水平。 平時實驗練習是本課程的重要環(huán)節(jié),由于學生對知識的掌握情況不一樣,實驗課程的題目難易程度一般控制在大部分同學在實驗學時內(nèi)能夠完成,但是一些基礎較差的同學課堂上不能全部按時完成,課后應該給他們補做的機會。實驗成績分為課堂提交和課后補交兩部分,課堂提交的題目得該題的滿分,課后補交題目的得分乘以一定的系數(shù)(一般取值0.8)。課堂提交情況考查學生知識掌握的熟練程度,激勵同學們充分利用課堂時間,認真答題,形成你追我趕的競賽態(tài)勢。課后補交機制給基礎薄弱的同學提供更多的練習時間,同時能夠考察學生的學習態(tài)度。對于一些課堂上不能按時完成,課后又不補交的同學及時給予關注,避免后進生放棄課程的學習。 2.2? 上機考試取代筆試 對于“C++程序設計”課程,考核代碼的編寫能力是必須的,在傳統(tǒng)的筆試中,學生在紙上寫的代碼不易辨認,給批卷帶來困難,而上機考試作為一種新型的考試模式引起了越來越多高校的探索和應用。程序設計類的課程是實踐性很強的課程,注重對學生的實際動手能力的考察,直接上機編程的考試方式更能考察學生的實際動手能力和知識掌握水平,所以課程的期中考試和期末考試都是采用上機考試的方式[8],如圖4所示??荚嚂r允許學生帶紙質(zhì)資料,禁止攜帶任何電子資料??荚嚻陂g關閉機房外網(wǎng)環(huán)境,避免學生上網(wǎng)查找資料。考試時間為三小時,包含五道或六道必做題和一道選做的附加題。必做題一般按照從易到難的順序設置,涵蓋了課程基礎內(nèi)容和重要的知識點,例如類的定義、構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、靜態(tài)成員與友元、繼承、多態(tài)、運算符重載、模板等重點內(nèi)容。附加題綜合性較強,難度較大,一般只有少數(shù)基本功非常扎實的同學能完成。 上機考試能夠更有效地考察學生的實際編程水平,在課程一開始就告知學生課程的考核方式,促使學生重視平時的實驗上機練習,切實提高動手實踐能力。 3? 教學改革效果 通過在教學方式和考核方式等方面的改革,充分利用OJ系統(tǒng)、草料二維碼和微信等信息化工具,我?!癈++程序設計”課程教學效果有了很大的提升,更多的學生能夠在實驗課上完成所有的實驗題目,并且在課后積極與教師探討課程問題。很多學生在完成課程內(nèi)容的基礎上參與到教師的科研項目中,或者參與各種程序設計類型的競賽,例如ACM和藍橋杯等競賽,我校學生都有獲得不錯的獎項。 我校每個學期末學生需在教務系統(tǒng)對教師的課程教學情況進行評價,評價指標涵蓋課堂氛圍、教學方法、知識掌握情況等多個維度,很大程度上反映了學生對課程和教師的滿意程度。經(jīng)過教學改革,本門課程的教學評價平均分從85.3分提升到88.5分,尤其是在“本門課使我在相關能力方面得到提高”選項下滿意度從87.22%提升到96.08%,表明更多的學生認可通過課程的學習提高了編程能力。 4? 結(jié)? 論 經(jīng)過多個方面的教學改革,雖然大部分學生通過“C++程序設計”課程的學習掌握了必要的編程技能,切實提高了學生的動手實踐能力,但是每個年級會有一小部分學習態(tài)度不端正的同學,平常不好好上課,遇到問題既不思考也不求助老師,碰到不會的實驗題目抄襲同學的代碼。當前,需要通過人工比對代碼的方式來判斷是否存在抄襲現(xiàn)象,效率不高,很難完成所有學生代碼的比對。一方面,需要在課程一開始就跟學生強調(diào)抄襲的后果和問題的嚴重性,將想要抄襲的火苗扼殺在搖籃里;另一方面,后續(xù)要借助查重工具來判別抄襲情況,在代碼提交到OJ系統(tǒng)時由系統(tǒng)自動完成代碼相似度檢測,從而快速甄別出抄襲的代碼。 參考文獻: [1] 孔麗英.C++程序設計的教學改革 [J].軟件工程,2017,20(7):57-59. [2] 黎明,文海英,杜敏.基于學科競賽的編程類課程教學改革 [J].計算機教育,2014(13):72-74. [3] 林子慧.面向在線判題系統(tǒng)的程序設計教學方法的研究與實踐 [J].無線互聯(lián)科技,2021,18(15):156-158. [4] 傅幼萍.Python課程線上線下混合式教學創(chuàng)新模式探索 [J].計算機時代,2022(12):135-138+142. [5] 陳立前,董威,尹良澤,等.面向代碼質(zhì)量提升的軟件工程能力素質(zhì)培養(yǎng) [J].軟件導刊,2022,21(7):1-5. [6] 成尚榮.高水平因材施教是教育高質(zhì)量發(fā)展的必然命題 [J].人民教育,2021(18):34-38. [7] 陳鑫.高校程序設計課程教學研究與實踐 [J].長治學院學報,2022,39(2):97-100. [8] 高潔,于健,劉志強,等.程序設計類課程思政教學改革探索與實踐 [J].軟件導刊,2023,22(4):186-190. 作者簡介:汪香君(1982.05—),女,漢族,湖北黃岡人,實驗師,碩士,研究方向:人臉識別、深度學習;劉會芬(1983.11—),女,漢族,湖北黃岡人,實驗師,碩士,研究方向:物聯(lián)網(wǎng)應用、軟件工程。