安 利,趙永梅,張紅梅
(空軍工程大學 裝備管理與無人機工程學院,陜西 西安710051)
計算機程序設計基礎課程是各高校非計算機專業學生的必修課以及計算機專業的基礎課。C語言是當前計算機程序設計中比較通用的語言,既有豐富的功能又有超強的表達能力,既有高級語言的各種優點,又有低級語言的很多特點。學習C語言,不僅需要機械記憶,還要具有形象思維和嚴密的邏輯推理能力。
恩格斯講過“興趣是最好的老師”,興趣是學習的動力,把學生的興趣引導到學習中來,是教學成功的一半。在C程序設計教學中,為了使學員盡快地進入學習狀態,在課程教學初期,就要想方設法將學生學習的積極性和興趣調動起來。如何調動呢?圖1為由3個階段構成的興趣模型,分別是設置懸念階段、分析問題階段、解決問題階段。

圖1 興趣模型
第一階段,教師可以設置富有懸念的思考題,以提出問題為切入點,通過收集典型的程序解決問題的實例,采用現實演示、屏幕演示、啟發提問等方式進行導課,激發學生興趣,用興趣吸引學員自主學習體驗學習的快樂。我們在一維數組的應用中講到排序,教師以日常生活為例設置相關游戲,例如讓學生班長給6名班員從低到高進行排隊,其方法任意,不可少于兩種。游戲的過程中,讓學生仔細觀察兩種方法是否一樣。之后通過老師的引導告訴學生這個世界不是缺少問題,而是缺少發現。其實在每次排隊的過程背后,都隱含一個經典的排序算法,具體是什么算法呢?
第二階段,由教師主導通過學生的興趣點,引發其主動探索問題,并創造性地多角度分析問題、求解問題。對上一階段引導學生發現的算法問題進一步化解,先討論如何將個子最高的隊員作為隊尾隊員,也就是求最大值的過程。將第一次排隊的過程,通過演示仔細分析采用的方法,相鄰兩個隊員比較,按排序要求調整位置。這樣個子最高的隊員就排在末尾了,這個求最大值方法可稱之為鄰位比較法。將用鄰位法找最大值的過程稱為一趟處理,那么,繼續深入探討,將剩下的5名班員依次使用同樣的方法進行第二趟、第三趟、第四趟處理,每趟中班員都兩兩比較,判斷交換,依次得到次高隊員的排列順序,5個隊員通過4趟就可以排好序了。這就是著名的冒泡排序,小值向前,大值向后,像水中的氣泡上浮。還可以通過其他排隊的方法總結出選擇排序、快速排序等算法。之后通過算法引導學生一步一步寫出核心代碼。整個游戲過程都由學生主導,而教師僅作為配角對學生進行啟發使其有所領悟。
第三階段,引導學生將理論與實際相結合。利用真實的編程環境讓學員直觀感受通過程序設計求解問題的過程,達到提高學員的認知水平,并以滲透程序設計思想為關鍵點,培養學員創造性地分析問題、解決問題的意識。為了驗證學生對之前算法的理解程度,可板書核心代碼,其間可在關鍵代碼處(如循環次數)畫線填空,讓學生自己填充。之后在Visual C++6.0環境下進行調試。最終將枯燥無味的“語言”課變得生動活潑。
在程序設計基礎課程教學中有很多知識點對學生來講都屬于很抽象的內容,例如指針對初學者來說就是一個很抽象的概念。指針比較難以從以前學過的數學等知識中找到相應的原型,因此對于學生來說在概念的理解上會有一定的難度。指針能夠靈活處理內存單元、分配內存,表示復雜數據結構如鏈表等這些優點。如何讓學生能夠很快地理解指針概念并使用指針呢?我們可通過圖2所示類比模型逐步求解問題。類比模型分為4個階段,分別是問題啟發、層層遞進、揭示本質、靈活應用。
在第一階段問題啟發中,以指針為例,教師可以啟發學生思考指針與日常生活中有無相似之處,得以使抽象的問題具體化。指針就是地址,是計算機內存單元的地址,所以使用指針就是要靈活地運用計算機內存的地址。這個概念比較抽象,要使這個抽象的問題具體化就要在教學過程中引導學生進行類比。

圖2 類比模型
第二階段層層遞進,教師帶領學生將理論與實踐相結合,找到形象的比喻。如圖3所示以學生宿舍形象比喻計算機的內存,內存單元相當于宿舍中的每一個房間;“地址”就是內存單元的編號,相當于宿舍的門牌號;內存中存放的數據,相當于各房間的學生如圖3。
第三階段揭示本質,通過學生宿舍的比喻對指針的概念已有初步的理解,教師將引導學生回歸教材,主動對指針進行探索,進一步創造性地分析以達到熟知概念。最終使得晦澀的問題直觀化、難懂的問題親切化。
指針變量就是用來存放指針(地址)的變量,即這個變量中存放的是另一個變量的地址(即存放的是指針),可用“傳達室”作比喻。傳達室也是宿舍樓中的一個房間,只是住在那里的人比較特別,他知道哪個房間里住的是哪些人。在講到“直接訪問”和“間接訪問”時,用傳達室這個比喻很容易讓學生明白。如知道門牌號,直接找到學生,相當于“直接訪問”,如果通過傳達室查詢到門牌號再找人,相當于“間接訪問”。
在此,必須理解“指針變量的地址”“指針變量的值”和“指針指向的目標變量的值”3 個重要概念。例如:程序1中定義了一個整型變量i和一個指向整型變量i的指針變量p,如圖4所示指針變量p的地址就是系統為p分配的存儲空間的首地址,即1000;指針變量p的值,就是它指向的目標變量i的首地址,即2020;p指向的目標變量的值,就是目標變量i的值,即整型數“5”。
程序1:
void main( )
{ ……
int i=5;
int *p=&i;
……
}

圖4 內存分配圖
指針變量是一種特殊的變量。指針變量具有普通變量的屬性,但指針變量又不同于普通變量,它的特殊性具體表現在兩個方面:一是指針變量的值只能是地址。程序中的每一個實體(如變量、數組、函數等)在內存中都占據一個可標志的存儲空間,每一個存儲空間由若干個字節組成,在內存中每一個字節都有一個地址。一個存儲空間的地址就是該存儲空間中第一個字節的地址。因此,無論指針變量存儲的是什么數據類型的地址,指針變量本身在內存中所占字節數都是固定的,所以存儲結構體變量的地址和存儲簡單變量的地址需要的存儲空間長度是相等的。二是指針變量的類型是指針變量所指向的存儲空間中存儲數據的類型。特別強調的是,不同類型的指針變量不能直接相互賦值,如不能將一個整型變量的地址賦值給一個實型指針變量。
第四階段靈活應用,培養學員靈活運用所學知識的創新思維能力,激發學員學習熱情。就是在熟知概念的同時,打開學員的思路,使其掌握一類問題的求解方法,并能夠觸類旁通。
由于學生是剛剛接觸計算機程序設計,必須堅持“通俗、可接受性”的教學原則,在授課中,盡量不以傳統的教學方式中把重點放在語法規則上為側重點,而應該引導學生設計程序的算法,介紹程序設計的基本方法和技巧,在講算法的案例中提出語法規則。由淺入深,融會貫通,逐步突破難點。我們可通過圖5所示漸近模型逐步解決問題。漸近模型分為3個階段,分別是由淺入深、對比分析、問題求解。

圖5 漸近模型
第一階段由淺入深。難點突破在教學活動中十分重要,如何突破難點,根據課程的性質不同而不同,對C語言程序設計課程而言,從課程的結構來講,指針類型的程序設計方法就是相對的難點。為了使學生能夠很透徹地理解指針變量與普通變量之間的區別,我們將會從淺顯的案例著手漸近突破。比如實現兩個數據的交換,可采取首先利用普通變量交換數據入手,然后使用函數,逐漸引入指針的方法依次講解。以培養學員分析問題的能力較強的邏輯思維能力。
第二階段對比分析。結構化程序設計方法的特點之一是模塊化,因此采用函數是最簡潔的方法,我們可通過程序使用指針變量作為函數的形式參數接收主函數中實際參數的地址來實現兩個數據之間的交換。也可以通過用指針變量作為形式參數接收主函數中實際參數的首地址來實現字符串拷貝,來理解使用普通變量和指針變量之間的區別。通過設問引領學生自行總結其概念及應用的方式方法,然后逐步引導他們繼續深入理解指針的概念及其應用,并通過實例演示和對比分析來加深學生的印象。
第三階段問題求解,可采用多種方法融入教學,提高學員的綜合素質;分析學員現階段面臨的難點問題,引起共鳴,激發學員解決問題的欲望。
實驗教學是課堂理論教學的重要輔助部分,是學習和回顧知識的重要環節;C語言又是一門實踐非常強的課程,這個環節更是不可或缺。因此,在上機實踐之前應充分準備實踐材料,對上機內容要做到有程序草稿,并且要做到對實踐的過程非常清晰,以便能夠與理論知識相結合。
程序設計實踐的題目難度選擇在一定程度上決定了實驗教學環節能否成功。如果題目太難,學員的精力重點可能會偏移到專業知識方面,偏離了課程設計的初衷;題目太簡單,不能充分鍛煉學員的軟件設計能力,課程設計起不到應有的作用。因此,課程設計題目的難度應當適中,學生通過一定的努力就能完成,一方面可以發現知識點中自己沒有掌握的內容,另一方面,可以提高他們的編程興趣,增強完成課程設計任務的信心,繼而更加鞏固編程和調試程序的能力,以達到能夠運用計算機求解問題的能力。
C語言課程的教學有別于其他課程,概念多、規則多、枯燥、操作性強。要上好本門課程,必須不斷地探討和研究。C語言是一門計算機專業和非專業的重要基礎課程,具有很強的靈活性,教員不僅需要很強的責任心,還需要不斷地掌握學生的學習動態,靈活地調整授課方法。此教學模型通過計算機程序設計基礎課程教學應用,達到了較好的效果。