章品正
(東南大學計算機學院,江蘇 南京 210096)
“程序設計實踐環節”是“C++程序設計”的后續課程[1]。通?!癈+程序設計”的教學環節中以逐個知識點的教學為主,因而學生缺乏系統的實踐鍛煉?!俺绦蛟O計實踐環節”強調系統的實踐,使得學生有機會系統地掌握知識,增強發現并糾正編程錯誤的能力,培養查閱文獻資料及維護編程文檔的習慣[2]。通過該環節的培養,對于學生后續專業課程學習和畢業設計工作實施都大有裨益[3-4]。但目前由于教學條件的限制,該課程教學面臨教與學兩方面問題[5]。
一方面是當前本科教學過程中,一年級基礎課程量大,分配給程序設計課程的時間有限,而大部分學生在入學之前都沒有編程經驗。另一方面,是教師授課時偏重語法要點,而忽視程序設計的根本在于解決工程實際中的問題。
為了解決以上問題,本文提出以培養學生學習興趣為核心,結合啟發與互動式教學的“程序設計實踐環節”教學模式:①針對具備較好編程基礎知識的計算機專業學生,可將教學重點放在培養學生解決實際問題的能力上。在教學方法上突出學習興趣的培養,突出編程實踐能力與習慣的培養,提高課堂外自學能力;②將“C++程序設計”課程的春季學期后半程學習與“程序設計實踐環節”的教學相結合,做到實踐教學提前介入,使得該課程橫跨春季學期與短學期。春季學期設置12學時的授課與20學時的上機輔導用于布置任務及程序設計模式的教學。我們將任務分為基礎鍛煉部分(計算器與模板編程)和擴展訓練部分(設計一個教師指定的管理系統)。完成該任務可視為達到擴展訓練部分的要求;③學生必須利用暑假時間完成基礎鍛煉部分的任務及擴展訓練部分的編程準備,同時告知用于暑假學習答疑的網絡答疑聯系方法。
“程序設計實踐環節”教學方案設計時,可以根據學生是否愿意結合自己需求與遇到問題進行任務設計將學生分為兩類(甲類和乙類),分別給出具體的實施方案。通過這種方式可以讓所有的學生均得以提高自身的編程能力。
對于甲類學生,我們采用了以下實施方案。
1)在布置任務階段就明確告知學生,對于自選題目的考核不是僅看最后結果,還注重問題的發現及平時資料的獲取收集。我們注重過程鍛煉且允許失敗。考核要求為在完成自選題目過程中作好記錄與階段總結。階段總結包括:①在題目方案設計階段的資料總結、方案設計報告和面向對象程序設計說明;②在方案實施階段對于遇到的問題以及解決方法的記錄,平時小組討論的記錄;③題目完成后的成功經驗匯總或題目完成失敗后的經驗總結。
2)在程序設計教學實踐環節的開始階段明確鼓勵學生按照特長與興趣進行組隊,通過團隊協作培養學生分工合作、互相討論與幫助。
3)在題目完成過程中,支持模仿更鼓勵集成創新。學生要通過各種途徑查找與自己需求相關的算法與范例,通過適當改進算法與范例并應用到自己的程序當中,使得程序更加穩健合理。
4)要求所有選擇組隊完成自己設計任務的學生,必須在春季學期完成兩道基礎題目(計算器和使用模板設計矩陣計算)。對于能夠完成的學生,要求他們在暑假期間充分做好調研,同時完成軟件系統設計工作。要求組長完成程序框架的設計以及功能模塊的劃分。如果該學生不能按時完成,則要求他轉入普通組。
5)教師要在短學期了解各個項目小組的工作進展并給予指導。采用小組答辯形式進行最終評分,評分時邀請其余項目小組中完成較好的學生加入評委組,對各個項目小組的成果進行答辯式評審。
在目前經歷過的五輪教學過程中,能夠完成以上實施方案的甲類學生不足三成。對于其余學生即乙類學生,則編為普通組,對他們的能力培養采用以下實施方案。
1)根據學生已掌握的基本知識和基本技能,選擇合適的題目。確定計算器和使用模板類設計實現矩陣計算這兩道題目作為基本題目。學生通過這兩道題目的練習能夠融會貫通已經掌握的知識,調動學習積極性,積累展開進一步學習的信心。
2)對于在春季學期沒有按時完成這兩道基礎題目的學生,要求在暑假期間通過網絡手段與教師及時交流來解決問題。對于完成這兩道基礎題目的學生,則利用暑假期間做好在短學期完成擴展訓練題目的準備。包括系統的軟件結構體系的設計與必要知識的儲備。
3)短學期期間,教師通過一對一的提問,并根據學生的回答給出其平時成績的得分。教師在短學期結束時候,結合學生平時表現及編別程序代碼的有效性以及實驗報告的規范性,給出每個學生的最終評分。
上述方案已在我院三屆學生中實施,取得了很好的效果。對于乙類普通組學生,我們將重點放在基礎能力鍛煉上,加強實驗環節的編程實踐,使得學生在每一次上機之前做好準備,明確實驗中需要完成的任務并在規定的時間內完成任務。對于甲類學生,在實驗講解中提示要點,讓學生帶著問題更主動地投入課后學習和課間答疑討論中。我們還鼓勵2~4名學生組成項目小組完成較大規模的自擬題目,并由學生自己確定解決方案。課程結束后,由學生上講臺答辯。
在具體實施中,我們對橫跨兩個學期的程序設計實踐課程成績的評定方式進行了改革。將評分工作分解為對學生平時學習態度的記錄,對學生課后自學情況的評價;通過實驗過程交流對學生在實驗中的回答情況進行考評,結合學生最終提交項目報告與學生答辯情況進行綜合評分。
在近三年的教學實踐過程中,涌現出許多優秀的學生項目,現在僅舉兩例進行說明。
一組學生以自學的方式掌握Visual Studio 2008開發環境后,研發了一款比VC 6.0更加界面友好的科學計算器。他們在算法方面自學逆波蘭式知識,使設計的計算器功能更加完備。相關的文檔和軟件源代碼可在東南大學計算機學院影像實驗室網站上下載(http://www.imagetech.com.cn/zh-hans/node/176)。程序界面如圖1所示。

圖1 計算器運行界面
另一組學生解決了學習英語過程中遇到檢索單詞的困難。例如,看到brunt(中文意思是沖擊),有時會錯想到“直率的”,但查閱普通字典,甚至金山詞霸都很難直接從中文意思檢索到英文該詞或其相似詞。針對這個問題他們提出基于動態規劃的有限分隔最長公共子串算法與改進的最小編輯距離算法進行相似單詞查找與比對。在操作時通過輸入待查詢字符串,即可實現詞庫內相似單詞搜索。搜索結果按相似度降序列出。如單詞本身存在于詞庫中,通常第一個輸出單詞是原單詞。如果輸入單詞錯誤,此程序可給出拼寫正確的相似單詞,因而也可以用作帶有拼寫糾錯功能的軟件。除了相似單詞搜索,目前還能夠結合輸入單詞子串和單詞意思進行查詢。例如“+escent”搜索含有子串“escent”的單詞,“=花”搜索詞義中含有“花”的單詞。程序最終結果聚類輸出,使得相似度接近的被分到同一類。他們開發的智能字典圖形運行界面及以“blunt”為輸入的相似匹配結果如圖2所示。程序源代碼可在如下網址 http://www.imagetech.com.cn/upload/luckzpz/DictionarySource.rar下載。

圖2 智能字典圖形用戶界面
本文針對程序設計的實踐環節現在存在的問題,探討了培養學生的學習興趣的途徑與鍛煉學生分析問題、解決問題能力的方法。同時介紹了近年來在該課程教學改革中取得的經驗與成果。實踐表明,本文提出的方法有利于學生掌握和鞏固已學到的語法知識,有利于培養規范的編程習慣,為后續課程、課外研學和畢業設計打下良好的基礎。同時對于部分優秀學生培養了他們自學能力、團隊合作能力與自我表達能力。
[1]教育部高等學校計算科學與技術教學指導委員會.高等學校計算機科學與技術專業發展戰略研究報告暨專業規范(試行)[M].北京:高等教育出版社,2006
[2]Matthias Felleisen.How to design programs[M].北京:人民郵電出版社,2003
[3]耿國華.程序設計能力培養模式的探索與實踐[J].北京:中國大學教學,2009,3:30-32
[4]賴曉晨.程序設計課程創新教學模式探索[J].北京:中國大學教學,2008,7:42-44
[5]張敏霞.程序設計語言課程教學方法改革的探索與實踐[J].北京:中國高教研究,2004,2:90-90