摘要:本文針對程序設計課程提出了一種以在線實踐為導向的教學新思路。首先確定了課程的教學主線,然后具體地闡述了這種新思路,最后為適應這種新的教學思路,重新設計了課程的教學內容。
關鍵詞:課程主線;競賽驅動;在線實踐導向;課程設計
中圖分類號:G642文獻標識碼:B
1引言
程序設計課程是高校面向理工科專業(yè)開設的課程,采用C、C++、Java等語言講授。這門課程的目的是培養(yǎng)學生基本的程序設計方法和能力。這門課程一般是在大學低年級開設,學生沒有程序設計語言的基礎,因此以往的教學方法多偏重于某種語言的語法知識教學,或者在講述語言語法知識時少量地穿插講解程序設計的基本思想和方法。然而我們在教學中體會到,一方面,由于語法體系的龐大與規(guī)則的嚴謹,幾十個課時無法把語法知識面面俱到地講授;另一方面,語法內容講得太多,對初學者來說無疑是難以在短時間內理解和接受的。剛接觸這門課的時候,學生的積極性大多都比較高,因為他們覺得學了這門課程后,可以自己編寫程序,解決實際的問題。然而學生們很快發(fā)現,即使經過一個學期學究式的語法教學后,也只能編寫一些很小的程序,這些小程序根本無法解決實際的問題。這極大地打擊了學生學習后續(xù)相關課程的積極性。
另外,現在現成的應用軟件很多,如各類可視化開發(fā)工具,Delphi、VC、VC.NET、VB、PB等。很多學生接觸到這些軟件后,熱衷于開發(fā)一些簡單的應用程序,忽視了對程序設計思想和方法、算法分析與設計能力和意識的培養(yǎng),并對程序設計基礎、數據結構、算法分析與設計等課程的認識陷入了一個誤區(qū)。他們認為軟件開發(fā)不過是拖動一些控件、編寫簡單的腳本就可以了,不需要理解很多復雜的數據結構,也不需要注重算法設計和分析能力的培養(yǎng)。
這些問題和現象引起了我們的思考:程序設計課程應該以什么為主線?課程的教學應該采取怎樣的思路進行開展才能確保教學不偏離這條主線?這門課程的內容應該怎么設計?這些都是本文將要探討的問題。
2課程主線
程序設計課程應該以程序設計語言的語法知識教學為主線?還是以程序設計思想和方法的培養(yǎng)為主線?我
們認為,這門課程的主線應該以程序設計思想和方法的培養(yǎng)為主,以語言教學為輔。原因有兩點:
第一,語言語法知識的講授應該以應用為導向,這些應用就具體體現了程序設計的思想和方法。針對大三、大四學生的調查表明,如果問他們程序設計類課程學了什么?他們會回答學了指針、函數。但再具體一點地問,指針有什么用,函數怎么定義,就不知道了。因此以程序設計語言語法知識為主線的教學方法無法讓學生真正理解和掌握程序設計的思想和方法。而以程序設計思想和方法的培養(yǎng)為主線,既能在較大程度上避免枯燥的語法知識,又能引起學生的興趣,從而接受和理解這些思想和方法。比如以數值型數據的處理為線索,就可以串起大部分C/C++語言語法知識,而數值型數據的處理對學生來說是比較容易理解和接受的。
第二,程序設計課程中可以也必須向學生系統(tǒng)地講授程序設計的思想和方法。以前的教學方法在講授語言語法的同時,也會穿插講一些程序設計的思想和方法,但對初學者來說,不經意間的講授往往不能引起重視。系統(tǒng)地講授程序設計基礎思想和方法,才是程序設計課程的主線。
舉個例子,遞歸以前往往是放在函數這一章講的,學生即使理解了遞歸函數的執(zhí)行過程,掌握了遞歸函數定義方法,也難以明白在什么時候需要用到遞歸函數。其實遞歸是程序設計的重要思想,遞歸函數只不過是遞歸思想實現的方法。
再舉個例子,以前在講循環(huán)結構時,會例舉很多使用一重循環(huán)、二重循環(huán)的例子。比如“求x2 + y2 = 2000的正整數解”,需要判斷所有(x, y)組合,其中x和y的取值范圍都是:1、2、…、44。對于在這個范圍內的所有組合,都判斷一下是否滿足x2+y2=2000。這個過程需要用二重循環(huán)結構來實現,但從算法的角度看,這個二重循環(huán)結構包含的算法思想就是枚舉。初學者不會意識到,這就是算法,這就是程序設計的思想。這些思想才是程序設計的精髓,才是真正要掌握的。
確定了這門課程的主線后,課程教學應該采取怎樣的思路進行開展才能確保教學不偏離這條主線?
近十幾年來,各種程序設計競賽開展得如火如荼,尤其是國際大學生程序設計競賽(ACM/ICPC)在各高校開展的規(guī)模與影響逐年擴大。這些競賽不僅給眾多程序設計愛好者提供了一個展示自己分析問題和解決問題的能力的機會,也給程序設計初學者提供了一個實踐程序設計思想和方法的平臺。另外,隨著各類程序競賽的推廣,各種程序在線評判(Online Judge,簡寫為OJ)網站也應運而生,這為程序設計類課程提供了一種新的實踐方法——在線實踐。
正是在這種背景下,我們在程序設計課程中提出并實踐一種新的教學思路:以競賽為驅動、在線實踐為導向、以課程設計進行強化的教學思路。
3教學思路
我們在教學中,以ACM/ICPC競賽為驅動,激發(fā)學生的學習興趣和競爭意識,培養(yǎng)學生的主動思維能力。另外,我們也借助國內外著名的OJ網站,培養(yǎng)學生獨立分析問題、解決問題的能力,以及分組討論、團隊協作、文檔組織等能力。在課程的最后階段,我們以課程設計強化學生的學習效果。
3.1競賽驅動
我們在教學中發(fā)現,大部分學生仍然把考試作為課程的目標,失去了學習的動力。我們在多年的程序設計競賽培訓中深深地感受到,學生成功地解決出一道題所獲得的成就感甚至勝于在考試中取得好成績,但程序設計課程以前的教學過程很難讓學生獲得這種成就感。另外,在組織學生參加程序設計競賽中,我們從低年級學生的參賽熱情中發(fā)現這種形式的競賽對程序設計類課程有很大的激勵作用。
因此有必要在程序設計課程的教學中引入ACM/ICPC競賽的訓練方法與評判規(guī)則,以競賽為驅動,激發(fā)學生的學習興趣和競爭意識。
3.2在線實踐導向
程序設計課程傳統(tǒng)的教學實踐通常是由老師布置題目,學生編寫程序,由老師來評判程序的正確與否。這種形式的教學實踐既缺乏激勵機制,難以引起學生的興趣;又因為需要人工評判程序,評判結果不及時且?guī)в兄饔^性。而在線實踐不同于傳統(tǒng)的教學實踐,它指由OJ網站提供試題,學生在線提交程序,OJ網站的在線評判系統(tǒng)實時反饋評判結果。這些試題具有趣味性、挑戰(zhàn)性,而且評判過程和結果公正及時,能引起學生的極大興趣。
OJ網站上收錄的題目大多都是ACM/ICPC各級別競賽的題目。本文將從這些題目的類型、題目特點、以及OJ網站評判方式等角度,分析這些題目在提高學生程序設計能力、培養(yǎng)學生算法分析與設計意識等方面的作用。
(1) ACM/ICPC題目類型簡介
ACM/ICPC競賽題目的類型覆蓋了貪心、動態(tài)規(guī)劃等優(yōu)化算法,以及數論、圖論、計算幾何等各領域的基礎算法。據統(tǒng)計,競賽題目的題型及比例如表1所示。
我們認為,部分算法的樸素思路可以在程序設計課程中講授。例如一些求解問題的樸素思想如枚舉、模擬等,在實現時并不需要復雜的數據結構,也沒有復雜的算法,非常適合在程序設計課程中介紹。又如ACM/ICPC競賽中的大數運算問題,其實就是轉化成字符數組(或整數數組)的處理,是數組應用的深化,這種難度的題目對初學程序設計的學生來說是可以接受的。學生在掌握好這些基本算法、具備基本的算法分析與設計能力后,在后續(xù)課程中學習更復雜的算法時就相對容易些。
(2) ACM/ICPC題目特點
一道完整的ACM/ICPC題目通常包含5部分:題目描述、輸入描述、輸出描述、樣例輸入、樣例輸出等。
1) 題目描述:題目通常不會直接告訴要求解一個什么問題,而是以一個故事或者一個游戲作為背景知識引入的,所以題目描述通常會比較繁瑣,但也更具趣味性。
2) 輸入、輸出描述:給出題目對輸入輸出格式的要求。
3) 樣例輸入輸出:為了便于理解題目,以及測試程序的需要,題目中會給出幾組正確的輸入輸出數據。
ACM/ICPC題目的特點是每道題目都需要處理多組測試數據。其目的有兩個:一是為了測試輸入數據各種可能的情況,防止作弊,二是可以測試算法的優(yōu)劣及運行時間。
ACM/ICPC題目的這個特點完全有別于以前教學過程中布置給學生的練習題,這些練習題通常只有一組數據,處理完這組數據,程序就結束了。用這組數據判斷程序正確與否帶有很大的偶然性。而學生在完成OJ網站上的題目時,程序正確與否完全由評判系統(tǒng)客觀地判定。學生編寫的程序即使通過了題目中給出的樣例輸入數據,也未必正確。因為題目中的樣例輸入數據通常只是用來幫助用戶理解題目,并不能反映題目中輸入數據的各種情形。為了驗證程序的正確性,用戶必然要多擬一些測試數據進行測試。因此,ACM/ICPC的題目能培養(yǎng)學生測試程序方面的意識。
(3) ACM/ICPC評判方式
在OJ評判系統(tǒng)的服務器端,每道題目還會有輸入數據文件和標準輸出數據文件。輸入數據文件用來測試用戶提交程序,該數據文件通常能測試到題目所需要考慮的各種特殊情況。標準輸出數據文件是由標準解答程序根據輸入數據文件得到的正確的輸出數據文件。評判系統(tǒng)就是將用戶的輸出文件與標準輸出文件進行對比從,并將評判結果及時反饋給用戶。ACM/ICPC題目對輸出要求是極其嚴格的,只要程序考慮不全面或者格式不對,程序就不可能通過。這種評判方式保證了評判結果及時公正。
另外,每道ACM/ICPC題目都有時間限制和內存空間限制,這就要求學生在設計算法時初步考慮算法的復雜度。盡管低年級的學生還不具備算法復雜度分析的能力,但這種訓練方式對培養(yǎng)他們算法分析方面的意識無疑能起到很積極的作用。
學生在OJ上提交程序時,通過OJ系統(tǒng)反饋回來的評判結果反復修改程序,一直到最終收獲Accept(程序正確)。這個過程不僅能培養(yǎng)學生獨立分析問題、解決問題的能力,而且每成功解決一道題目都能給學生帶來極大的成就感。
3.3以課程設計進行強化
通常的觀點是程序設計課程教學的只是程序設計語言語法和基礎的程序設計方法,低年級的學生無法完成實際意義上的課程設計任務。另一方面,很多學生到畢業(yè)設計階段才發(fā)現還沒掌握相關開發(fā)工具,需要花大量的時間去學習開發(fā)工具,或者由于沒有一定的軟件開發(fā)經歷而對畢業(yè)設計無從下手。程序設計類課程設置課程設計的目的就是要從低年級開始就給學生提供軟件開發(fā)經歷。
我們認為,低年級學生通過3人左右的團隊協作,是可以完成500~1000行代碼的課程設計的。而且通過團隊協作,可以讓學得比較好的學生帶動學得比較差的學生,激發(fā)他們的學習積極性。
我們對課程設計的選題采取老師布置和學生自選兩種形式。其實很多ACM/ICPC題目是取材于一些經典游戲,通過對這些游戲的規(guī)則進行簡化來構造題目。學生在做這些題目的時候就會有自己的想法,他們會主動思考能否把題目的游戲規(guī)則進行完善,把程序擴充,這樣就能找到一個很好的課程設計題目。
另外對課程設計的考評,我們采用提交程序說明書、團隊答辯等形式,既可以讓學生對軟件開發(fā)和軟件工程有一些簡單的理解,以及對今后的畢業(yè)論文答辯有較早的認識,也可以培養(yǎng)學生的口頭表達能力、文檔內容組織能力等。
4教學內容設計
為了適應這種新的教學思路,有必要對這門課程的教學內容重新設計,并且在設計教學內容時必須保證整個教學圍繞課程主線進行。課程的教學分為理論教學和實踐教學兩部分。這些內容的安排及課時分布如表2所示。
理論教學內容設計的思路是:先用盡可能少的時間介紹編寫一個程序所需的最小語法知識集,然后講解常用的程序設計思想和方法;最后是課程設計。選講的語言知識的選取有兩個原則:第一個原則是先用先學,比如講解函數時只要求學生能根據問題求解的需要去定義函數即可,像函數重載、函數模板、有默認參數的函數等等這些內容可以放在以后有應用需要時再講授;第二個原則是在后面章節(jié)才會用到語法知識,則放到后續(xù)章節(jié)的開頭作為相關基礎知識來講解,比如所有字符型數據處理的內容都放到第二部分中“字符及字符串處理”,作為基礎知識來講解。
實踐教學第一部分內容的安排有兩條思路:①從模仿例題→到改寫例題→再到獨立編寫程序,使得學生從第一堂實踐課開始就可以編寫一個完整的程序;②從分析程序執(zhí)行結果→到分析程序執(zhí)行過程→到最終調試程序,以培養(yǎng)學生獨立分析問題、解決問題的能力。
實踐教學第二部分內容是模擬實際競賽的組隊方式,以3人一組,實踐內容是分組討論課堂上講解過的例題的算法思想,以及在OJ上完成練習題。分組討論的形式能培養(yǎng)學生的口頭表達能力、團隊協作能力,往往經過討論以后,學生對算法思想有更深刻的認識,能形成自己的見解。考核方式也不僅僅是提交程序,還要提交解題報告,這可以培養(yǎng)學生的書面表達及文檔組織能力。
實踐教學第三部分內容是課程設計,通過集中2周的時間完成課程設計。課程設計環(huán)節(jié)是本課程的重要環(huán)節(jié),是對教學效果的進一步檢驗。
5結束語
我們提出的以競賽為驅動、以在線實踐為導向、以課程設計強化的教學思路,是我們在教學中不斷摸索和實踐總結出來的。在實際的教學中,這種教學思路也逐漸展示
其優(yōu)勢。通過教學,學生的程序設計與調試能力以及算法分析與設計意識在整體上有明顯提高,有效地促進了后續(xù)課程的學習,還有部分優(yōu)秀學生在浙江省大學生程序設計競賽中多人次取得各等級獎項。
我們相信,在程序設計課程中,只要教師不斷地進行教學改革探索,培養(yǎng)學生的學習興趣,調動學生的積極性,學生就能夠學好這些課程,并使學生在不斷地享受學習成功的體驗中提高創(chuàng)新意識與創(chuàng)新能力。
參考文獻
[1] 王桂平,馮睿. 以競賽為驅動的程序設計課程教學[C]. 合肥工業(yè)大學學報(社會科學版),2007,(全國第二屆計算機程序設計類課程教學研討會專輯).
[2] 李文新,郭煒,余華山編著. 程序設計導引及在線實踐[M]. 北京:清華大學出版社,2007.
[3] 王宏,吳文虎. 清華實踐教學“賽課結合”新思路[J]. 計算機教育,2006,(07):10-12.
[4] 吳文虎. 抽象思維和邏輯思維是程序設計的基礎[J]. 計算機教學,2005,(4):29-30.
[5] 吳文虎. 計算機程序設計基礎課程改革[J]. 中國大學教學,2004,(2):13-14.
An Online-Practice-Guided Teaching Idea in Course of Programming
Wang Gui-Ping, Feng Rui
(Information school, ZheJiang University of Financial and Economy, HangZhou 310018, China)
Abstract: This article presents a new teaching idea, online-practice-guided teaching idea, in course of programming. First of all, it establishes the main thread of the course. And then, it expounds in details the teaching idea. This article especially analyzes the difference between traditional practice and online-practice, and generalizes the roles of online-practice in improving students’ ability of programming, cultivating students’ consciousness of algorithm analyses and design when programming, etc. Lastly, in order to adapt this new teaching idea, this article redesigns the main contents of the course.
Keywords: main thread of the course, contest driving, online-practice-guided, course exercise