張連堂,林樹青
(廣州商學院,廣州511363)
信息技術飛速發(fā)展,計算機語言層出不窮,但是C語言的地位一直無法撼動,它非常接近于機器語言,編譯質量、運行效率很高,任何其他高級語言無法比擬,所以不管用其他任何高級語言開發(fā)軟件,在核心的地方都會想到嫁接C 來“幫忙”。在大部分高等院校計算機相關專業(yè)的課程體系中,C 語言的身影一直存在。C語言的教學效果也一直備受關注,為了能使得剛剛踏入大學的學生對C 語言的學習取得更好的收獲,我們嘗試打破教科書的束縛,采取項目驅動教學法,具體做法如下。
作為大學第一門計算機語言課程,講授伊始,必須首先讓學生理解語言和程序的本質。好比導演引導演員入戲一樣,教師必須引導學生盡快進入“計算機語言”。
語言是不同客體之間信息交流的工具。自然語言是人與人之間的交流工具;計算機語言是人和計算機之間的交流工具。一切語言的共性是傳遞信息,讓對方了解自己的意圖,不同語言的區(qū)別僅在于:單詞、語法、句型不同而已。由單詞按照一定的語法、句型所寫成的文章,用于處理實際問題的具體策略、方法步驟、實現(xiàn)過程等,實則程序,如表1 所示。
表1 自然語言和計算機語言對照表
不難看出,其實計算機語言并沒有什么新奇之處,自然語言的文章中每個段落講述一層意思,計算機語言的程序中每個函數(shù)實現(xiàn)一個運算、描述處理一個具體問題的方法步驟;一篇文章完成一個整體問題的描述,一個計算機語言程序完成解決一個工程問題的全部描述。
理解了語言和程序,接下來要讓學生學會在程序中如何處理實際問題。
(1)算法:一個程序實現(xiàn)的工程中涉及到很多具體的子工程,不能像寫繼續(xù)文一樣全部混合在一起設計,為了糾錯、維護(調試)方便,為了參與開發(fā)設計人員的分工、合作方便,很自然地把整個工程分解成為若干個具體問題,分而治之,程序員設計出的處理每一個具體問題的方法步驟叫做算法。
在此,要讓學生清晰的認識到算法已經(jīng)不再是一個數(shù)學表達式,而是處理實際問題的方法步驟。不同的程序員面對同一個實際問題,所構思的算法可能截然不同,要讓學生認識到,日后的學習過程,以及未來工作中對算法的學習研究是非常重要的。
(2)運算:必須向學生闡明,運算已經(jīng)不再狹義的指加減乘除等,對實際問題的每一步處理或者每一個操作,例如數(shù)據(jù)輸入、輸出、修改、插入、刪除、排序、查找等,都叫運算。同時,講授過程中必須澄清“運算”和“算法”的本質不同,運算是對數(shù)據(jù)的操作,算法是實現(xiàn)運算的方法步驟。
C 語言作為大學計算機相關專業(yè)的入門語言,教學實踐告訴我們,其重要目的不在于讓學生學會用C語言設計一些簡單的程序。而是借助于C 語言的學習,教會學生學會編寫程序的方法和技巧。讓學生明確,所有計算機語言編寫程序的方法完全相同,只是語法、標識符存在差異,寫程序的策略不同。例如面向過程的程序設計語言和面向對象的程序設計語言。
同時,通過C 語言的教學過程,要教會學生如何觸類別通、舉一反三,對比C 語言,自己學習其他計算機語言。
實踐告訴我們,只要學過一門計算機語言,掌握了計算機的本質和程序設計的方法,其他語言就不必在專門研究。工程上,面對所開發(fā)軟件的特點,選定恰當?shù)恼Z言,研究該語言的基本功能和特點,即可在計算機上用該語言進行編程,遇到問題,在相關資料上去查解決辦法,這樣邊用邊學,很快就能對新的語言運用自如。
為了能真正實現(xiàn)通過C 語言教學,教會學生程序設計的方法,作者建議嘗試用項目驅動法組織教學,具體做法是:
緊扣C 語言教學內容,以結構式程序設計方法為框架,設計出幾個功能基本齊全、容易實現(xiàn)的模擬項目課題,如《學籍管理》、《圖書管理》、《車票訂購系統(tǒng)》等。并且寫出詳盡的“項目指導書”,包括項目的意義、實施方法、過程、目的、最終達到的目標效果等;可劃分為項目的需求分析、可行性分析,可操作性強的實施方案、實施日歷、項目效果評估等部分。實施方案部分是其重點,應由淺入深、由易到繁,清晰的分解出與C 語言程序設計知識內容體系逐步深入相對應的程序模塊。例如可按照功能分解為“輸入”、“輸出”、“修改”、“插入”、“刪除”、“查找”、“排序”等模塊。詳盡的寫出每一個模塊所對應的C 語言知識內容,對應用到的程序設計方法,實現(xiàn)技巧等。該“項目指導書”可作為學生們在學習C 語言知識的同時,實驗、實踐內容的指導性材料。講授課程之前先讓學生分組自主選擇“項目指導書”中所列項目中的任一個,形成多個項目開發(fā)實踐學習小組,伴隨C 語言知識的學習,以其作為實踐標的設計程序,課程結束,所做項目程序設計完畢,以期達到預期學習效果。
為了讓教學內容與項目程序設計的進度同步推進,我們把C 語言的教學內容分解成如下幾個部分。
(1)C 語言程序設計的基本知識
基本知識的講課,絕對不能在語法和規(guī)則上浪費時間,要明確的告知學生,絕對不能死記硬背語法規(guī)則,不能只在書本上研究計算機語言,要在計算機上邊實踐邊學習,最好的方法是,整個教學過程離開講臺在計算機旁進行。讓學生明白:計算機語言不是讀書學會的,是在編程實踐中練會的,書本知識參考資料,是在編程序過程中備查的,不是用來研學的。只讀書、不實踐,理論知識倒背如流亦不會寫程序,這一點正是目前不少學生學始終學不會編程的根本問題。只有在計算機上的實際編程、調試、糾錯、修改、升級等一系列的實戰(zhàn)訓練。才能真正領悟用計算語言編寫程序的方法。才能做到在編程過程中面對實際問題,靈活運用計算機語言,寫出相應的處理程序段。
課程伊始,主要概述C 語言的總體內容,以及C 語言的特點、C 語言程序設計的最基本的方法等[1]。同時對照、結合“項目指導書”向學生闡明如何結合C 語言知識的學習過程逐步完成項目的軟件開發(fā)。
接下來在講授“順序結構”、“分支結構”、“循環(huán)結構”等基本程序設計方法的過程中,每講授一部分內容,就讓學生以小組為單位對其所選項目由淺入深的進行編程實踐。例如,學完當前知識,就可用少量模擬數(shù)據(jù)實現(xiàn)所選項目中的“輸入”、“輸出”、“修改”、“插入”、“刪除”等簡單功能。
(2)數(shù)組和字符串
前面的教學和實踐,明顯發(fā)現(xiàn)所處理的數(shù)據(jù)量極其有限,明確告訴學生,面對大批量數(shù)據(jù),設計變量一一對應極不現(xiàn)實,力不從心,繼而引入數(shù)組的概念,結合循環(huán)結構用數(shù)組作為數(shù)據(jù)的宿主,輕松實現(xiàn)批量數(shù)據(jù)的處理;至此,學生們很快就能把先前所設計的程序擴展為批量數(shù)據(jù)處理。同時,順理成章的可讓學生設計相應的算法完成對應項目程序中的“查找”、“排序”功能。
這部分內容,要讓學生理解數(shù)組的本質是順序存儲結構,邏輯上相鄰的數(shù)據(jù)元素(例如學籍表中不同學生同一門課的成績),在計算機內存儲器中的存放位置也是相鄰的,先后關系由數(shù)組的下標來決定,只要給定一個下標位置,就能很容易的找到對應的數(shù)據(jù)。優(yōu)點是查找、輸入輸出方便,缺點是插入、刪除時需要移動數(shù)據(jù),安全性差。字符串實質上是元素都是字符的特殊的數(shù)組,學生接受很容易,在此不再贅述。
(3)函數(shù)
函數(shù)是包括C 語言在內所有語言學習的重中之重。結合課題項目,從結構上剖析前面所設計程序的缺點:實現(xiàn)方法簡單、不能分解問題、思路不清晰。繼而引入,可以用函數(shù)的方法,把復雜問題分解成一個個小的具體過程,每一個過程寫成一個函數(shù),由主函數(shù)統(tǒng)一調度協(xié)調,實現(xiàn)結構化程序設計,讓后續(xù)的維護變得輕松而容易。
函數(shù)的講授重點在于參數(shù)的本質意義,及其數(shù)據(jù)傳遞方式方法,只有讓學生真正掌握“形式參數(shù)”、“實在參數(shù)”、“數(shù)值引用”、“地址引用”等概念[2],才能恰當選用參數(shù)、自如的設計函數(shù),讓程序中函數(shù)間的數(shù)據(jù)傳遞有條不紊,最大限度的減少數(shù)據(jù)冗余、減少程序代碼冗余,設計出時間效率和空間效率雙優(yōu)的程序。
任何函數(shù)都只有的“數(shù)值引用形式參數(shù)”、“地址引用形式參數(shù)”兩類,是函數(shù)內部與外部數(shù)據(jù)傳遞的接口,在語言的學習中,它顯得很抽象,可以用實例形象講授:一個函數(shù)“首部”好比一個公司的“大門”,參數(shù)表的變量如同“門衛(wèi)”人員,公司可設置了兩類“門衛(wèi)”,一類“門衛(wèi)”等候接受外來的材料(數(shù)據(jù)),材料可以是外人送來的,也可以是沒人送而郵寄來的,“門衛(wèi)”人員帶上外部材料進入公司內參與處理,哇哎不即使有人來業(yè)拿不走內部材料,這些數(shù)據(jù)“有來無回”,這就是參數(shù)表中的“數(shù)值引用形式參數(shù)”;另一類“門衛(wèi)”不是真正守候在此的“人員”,只是把“工作服”放在那里,等候“外來人員”穿上這些工作服,進入公司內部參與各種活動,最后他們走時自然可以把內部數(shù)據(jù)帶走,數(shù)據(jù)“有來有回”,這類“門衛(wèi)”等同于函數(shù)的“地址引用形式參數(shù)”。這樣的比喻可讓學生非常輕松的掌握抽象的“參數(shù)”概念。
學完函數(shù),鼓勵學生徹底修改自己所做的項目程序,把每一個功能模塊寫成一個獨立的函數(shù),讓學生自然而然的學會結構化程序設計的方法。
(4)指針、結構體和共同體
在設計程序的過程中,學生們一定非常困惑一個數(shù)組中的數(shù)據(jù)必須是同構的,很難實現(xiàn)對于學籍表、圖書信息,等工程實踐中的數(shù)據(jù)。因為,每個數(shù)據(jù)中的各個成分不是同構的,諸如姓名、編號、日期等等,迫切的想學會解決方法,結構體的學習讓學生們眼前一亮。
講授指針,要讓學生清晰的了解,指針變量保存的是存儲器的地址,通過記憶地址,能夠讓邏輯上相鄰的數(shù)據(jù)元素在計算機內存儲器中位置任意,數(shù)據(jù)元素之間的關系由直接先驅數(shù)據(jù)記憶其直接后繼的地址來確定。不僅僅可以克服用數(shù)組順序存儲批量數(shù)據(jù)時,插入、刪除運算移動數(shù)據(jù),效率低、安全性差的缺陷。同時,通過指針實現(xiàn)的數(shù)據(jù)動態(tài)存儲還能自然達到數(shù)據(jù)加密的效果。
需要強調的是,對于結構體和指針的教授絕對不能輕描淡寫,要結合計算機硬件,從物理意義上講授;結合項目課題從實際意義上講授,讓學生真正掌握其本質,在實踐中靈活運用。同時為后繼知識的學習打下扎實的理論基礎。例如,學不會指針和結構體,諸如數(shù)據(jù)結構之類課程的教學就寸步難行[3]。
至此,借助于C 語言面向過程的結構化程序設計知識已經(jīng)基本學完,可綜合起來,讓學生對自己所設計項目程序中的數(shù)據(jù)用結構體和指針進行完善定義,逐步改進其功能。
(5)位運算和文件
不少人認為,位運算以及文件都可以省略不講,我們認為不盡然。對于偏硬的計算機相關專業(yè),文件部分可以省略,但是必須讓學生學會位運算,因為用C 語言代替匯編語言對芯片編程時,位運算極其重要。對于偏軟的計算機相關專業(yè),位運算可以省略,但是文件不能不講,例如,我們項目驅動教學法中的程序設計,如果不把數(shù)據(jù)通過文件保存到外存中,所有處理都是無效的,因為離開文件,所有對數(shù)據(jù)的處理都是在內存中進行的,程序之行結束,一切數(shù)據(jù)全部消失,這一點必須向學生明確闡述。
我們建議,文件部分著重講授二進制文件和文本文件的處理方法,其他可以略去,其一,無論什么性質的文件都是以二進制形式正在外存中保存;其二,很多便于閱讀的數(shù)據(jù)都是以文本文件格式實現(xiàn)的。
基于項目驅動法的特點,學生在學習C 語言程序設計知識的過程中,步步實踐,課程結束,項目程序也相繼完成。第一,讓學生在平時設計程序的過程中,寫出每一環(huán)節(jié)的開發(fā)文檔,期末以其所設計項目程序的水平和所寫開發(fā)文檔的質量作為考核內容給出恰當?shù)脑u價,遠比閉卷書面考試為主的考核方法更為有效。
項目驅動法組織C 語言教學,變實驗為實踐,有的放矢,學生們的學習目標明確,每學完一部分語言知識,立即結合項目程序的設計進行應用體驗,成就感會使他們受到極大地鼓舞,可最大限度的調動其學習的積極性和主動性,很容易把剛進大學的新生引入程序設計的“趣味天堂”,使他們深深體會到學習程序設計的樂趣和重要性。徹底克服以往C 語言的教學中,講完理論,做驗證性實驗,學生學無目的、迷茫,教學效果很不理想。以至于不少學生剛進大學,就因為C 語言的學習混沌,喪失對程序設計的信心。
筆者認為,C 程序設計課程在整個計算機相關專業(yè)教學過程中,起著關鍵性作用。它的成敗,很大程度上影響到學生的學業(yè)成敗,這就叫“成也蕭何敗也蕭何”。這就是我們探究徹底改革其教學方法的目的所在。