葛文庚,藺 莉
(黃淮學院 信息工程學院,河南 駐馬店 463000)
程序設計基礎課程是計算機相關專業普遍開設的一類重要課程,因為程序設計本身有其自己獨立的理論體系,對學習者思維方式的要求也比較特殊,對邏輯性思維的要求很高,同時對實踐開發一能力的要求也很高,所以大多數學生很難適應課程的要求,學習過程比較痛苦,教師的教學也很難達到理想的效果,成為師生普遍認為難學、難懂、難教的一門課程。該課程的教學目標是要學習結構化程序設計方法和面向對象程序設計方法,掌握 C/C++程序設計語言的語法、語義和語用,能夠熟練運用C/C++語言解決一般問題。此外,還要求通過課程學習,使學生能夠掌握學習高級程序設計語言的一般方法,養成良好的程序設計風格,對軟件工程有初步的認識。
隨著各行各業對計算機技術的應用越來越普及,為適應社會對高層次人才的需求,各高校不僅在計算機專業開設了程序設計以及數據結構等課程,還在非計算機專業的學生中加強了計算機知識的教學,陸續開設了程序設計課程,并將其設為必修課程[1]。學習基礎的程序設計語言,涉及的語言如C、VB等,“程序設計基礎”課程雖然以講授 C/C++語言為主,但并非單純講授一門語言,其主要目標是培養學生具有一定的閱讀程序、設計程序的能力,分析、解決問題的能力和邏輯思維能力[2]。這樣不僅有助于提高大學生的綜合素質,更加強調對程序設計方法的掌握和程序設計風格的養成,為學生今后繼續學習其他高級程序設計課程打下牢固的基礎[3]。
程序設計是高等學校學生第一學年必須選修的基礎課程。學生對該課程的實際掌握情況將直接影響到后續專業課程的學習。高校“程序設計基礎”課程包含了兩個方面的內容,即程序設計語言和程序設計方法。程序設計語言是語法規則和語句的集合,多數以 C或者 C++為例加以介紹;程序設計方法則是算法設計和使用計算機語言描述算法的過程。然而目前程序設計教學的現狀卻不容樂觀[4]。由于程序設計課程所采用的仍然是傳統的知識傳授方式,這種教學方式偏重于“教”,忽略了學生作為學習主體的特征,以至于學生花了很大精力去學習語法,但還是不知如何編寫一個正規的程序,不知道怎樣通過編程去解決實際問題[4]。使得程序設計低效難教的現狀得不到改善。通過對學生調查和訪談,大部分學生對程序設計充滿了畏懼,認為其晦澀難懂,學難致用,并因此沮喪,漸失學習興趣;而教師也因反復教授學生也無法掌握最基本的程序結構而感到苦惱,漸失教學熱情,“難學”、“難教”成為師生的共識。如何有效地開展程序設計教學,探討程序設計教學的新思想、新方法和新理論,已成為教學改革中亟待解決的問題。
“程序設計基礎”課程既培養學生解決問題(算法與程序設計)的能力,又使他們比較熟練地掌握一種程序設計語言。“程序設計基礎”課程不僅包括語言語法規范的學習,還包括程序算法的設計。
一般情況下,問題可以分為兩大類兩類問題都需要有自己的算法,數值類一般有固定的算法。而非數值處理中,只有少數的典型問題有現成的算法(如排序問題、檢索問題等)可供選用,其余算法設計是各異的,沒有統一的模式,需要學生根據已學過的知識充分發揮個人的創造力,對給定的問題設計出最優算法,這也是最能培養學生創新能力的部分。不管是哪一類算法,在教學內容的選擇上都要求結合實際選取典型的問題,同時還要考慮學生的接受情況,由易到難,循序漸進地進行教學。通常,一個問題都會有不止一種解決方法。隨著語言語法知識的深入學習,可能會使某一問題的求解過程變得簡單。例如在求解Fibonacci數列問題上,學習數組之前的解決方法就比學習之后要復雜得多。如果一開始就選擇難度較高的算法,往往會使學生望而生畏,挫傷學生學習的積極性,進而產生抵觸情緒。俗話說:“興趣是最好的老師”。但是要讓學生對學習程序設計感興趣,并不是一件容易的事情,這是由程序設計本身的特性——抽象所決定的。為此,教師要想方設法調動學生學習程序設計的積極性。
對程序設計而言,語言僅是一個描述算法的工具。所以,語言規則的學習應該是在確定了問題空間 (解決問題的范圍)的基礎上有目標的語言學習。用不同的計算機語言編寫程序解決同一個問題,其算法可以是一樣的。但是程序設計最終是對程序設計語言的應用。一般地,編寫程序總是要選擇一種計算機語言,而每種計算機語言又都有各自的規則體系。因此有人提出,既然算法是程序設計的核心,就應該把“算法分析”和“語言規則體系”兩者分開學習,以便突出重點、分散難點,這種主張有一定的道理。然而,程序設計作為計算機及相關專業開設的重要課程,在教學中首先應該強調通過算法與程序設計解決問題的方法,讓結構化程序設計的思想滲透到教學的全過程;其次才是對程序設計語言的教學。“算法分析”與“語言規則體系”在實際教學中彼此是相融合的,不可能決然分開,必須結合某種具體的程序設計語言進行算法的教學。
“程序設計基礎”課程包含了兩個方面的內容,即程序設計語言和程序設計方法。按照教學大綱的要求,“程序設計基礎”課程的計劃學時是 48+16,僅利用 48(理論)+16(實踐)學時學習并掌握程序設計的基礎知識(包括語法的算法兩個方面),時間緊,在授課時,老師對教學內容作了刪減,精選了課堂上應該講授的基本知識,其余部分讓學生在課下自學完成。應該重點講解程序設計的思想和方法,真正做到“精講”。
高中生經過選拔性考試進入大學學習,他們已經具備了接受高等教育的智力和能力水平。新生大都是帶著勝利者的喜悅和自信步入大學的。面對新的學習、生活環境,幾乎所有新生都有一種尋求自己位置的迫切需要,表現在學習上就是想在新班級新同學中力爭上游,首先在學習上超過他人。所以,他們大都有好好學習,不虛度大學時光的愿望,對自己有較高的期望值[6]。但經過一學期的學習后,一部分學生學習效果卻不佳,尤其是在學習程序設計時更是步履蹣跚。其原因之一是由于程序設計教學內容的特殊性及教學方法的不斷更新和對學習能力要求的提高,給學生學習帶來了很大的困難。計算機的‘思維’方式是不同的;它有不同的記憶方法來記憶事實。”因此在算法教學中要引導學生突破傳統的思維方式,超越教材內容的束縛,通過尋求不同的解決方案來努力培養自己創新的思維習慣。為了使學生盡快適應新的學習環境及學習方式,我們必須從教學的每一個環節下功夫,想辦法。經過教學實踐筆者認為,如果合理地選擇教學內容,巧妙地進行教學設計,會使教學收到事半功倍的效果。
語法子集:程序設計語言的語法內容相對來說比較多,由于課時、課程性質、學習者的認知水平等限制只能講授其中最主要的語法要素,將這一部分語法內容定義為語法子集。
研究設計的實驗首先用來將 C/C++語言程序進行分詞編碼,為統計階段提供接口;其次,對得到的大量的數據進行頻數統計。為了對得到的實驗進行科學的分析,選擇實際選用的教材樣例程序作為實驗數據,并對實驗結果的進行了驗證,來檢測語法子集的可行性、可靠性。
“程序設計基礎”課程包含了兩個方面的內容,即程序設計語言和程序設計方法。將其中所講授的某一種確定的程序設計語言稱為教學語言。目前作為該課程教材的大多是 C或者 C++語言,而 C++是在 C的基礎上發展起來的,可以說C++是 C的超集,所以研究選擇了 C/C++語言,其關系如圖1所示。

圖1 C/C++語言Fig.1 C/C++language
1)“程序設計基礎”課程教學內容要點
“程序設計基礎”課程不僅包括語言語法規范的學習,還包括程序算法的設計。這些內容涵蓋的知識單元有:程序設計語言概論,程序設計基本結構,算法與問題求解,事件驅動程序設計,算法策略,基本算法,面向對象程序設計。一般情況下,一個問題的求解過程可能涉及多個知識點,一個知識點可能會出現多個語法要素,如在求解兩個整數的最大公約數問題上,會用到如變量定義、輸入輸出、數據交換、循環控制結構等知識點,而就單純循環控制結構中就會出現很多語法要素,如用到的關鍵詞可能有 while,for等,運算符有=,%等。因此對語法內容的選取首先需要確定問題空間,即先確定學習者所能解決的問題范圍。
2)C/C++語法特點
從語法的角度看,源程序實際上是一個字符序列。這些字符序列按順序分別組成了一系列“單詞”。這些“單詞”包括語言事先約定好的保留字(ReservedWords,如用于描述分支控 制 的 if、else, 用 于 描 述 數 據 類 型 的 int等 )、 常 量(Constant)、運算符(Operator)、分隔符以及程序員自己定義的變量名、函數名等。“單詞”的組合形成了語言有意義的語法單位,如變量定義、表達式(Expression)、語句、函數定義等。一些簡單語法單位的組合又形成了更復雜的語法單位,最后一系列語法單位組合成程序。
實驗主要由以下3個步驟組成:
1)數據采集(數據采樣)
將目前國內大多數院校所選用的作為計算機及相關專業的“程序設計基礎”課程的教材作為主要分析對象。原始數據主要來源于目前國內用于“程序設計基礎”課程的教材,包括國內的許多專家學者所編著的教材和國外原文教材的翻譯版本教材。由于數據量較大,只能選取其中的一些由權威出版社及程序設計方面的專家學者所著的一部分。為了盡量降低采樣主觀性,體現實驗數據的普遍性,處理數據主要是其中的樣例程序和課后習題的實現程序。由于這些教材形式主要包括課件及相關的電子文本,所以首先要解決的問題就是從自然語言文本中抽取樣例程序,并生成 TXT文本。
2)數據處理
數據處理階段要解決的問題就是對已經篩選出的符合條件的程序進行分詞、標注。分詞工作會去除掉程序中多余無用的部分(如注釋,多余空格等),標注的信息包括該詞的類型(關鍵字、運算符、界符、標識符、常量),該詞所屬的程序文件編號,該程序所屬的問題范疇。C/C++程序設計語言中的單詞分為5大類:關鍵字、運算符、界符、常數和標識符。數據處理階段主要實現對樣例程序的分詞,它將接收到的所有符號根據構詞規則轉換成一系列單詞串,并將單詞分為以上5大類。其中,關鍵字(如while等)和界符(如分號等)都是確定的且數量有限,將屬于這兩類的單詞賦予一個固定的類型編碼,如關鍵字用 1表示,界符用 2表示;運算符(如加號等)是確定的,則所有的運算類型(算術運算符、邏輯運算符、關系運算符、位運算符、賦值運算符和結構運算符)都用一個統一的編碼 3表示;標識符(如變量名等)統歸為一類用 4表示;而常數(如整數 6等)也統歸為一個編碼5。
對13類算法進行了編碼,如計數、求和、求階乘等分一類,編碼為 01;求兩個整數的最大公約數、最小公倍數等分另一類,編碼為 02;以此類推,編碼表如表1所示。

表1 算法編碼表Tab.1 Algorithm code table
3)數據統計
對數據處理階段得到的單詞表進行統計。以單詞出現的頻數和在所有文件中出現的比例為統計依據。比較其中出現或未出現的語法部分,統計其中出現頻率較高的語法內容,得出子集。最終得到的是所有程序文件中出現的C/C++語言的單詞頻數統計表(不包括重復出現的情況)。通過對該表的分析得出最后的結論。
實驗對現有國內外大量用于高校計算機及相關專業“程序設計基礎”課程教學的教材進行分析統計,通過數據采集、數據處理兩個階段將教材中的樣例程序文件按照所屬算法分類,并對程序代碼進行分詞、標注;經過統計分析階段得到一個量化語法子集。通過對該量化子集和經驗子集進行比對后發現,它們的一致性程度高。本文還進行了相關實驗,結果表明:基于語法子集的程序設計教學開展,不會對后續專業課程的教學產生不良影響,說明該子集可以應用于教學。
實踐證明,應用 C/C++語言的語法子集開展“程序設計基礎”的教學能更好地提高程序設計課程的教學效率,幫助學生理清學習思路,對培養學生分析問題、解決問題的能力有比較大的幫助。
本研究的主要內容是針對初學者特點,在“程序設計基礎”課程的知識選取上采取“瘦身”措施,消除很多 C/C++語言教材中存在的“知識臃腫”現象。教學內容應突出C/C++語言程序設計的主干知識,淡化分支知識,摒棄末葉知識。在對C/C++語言程序設計知識點進行系統論證分析的基礎上,合理取舍每個教學單元的知識內容,將主干知識列入教學目標,放在首位;將分支知識作次要介紹;對不利于課程主體內容教學、容易使初學者陷入迷魂陣的“末葉”知識堅決舍棄。學生在學習時既容易進入主題,又不迷失方向。
[1]李秉德.教育科學研究方法 [M].北京:人民教育出版社,2006.
[2]李文新,胡薇薇.北京大學信息科學技術學科課程體系研究組[M].北京:清華大學出版社,2008.
[3]胡毅.《程序設計基礎》課堂教學方法探索[J].現代計算機:專業版,2011(11):42-43.
HU Yi.Exploration on teaching method of programming fundamentals[J].Modern Computer,2011(11):42-43.
[4]張勇.“Java程序設計”課程教學改革研究[J].電腦知識與技術,2011(24):5980-5981.
ZHANGYong.Teachingreformresearchof“JavaProgramming”course[J].Computer Knowledge and Technology,2011,24:5980-5981.
[5]于曉強,趙秀巖,閆丕濤.計算機程序設計課程中計算思維能力的培養[J].計算機教育,2011(13):18-21.
YU Xiao-qiang,ZHAO Xiu-yan,YAN Pi-tao.Cultivation of capacity for computationalthinking through computer programming[J].Computer Education,2011(13):18-21.
[6]宮海梅.《程序設計基礎》教學探索[J].海南廣播電視大學學報,2011(2):142-143.
GONG Hai-mei.Study on teaching activities in the fundamentals of programming[J].Journal of Hainan Radio&TV University,2011(2):142-143.