汪香君 劉會芬



摘? 要:“C++程序設計”是計算機相關專業的核心課程,提高學生的實際編程水平是本門課程的首要任務。在教學方法上注重實踐能力的培養,強化實驗課程與理論課程的耦合度,通過引入OJ系統、草料二維碼等信息化工具提升上課效率,同時強化代碼質量管理,鼓勵學有余力的學生參與到實際項目實踐中,引導學生學以致用。在課程考核機制上,一是引入多樣化的考核方式,二是將筆試改成上機考試,進一步促進學生重視實踐能力的提升。經過實際教學證明,教學方法和考核方式的改革,切實提高了學生的自主解決問題的能力和實踐能力。
關鍵詞:程序設計;教學方法;考核方式;實踐能力
中圖分類號: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? 引? 言
現代教育顯著特征之一就是要尊重學生的主體地位,在教學中要充分調動學生學習的積極性、主動性和創造性。程序設計課程都具有較強的實踐性[1],為了全面提升學生整體程序設計能力水平,程序設計類的理論教學和實踐教學應該緊密地構成一個整體,互相融合,相輔相成。根據學生在實踐過程中暴露出來的問題和短板,在教學中要不斷調整教學方法和內容,探索新的教學方法和模式,培養學生的實際動手能力、自主解決問題的能力[2]。
“C++程序設計”是以C++編程語言為基礎,介紹面向對象程序設計方法,培養學生的面向對象編程思想。它是高校計算機相關專業的必修課,其先導課程為“C語言程序設計”,后續課程是“數據結構”,處于軟件類課程的核心地位。以“C++程序設計”課程為例探討程序設計類課程的實踐教學改革,通過在教學方法和課程考核方式等方面的改變,提升學生的實踐能力和自主解決問題的能力。
1? 教學方法改革
編程語言之所以稱之為“語言”,它與自然語言有其相通之處,它們都是基于一定的規則進行溝通。自然語言用于人與人之間的溝通,編程語言則是人與機器的溝通,讓機器根據人的指令完成相應的計算和操作。人類掌握自然語言需要經過反復的練習,嬰兒在媽媽成千上萬次的示范下才會發出“媽媽”的聲音,上學后系統學習語法知識,知道了中文的句子由主、謂、賓、定、狀、補構成,而后通過大量的閱讀和寫作來提升語言技能。編程語言的學習可以與自然語言類比,掌握基本的語法和編程規則之后,一定要進行實際的上機編程練習,通過實踐又可以反過來促進理論知識的思考和消化。
1.1? 理論與實踐緊密結合
“紙上得來終覺淺,絕知此事要躬行”。程序設計類課程除了讓學生掌握基本的程序語法和程序設計思想等理論知識,更重要的是讓學生掌握編程方法,切實提高動手寫代碼的能力。“C++程序設計”課程分為理論課和實驗課兩部分,理論課由專任教師講解基本的理論知識,實驗課在機房上機練習,配備有專業的實驗教師。理論教師和實驗教師共同對學生的上機實踐提供指導,及時解決學生上機過程中遇到的問題。
像“C++程序設計”這樣的實驗與理論強相關的課程,在教務初始排課時就要特別留意,要讓每周的理論課排在實驗課的前面,否則會出現新學期一開始上課就要做實驗,但是理論課還沒有開始上的尷尬局面。在一個教學周內先上理論課,再上實驗課,理論課一次2課時,實驗課一次3課時。實驗內容與當前理論課的知識緊密相關,根據理論課的進度實時調整實驗內容。考慮到學生在大一上學期由于開學晚和軍訓等各種原因導致C語言課時較少,而C++與C語言又具有緊密的相關性,前面三次課對C語言進行回顧,并重點復習指針和引用等內容,為更好地學習C++打好基礎,“C++程序設計”的理論和實驗進度安排如表1所示。
在實驗內容的安排上,實驗題目要與理論知識緊密結合,例如在理論課講完構造函數和析構函數后,實驗題目要體現不同情況下構造函數和析構函數自動調用過程。一般來說,前面的實驗練習的是知識點,不宜出現太難的題目,而靠后的實驗可以更加具有綜合性。一方面隨著時間的推移學生可能會忘記前面學過的內容,另一方面隨著學習的深入,學生掌握的知識越來越多,就越能解決更為復雜的問題,所以后面的實驗題目除了要包含當次課程的知識點,也可以稍微提高難度,融合已經學過的內容,做到溫故知新,融會貫通。
1.2? 利用OJ系統提升上機效率
實驗課程利用在線判題系統[3](Online Judge System, OJ)作為實驗平臺,教師可以在OJ系統上發布實驗題目,學生在線提交源代碼,系統對源代碼進行編譯和執行,通過驗證在輸入相同數據時,程序運行結果跟后臺給定的答案是否相同來判斷程序的正確性,題庫如圖1所示。利用OJ系統學生能夠實時查看自己提交的代碼是否正確,錯誤的代碼可以當場修改,代碼提交記錄如圖2所示。另外,學生也能看到同班級同學的排名情況,相互之間形成競賽的態勢。教師可以在后臺實時查看班級實驗完成情況和同學們提交的代碼,通過后臺錯誤提示信息可以及時發現學生存在的問題,針對多數同學出現的共性問題可以當堂講解。對于排名靠后的學生在課堂上重點關注,課后提醒學生按時完成實驗。
學生課上沒有完成的實驗題目如果在課后提交代碼時遇到問題,只需要通過微信等交流工具告訴教師姓名和題號,教師就可以在OJ后臺看到學生的代碼,如圖3所示,能更方便地幫學生定位問題。利用OJ平臺能快捷地將課上和課下的輔導銜接起來,實現線上與線下混合式教學[4]。
1.3? 強化代碼質量
一個優秀的程序員不僅要完成產品功能的開發,還要保證所交付的代碼的質量[5]。提升代碼質量的第一步就是培養學生良好的編程習慣,在第一次上機實驗之前就告訴學生基本的編碼規范,讓他們知道什么樣的代碼是高質量代碼。OJ系統能夠判定學生提交的代碼能否通過測試樣例的測試,但是不能判定代碼的質量好壞。所以每次實驗都將高質量的參考代碼分享給學生,讓他們知道好的代碼到底是怎樣的。
代碼的質量不僅體現在代碼的規范性上面,還體現在代碼的性能、可讀性、易擴展性等方面。以比較兩個日期的大小為例(第一個日期在第二個日期前面返回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函數大部分同學的實現方式是依次比較年份、月份和日期的大小,根據大小關系返回相應的結果,如果都沒有返回則說明是同年同月同日,最后返回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位的整型數據,直接比較兩個整型數據的大小,如下代碼所示: 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; } 比較上面兩種實現日期比較的方法,雖然都能完成要求的功能,但是第二種方式的代碼更簡潔,不容易出錯。 將高質量代碼發給學生參考,學生才能看到自己的代碼和優秀代碼的差距,找到努力的方向。每次實驗結束時選取優秀代碼生成答案文檔,利用草料二維碼工具將答案文檔生成二維碼在微信教學群分享給學生。通過二維碼分享實驗答案,學生只能查看代碼,不能復制,能很好地防止學生將標準答案保存下來發給其他還未上課的班級同學。在選取優秀代碼的過程中會瀏覽同學們提交的代碼,發現代碼中存在的共性問題,在下次實驗開始之前針對上一次實驗的共性問題進行講解,將有限的課堂時間用在解決大多數同學碰到的問題上面,實現課堂效益的最大化。 1.4? 因材施教 “十根手指有長短”,在每一個班級中,個體差異總是客觀存在的。作為教師應注重發現學生的自身優勢,揚長避短,促進學生的個性化發展[6]。實驗課上可以給學有余力的學生額外提供難度稍高一些的題目,考試時增加附加題,促使尖子生在學好教學大綱規定的知識之外進一步提升編程水平。另外,現在“以賽促學、以賽促教”的教學模式已逐漸受到了老師和學生的歡迎[7],讓學生參與專業的編程比賽,可以充分調動他們學習的積極性和主動性。課程借助OJ系統以及基于OJ系統開發的成績統計工具,可以快速匯總每次的實驗成績,得到當前總體實驗成績的排名情況,快速識別出編程能力強的同學,鼓勵學有余力的同學參與程序設計大賽,參與教師項目或者申請學校的創新創業項目。通過競賽和項目進一步提高學生的理論水平,提升動手能力,促進學生主體的個性化發展。 2? 考核方式改革 合理的課程考核機制可以檢驗學生對課程的學習掌握情況,幫助教師不斷總結經驗,改進教學方法,同時也能對學生的學習成績做出客觀公正的評價,引導其明確學習方向。考慮到程序設計類課程實踐性強的特點,一方面引入多樣化的考核方式來綜合評價學生的學習態度和學習效果,另一方面將筆試改為上機考試來檢驗學生的實際編碼水平。 2.1? 考核方式多樣化 大學教育的目的是讓學生通過專業課程的學習掌握專業技能,不能唯分數論,所以大學課程也不宜單憑期末考試成績來判定學生的學習情況。“C++程序設計”課程的考核采用考勤、實驗成績、期中考試和期末考試相結合的方式,從多個維度來考察學生的學習態度和知識水平。 平時實驗練習是本課程的重要環節,由于學生對知識的掌握情況不一樣,實驗課程的題目難易程度一般控制在大部分同學在實驗學時內能夠完成,但是一些基礎較差的同學課堂上不能全部按時完成,課后應該給他們補做的機會。實驗成績分為課堂提交和課后補交兩部分,課堂提交的題目得該題的滿分,課后補交題目的得分乘以一定的系數(一般取值0.8)。課堂提交情況考查學生知識掌握的熟練程度,激勵同學們充分利用課堂時間,認真答題,形成你追我趕的競賽態勢。課后補交機制給基礎薄弱的同學提供更多的練習時間,同時能夠考察學生的學習態度。對于一些課堂上不能按時完成,課后又不補交的同學及時給予關注,避免后進生放棄課程的學習。 2.2? 上機考試取代筆試 對于“C++程序設計”課程,考核代碼的編寫能力是必須的,在傳統的筆試中,學生在紙上寫的代碼不易辨認,給批卷帶來困難,而上機考試作為一種新型的考試模式引起了越來越多高校的探索和應用。程序設計類的課程是實踐性很強的課程,注重對學生的實際動手能力的考察,直接上機編程的考試方式更能考察學生的實際動手能力和知識掌握水平,所以課程的期中考試和期末考試都是采用上機考試的方式[8],如圖4所示。考試時允許學生帶紙質資料,禁止攜帶任何電子資料。考試期間關閉機房外網環境,避免學生上網查找資料。考試時間為三小時,包含五道或六道必做題和一道選做的附加題。必做題一般按照從易到難的順序設置,涵蓋了課程基礎內容和重要的知識點,例如類的定義、構造函數、拷貝構造函數、靜態成員與友元、繼承、多態、運算符重載、模板等重點內容。附加題綜合性較強,難度較大,一般只有少數基本功非常扎實的同學能完成。 上機考試能夠更有效地考察學生的實際編程水平,在課程一開始就告知學生課程的考核方式,促使學生重視平時的實驗上機練習,切實提高動手實踐能力。 3? 教學改革效果 通過在教學方式和考核方式等方面的改革,充分利用OJ系統、草料二維碼和微信等信息化工具,我校“C++程序設計”課程教學效果有了很大的提升,更多的學生能夠在實驗課上完成所有的實驗題目,并且在課后積極與教師探討課程問題。很多學生在完成課程內容的基礎上參與到教師的科研項目中,或者參與各種程序設計類型的競賽,例如ACM和藍橋杯等競賽,我校學生都有獲得不錯的獎項。 我校每個學期末學生需在教務系統對教師的課程教學情況進行評價,評價指標涵蓋課堂氛圍、教學方法、知識掌握情況等多個維度,很大程度上反映了學生對課程和教師的滿意程度。經過教學改革,本門課程的教學評價平均分從85.3分提升到88.5分,尤其是在“本門課使我在相關能力方面得到提高”選項下滿意度從87.22%提升到96.08%,表明更多的學生認可通過課程的學習提高了編程能力。 4? 結? 論 經過多個方面的教學改革,雖然大部分學生通過“C++程序設計”課程的學習掌握了必要的編程技能,切實提高了學生的動手實踐能力,但是每個年級會有一小部分學習態度不端正的同學,平常不好好上課,遇到問題既不思考也不求助老師,碰到不會的實驗題目抄襲同學的代碼。當前,需要通過人工比對代碼的方式來判斷是否存在抄襲現象,效率不高,很難完成所有學生代碼的比對。一方面,需要在課程一開始就跟學生強調抄襲的后果和問題的嚴重性,將想要抄襲的火苗扼殺在搖籃里;另一方面,后續要借助查重工具來判別抄襲情況,在代碼提交到OJ系統時由系統自動完成代碼相似度檢測,從而快速甄別出抄襲的代碼。 參考文獻: [1] 孔麗英.C++程序設計的教學改革 [J].軟件工程,2017,20(7):57-59. [2] 黎明,文海英,杜敏.基于學科競賽的編程類課程教學改革 [J].計算機教育,2014(13):72-74. [3] 林子慧.面向在線判題系統的程序設計教學方法的研究與實踐 [J].無線互聯科技,2021,18(15):156-158. [4] 傅幼萍.Python課程線上線下混合式教學創新模式探索 [J].計算機時代,2022(12):135-138+142. [5] 陳立前,董威,尹良澤,等.面向代碼質量提升的軟件工程能力素質培養 [J].軟件導刊,2022,21(7):1-5. [6] 成尚榮.高水平因材施教是教育高質量發展的必然命題 [J].人民教育,2021(18):34-38. [7] 陳鑫.高校程序設計課程教學研究與實踐 [J].長治學院學報,2022,39(2):97-100. [8] 高潔,于健,劉志強,等.程序設計類課程思政教學改革探索與實踐 [J].軟件導刊,2023,22(4):186-190. 作者簡介:汪香君(1982.05—),女,漢族,湖北黃岡人,實驗師,碩士,研究方向:人臉識別、深度學習;劉會芬(1983.11—),女,漢族,湖北黃岡人,實驗師,碩士,研究方向:物聯網應用、軟件工程。