
摘要:為了在程序設計課程中主動地、有意識地培養學生的計算思維,文章提出“建立計算思維的概念,掌握計算思維的方法,培養計算思維的能力”的教學目標,即對C/C++程序設計課程的理論和實踐教學中的各個環節進行改革,弱化對程序設計語言的講解,強化程序設計方法、問題求解過程和方法的講解與實踐。
關鍵詞:計算思維;程序設計;課程改革
計算思維是指運用計算機科學的基礎概念進行問題求解、系統設計以及人類行為理解等涵蓋計算機科學之廣度的系列思維活動。在信息社會中,計算思維是人類進行問題求解的有效工具,是每個人都應該掌握并學會使用的。近年來,由于計算機教育在中學階段的普及,高校新生的計算機操作水平和計算機應用能力普遍提高,“大學計算機基礎”課程教育的核心由原先的以計算機應用能力培養為核心轉變為以計算思維的培養為核心。
在大學計算機通識教育階段,我們對計算思維的培養應當有效地融入每一堂課之中,即在大學階段計算機基礎課程學習的過程中,逐步培養非計算機專業學生在計算機環境下進行問題求解的思路、方法,使學生能用計算機學科獨特的思想、方法來解決專業領域和實際生活中碰到的各種問題,并為將來創新性地解決專業問題奠定基礎。
“C/C++程序設計”是大學生入校第一學年所學的計算機類基礎課程,課程內容能夠較好地體現語言級問題的求解方法,因此這門課也是學生最容易理解計算機求解問題的特點與方法的課程。如何在這門課程中培養學生的計算思維能力,是非計算機專業學生計算思維培養的重要內容,目前已經引起了眾多教育者的關注,并進行了有意義的探索。在本次教學改革中,圍繞計算思維培養這個核心,我們明確了“建立計算思維的概念,掌握計算思維的方法,培養計算思維的能力”的教學目標,有意識地將計算思維的培養融入教學的各個環節,使一系列的教學活動上升到了一個新的高度。
1.建立計算思維的概念
剛剛入學不久的新生在一年級下學期時,對程序設計還是陌生的。作為初學者,他們在學習中往往容易走人誤區,將全部的注意力放在程序設計語言本身,而忽略了學習程序設計課程最應該關注的,也是最能讓自己受益的事情:大腦的思考過程,即如何利用已知的信息解決問題的過程。
針對上述情況,在開學的第一次課上,我們并不涉及C/C++程序設計語言本身,而是從計算思維講起。通過介紹什么是計算思維,計算思維的主要特點以及培養計算思維的重要意義等方面,引導學生建立起計算思維的概念。通過百元買百雞、割園法求圓周率等經典問題的展示,引導學生感受和領悟計算機分析問題和求解問題的過程、思維模式和基本方法,從而讓學生在學習程序設計之初,就在主觀上明確程序設計課程的學習目標不僅僅是學習程序設計語言本身,更重要的是學習計算機分析和解決問題的基本過程和思路,即學會如何把實際的問題轉化為計算機可以解決的問題,如何用計算機的方法求解問題,從而在以后學習的過程中,主觀上積極主動地注重計算思維的培養。
2.掌握計算思維的方法
掌握計算機求解問題的各類方法,是培養學生計算思維的關鍵。以計算思維培養為核心的程序設計課程的重要任務之一,就是要在學習的過程中教會學生程序設計的方法和各類問題求解的算法,讓學生更加深刻地理解計算機解決問題的思路和方法,提升計算思維的能力。C/C++程序設計課程中涉及的程序設計方法和算法如表1所示。
1)教學上以程序設計方法為主導,結合C/C++語言,把程序設計方法學中成熟的理論和方法,如結構化程序設計方法、基于功能抽象的程序設計方法(自頂向下逐步求精的程序設計方法、自底向上程序設計方法)、遞歸程序設計、面向對象程序設計方法等用通俗易懂的語言描述出來。
2)將程序設計中常用到的算法進行了歸類,即枚舉類、排序類、查找類、字符串處理類、字符圖形打印類、數值計算類、遞歸算法等。在教學過程的不同階段,分別引入這些算法。
3)注重通過算法的多樣性使學生深入理解到計算機求解同一問題可用不同的方法,不同的方法適用于不同的情況。例如對數據排序的算法,我們會將選擇排序、冒泡排序、插人排序、合并排序都介紹給學生,并讓學生體會這些算法的不同之處。
3.圍繞計算思維能力培養的教學實踐
在程序設計課程的教學活動中,與計算思維培養相符合的教學方法,如案例教學法、問題驅動教學法等一直在被無意識地使用。在提出了計算思維的背景下,我們對理論教學和實踐教學的各個環節進行了改革,并在教學活動中,主動地、有意識地培養學生的計算思維能力,取得了良好的效果。
3.1理論教學
在理論教學上,我們進行了兩個方面的改革。
1)從計算思維的角度出發,按照問題求解的一般步驟重組經典案例。問題求解的一般步驟為:
問題抽象化的描述,問題表示(如何建立模型);
尋找解決方案,問題求解(如何設計算法);
計算機實現過程,效率(如何有效地求解);
現實問題的延伸。
將問題求解提升到計算思維的高度,使學生在求解問題的過程中,更加深刻地理解計算思維的本質,即抽象化和自動化。
2)將程序設計的語言與問題求解的過程分開。在講解案例時,我們先提出具體問題,后引導學生去體會為了解決問題而產生的大腦思考過程:已知哪些信息,這些信息怎樣轉化為計算機可以理解的形式,要求的結果是什么,怎樣通過已知的信息來求解,并將求解問題的方法,即算法作為教學的重點,讓學生通過算法來理解計算機求解問題的思路。算法的描述可以用自然語言、偽代碼或者流程圖等。學生理解了算法的基本思想后,再引入程序設計語言來實現這一算法,編寫代碼并調試執行。這一方法加強和促進了算法的構建,訓練了學生的程序設計水平,從而簡化了對程序語言的復雜性的理解。
3.2實踐教學
實踐教學以學生自我學習為主,教師提供輔導和答疑。在實踐教學內容的設計上,我們將每一章的教學內容分為程序調試、模仿寫程序和問題求解3個層次,逐步提升學生的問題求解能力。
1)程序調試的案例中,根據以往的教學經驗,將學生容易忽略的細節和易犯的錯誤預設在程序中。通過對預設的語法和邏輯錯誤的查找與修正,使學生更為深刻地理解程序設計語言的特點,夯實學生的語言基礎。由于理論教學中,對語言細節的講解不再作為重點,程序調試變得尤為重要。
2)模仿寫程序要求學生對老師已經講解過的算法,能用相同的思想解決類似的問題,從而加深學生對知識的理解。例如講解了用枚舉法解決百元買百雞的問題后,要求學生用枚舉法解決學生課表排課、水仙花數求解等問題。實踐課上,要求學生在上機之前先將算法以流程圖的形式寫在本子上,然后將算法轉變成程序代碼,上機時只做代碼的調試。這一方法能迫使學生思考,逐步理解計算機求解問題的方法和思路。
3)問題求解則要求學生能靈活運用所學知識,求解新的問題。例如在學習完數組和函數后,問題求解的題目為“編程求解農夫過河問題的解決方案”,要求學生按照問題求解的一般步驟,即問題的表示、求解的算法、代碼編寫與調試來操作。通過問題求解,不僅提高了學生的學習興趣,鞏固了所學知識,更重要的是提升了學生的分析問題和解決問題的能力。
3.3課程設計
為提升課程的教學質量,我們增加了課程設計環節,引入了應用程序開發,要求學生將數組、結構、鏈表和文件操作有機地結合起來,完成一個應用型、綜合性強的大作業。
在課程臨近結束時,學生用一個月的時間完成課程設計,任課教師會給出若干題目供學生選擇,例如本學期課程設計的題目有八數碼游戲、模擬手機通訊錄管理系統、飛機票訂票退票系統、日歷打印與日期查詢系統等12個題目。學生也可根據自己的專業和興趣自己指定題目。例如今年同濟大學交通專業的學生自我選擇的題目為停車庫車輛管理與查詢系統。該題目設計的過程要求學生按照軟件開發的步驟進行功能設計、數據結構設計、模塊設計、代碼編寫、代碼測試,并完成設計報告。
在課程設計環節中,學生不僅要將一個學期所學的內容融會貫通,編寫一個完整的系統,還要考慮程序的正確性、容錯性、算法的效率、對用戶的友好性等,這樣有助于引導學生探究問題求解的思路和方法,提高學生的計算機素質。
3.4考核
我們對考核進行了改革,在學習的不同階段實施不同形式的考核,考核內容中增加了對問題求解能力的考核。具體做法是保留原來的期中和期末考試,考試內容為基本概念、程序調試和小程序的編寫,考核學生對基本知識的掌握情況。在課程設計結束時,增加了綜合編程考試,要求學生在規定的時間內,編程解決給定的問題,考核學生的問題求解能力。學生最后的成績由3次考試成績、課程設計成績和實踐作業成績綜合評定給出,使得學生成績能更客觀地反映學生的學習過程和學習效果。
值得一提的是,盡管在教學過程中我們弱化了語言細節的講解,將講解的重點轉向了程序設計的方法和各類算法,但學生通過大量調試程序的練習,同樣很好地掌握了語言本身的特點,能夠正確地編寫程序,在考核中取得的成績不亞于往年。而通過課程設計,學生的分析問題、解決問題的能力也大大提高了,考核結果令人滿意。
4.結語
在C/C++程序設計課程中,通過程序設計方法和算法的傳授來培養學生的計算思維是本次課程改革的重點。實踐證明,我們主動地、有意識地將計算思維培養融入到理論教學和實踐教學的各個環節,不僅有利于學生理解計算機的實現機制和約束,更有利于學生用計算機學科的獨特思維方式來求解問題,對提高學生的信息素養和創造性地解決問題的能力都有積極的作用。
(見習編輯:劉麗麗)