摘 要:本文從程序設計課程教學現狀出發,提出了程序設計教學中需要從編程方法、編程風格及規則的引導出發,在重視算法教學的基礎上,引導學生在程序設計過程中開展研究性學習,從而提高程序設計的質量。
關鍵詞:程序設計 教學 算法
程序設計是我國高校各專業學生必修的一門核心課程,該課程的教學目的是使學生掌握程序設計的基本方法和理論,應用某一程序設計語言編寫具體的程序。程序設計的教學質量將影響到學生的程序設計能力,影響到學生創新思維的培養。
一、程序設計課程教學現狀
“程序設計”課程長期沿襲傳統教學模式,即以一種高級語言的語句體系為脈絡展開教學,詳細地講解其語句、語法甚至一些細節內容,學生每學習一個語句需要做一些與該語句有關的習題。課程枯燥無味,學生學習積極性不高,很少動手實踐。課程學完后,學生除了學到一些呆板的語句外,收獲甚微。
1.理論基礎薄弱
有些教師過分重視程序設計語言的教學,而對于程序設計中所涉及的程序設計理論、程序設計的方法和算法的設計思想等理論知識的講解不夠深入、透徹。
2.學生缺乏創新能力
學生可以解決那些和已經學過的知識有直接或有密切聯系的問題,而面對一個需要用已經學過的知識進行綜合求解的程序設計問題時,就不知從何下手,對所學知識做不到舉一反三,缺乏程序設計的創新能力。
3.動手能力不強
學生實際動手能力差,具體表現在兩個方面。其一,學生上機調試程序的能力差,難以找到錯誤產生的原因;其二,實際編寫程序的能力不強,編寫的程序功能不夠完善,風格不一,程序健壯性差。
針對以上出現的問題,我們認為應該在教學過程中對學生各方面的編程素養進行引導和培養。
二、編程方法引導
程序設計的觀念雖然發生過很多變化,但程序的基本結構仍然是順序、選擇和循環三種。因此,在學生初學程序設計時就應該注意滲透結構化程序設計的思想,以便使學生養成良好的程序設計習慣。
我們這里談的不是純粹的程序設計方法,如結構化的、面向對象的等,而是在教學中滲透程序設計的技巧。這里舉一個結構化程序設計的例子。
例:求100以內的素數。
經過分析可以發現,除了“2”以外,偶數不可能為素數,所以外循環有50次是多余的,同理在內循環中,也不必用偶數測試。再進行分析又發現,一個合數最小的因子不會大于它的平方根,所以內循環中的次數被再次減少。最后程序變為:
通過不斷改進程序,可以使程序效率得到不斷提高,當然這些提高是在數據規模不斷增長時才能體現出來。盡管現在很多人認為硬件的速度發展很快,我們應該把速度提高的任務交給硬件去實現,這樣的想法未免過于武斷。姑且不論類似上述的技巧對于程序執行效率的提高有多少益處,單從基于問題的學習方法這個角度的出發,程序的衍生對于提高程序員的編程水平也是一個很好的訓練方法,所以這樣的編程技巧是不可多得的,我們在教學過程中就是要進行這方面的引導。
三、編程風格和規則引導
前面提到我們在進行程序設計教學時,傳統教學模式比較少注意編程風格和規則的引導,所以很多時候,學生編制出來的程序都是一路下來齊刷刷,缺乏良好風格,死套語法,缺乏考慮可能的不安全因素。
由于學習程序設計是一個循序漸進的過程,所以在教學中如果潛移默化地引導學生從程序設計入門開始,就注意程序設計的一般風格和應該遵守的規則,就能讓學生更快更好地編制出高質量的程序來,并且具備良好的編程習慣。
舉例說明。我們知道,free和delete都可以把指針所指的內存給釋放掉,比如:
這段程序運行一定沒問題,但如果在其后加上這樣一段代碼:
我們會發現出錯了!這是因為,p所指內存被釋放,但是p存放的地址值仍然不變,即p成了“野指針”。盡管嘗試用if(p!=NULL)來判斷p的可用性,我們卻發現出錯處理并沒有起作用。所以,良好的習慣是在free和delete后,都要對指針作置空處理,即p=NULL。有人會說如果要這種情況出現在程序結束時,一切指針也會消亡,動態內存也會被操作系統回收,所以P置空是多余的。但是如果有人將這段程序取出來用到其他地方會怎樣呢?結果不是我們想見到的。
四、算法設計概念的引入
程序=算法+數據結構。這就提出我們在進行程序設計教學過程中,不僅要重視語法的講授,也要重視算法的講授,甚至是要將算法提到更為重要的地位。程序設計是要解決問題,語言只不過是為解決問題而使用的工具,真正解決問題的是算法,難怪專家說“算法是魂,程序是衣”。
如在C語言程序設計課程教學中,當完成分支結構程序、循環控制和數組,進入內容較多的算法設計教學后,我們將教學內容分為以下五個方面。
(1)一般數據組織算法:查找、排序、字符串處理、求素數、篩選、迭代、窮舉等;
(2)函數調用,函數嵌套歸、遞推及貪心算法等;
(3)指針算法,動態內存分配,鏈表等;
(4)用矩形法、梯形法計算定積分、模擬算法的隨機抽樣、蒙特卡羅法等算法;
(5)文件數據處理。
在課堂上增加算法設計的分析和討論,強調算法設計的優化和程序的優化,是提高學生分析和解決實際問題能力的有效方法。
五、開展研究性學習
在程序設計過程中,開展研究性學習,是為了提高學生分析和解決實際問題的能力,主要是通過對解決問題的算法進行研究而展開的。由于課時所限,并且學生沒有足夠的實踐經驗,所以對算法問題的研究也是初級的,主要是討論典型問題的典型算法及其應用。
1.通過研究性學習,可以重構知識體系,加深對算法的理解。
研究性學習是學生在教師的指導下,選定主題,然后搜集相關材料,對材料進行歸納、加工處理、分析、總結得到相應結論的學習活動。在教學中,可以根據教學內容,經過反復研究,確定研究主題,并根據學生的自愿報名成立研究小組,如搜索算法研究小組等。然后各小組根據自己研究的算法,重新整理相應的知識,對知識進行歸納、總結。通過對各種算法知識進行整理、分類、小結,加深學生對這些算法的理解。
2.通過研究性學習,同學之間取長補短,共同提高。
每個學生都有所長,也有所短,研究性學習一個重要特點就是:分工合作,共同討論,共同提高。我們可以根椐學生的特點、特長,對他們進行分工,每位學生研究一種算法其中的一個問題,然后整個小組一起討論,每位學生介紹自己的研究情況、研究成果,然后其他同學進行補充,發表自己的見解,這樣每個學生都使自己的研究內容得到補充,同時也學習到了其他同學研究方面的知識,可以取長補短,共同提高。
3.通過研究性學習,總結算法的應用規律,提高程序設計能力。
在進行研究性學習時,除要求學生歸納、整理專題算法知識外,還要總結出算法的應用規律、應用算法解題的步驟和算法的框架。學生通過自己對算法應用規律的總結,對算法的應用得到升華,進一步提高算法的應用能力和程序設計能力。
4.通過研究性學習,提高分析問題的能力、算法表達能力和歸納、綜合能力。
對算法的專題研究,不僅要對算法理論進行總結,算法應用的研究也是很重要的一方面,通過算法的解題應用,既提高了學生分析問題的能力,也加深了學生對算法的理解,提高了學生的算法應用能力。另外,我們在算法研究過程中,要求學生透徹理解算法內容,用算法語言準確描述算法,通過這種途徑進一步加深學生對算法的理解,同時也提高了學生的算法表達能力和歸納、總結的能力。
結論
我們認為在程序設計教學中,要改革舊的教學體系,需要用新的理念、新的內容、新的方法組織教學。首先要用先進的程序設計理論指導教學,并加強編程算法、邏輯思維和編程方法的引導。其次,重視和鼓勵學生對具體問題進行分析和研究,勤于動手和上機訓練,養成良好的編程習慣。此外,對不同層次的學生可以進行分階段教學,前一階段講授基本的程序設計方法,除了講授程序設計語言的基本語法,還對學生進行編程方法及程序設計風格的引導;后一階段主要講授程序設計的較高級的語法和功能,提高學生對算法的認知和重視程序,并且在學生中開展研究性學習,培養學生實際動手能力。
參考文獻:
[1]李云清等.程序設計創新能力的教學研究[A].全國計算機新科技與計算機繼續教育論文集2003.
[2]李海倫等.“程序設計”課程教學改革的研究與實踐[J].計算機教育, 2005.7.
[3]豐振.計算機程序設計教學方法研究[J]. 教學研究,2004.9.
[4]孫善武等.淺談程序設計語言課程教學方法[J].吉林大學學報,2005.8第23卷.
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。”