馬振嬰
摘 要 《C語言程序設計》課程的指針概念抽象晦澀,且容易混淆。在教學中引入游戲、動畫加強課程的趣味性,并采用漸進式、對比式和啟發(fā)式方法,提高學生的主動參與性。關卡式實驗設計和程序改錯練習鞏固了學生的編程能力。
關鍵詞 指針 C語言 內(nèi)存地址 數(shù)組 函數(shù)
中圖分類號:G424 文獻標識碼:A DOI:10.16400/j.cnki.kjdks.2019.03.047
Abstract In "C programming" course, pointer is abstract, obscure and confusing. Games and animation are used to make the course more interesting, and the progressive, contrast and heuristic methods are applied in order to promote the students' active participation. Level-by-level checkpoint experiment and error-correction practice can improve the students' programming ability.
Keywords pointer; C Language; computer memory; array; function
0 引言
“c語言程序設計”的課程內(nèi)容中,指針是公認的難點。原因之一是學生無法理解內(nèi)存地址和存儲計算的概念,原因之二是傳統(tǒng)的教學方法生動性和系統(tǒng)性不足。因此,學生們對這個章節(jié)有畏難情緒,學習積極性極低。針對上述情況,筆者進行了教學和實踐環(huán)節(jié)的一些設計,以求拋磚引玉,與大家共勉。
1 課堂教學環(huán)節(jié)設計
1.1 內(nèi)存地址和存儲計算
傳統(tǒng)教材對計算機內(nèi)部數(shù)據(jù)存儲和計算過程的敘述比較抽象和枯燥,因此筆者設計了以游戲的方式來增進學生對這部分內(nèi)容的興趣。用一個分格的紙盒模擬內(nèi)存,每個格子用二進制地址編號;用卡片代表變量,卡片上寫上變量名和變量值。學生們兩個人為一組。一個同學隨機喊出指令,另一個同學做出相應的動作。例如指令是“int a=0;”同學必須新建名字為a值為0的卡片放入隨機空格里。指令是“return 0;” 必須把所有的卡片都從格子中取出。“輸出&a的值;”指令對應著念出a變量存放格子的地址?!?+*a”指令對應著把a變量卡片上的值加1。一輪20條指令,然后再交換角色進行。這個游戲反復多加練習,有助于同學們區(qū)分變量名,變量值和地址的概念。
1.2 指針和數(shù)組
這部分教學采用循序漸進的方法,從指針操作一維數(shù)組逐漸遞進到二維數(shù)組。
1.2.1 指針與一維數(shù)組
對方格和卡片游戲進行升級。由普通變量卡片的隨機空格存放,變?yōu)閿?shù)組變量卡片的順序存放,數(shù)組變量卡片存放的格子連續(xù)編址。另外開辟空格存放指針變量卡片,并涂上不同的顏色區(qū)分。游戲中用到的指令增加了定義指針變量、指針變量賦值、指針運算以及用指針取用一維數(shù)組元素等等操作。
在游戲的基礎上,在課上用動畫的方式給大家演示用循環(huán)控制指針使一維數(shù)組的元素逆序存放,以及一維數(shù)組排序經(jīng)典算法的運算過程。動畫和游戲給同學們帶來了更直觀更生動的體驗。
1.2.2 指針與二維數(shù)組
二維數(shù)組的知識點中出現(xiàn)了更多的易混淆概念,宜采用對比法進行教學。
(1)一級地址和二級地址。在二維數(shù)組中,內(nèi)存編址變得更加復雜,出現(xiàn)了行地址、一級地址和二級地址。數(shù)組名(指向行地址的地址)為一級地址,行地址(指向元素的地址)為二級地址。因此在游戲中增加行指針,一級地址和二級地址的模擬。用二維方格表示二維數(shù)組(邏輯結(jié)構(gòu)),用紅色標記一級地址,藍色標記二級地址,并分別模擬指針的縱向(沿行)移動和橫向(沿列)移動。
(2)邏輯結(jié)構(gòu)和物理結(jié)構(gòu)。二維數(shù)組在計算機內(nèi)存中的存儲是一維線性的,但是在邏輯上卻表示為m行n列的矩陣形式。這是必須讓學生明確區(qū)分開的兩個概念。虛擬的行地址是物理結(jié)構(gòu)向邏輯結(jié)構(gòu)轉(zhuǎn)化的關鍵。在學生能夠辨別指針中存儲的是一級還是二級地址后,開始加入邏輯(二維)模式和物理(一維)模式地址之間的相互轉(zhuǎn)化練習,即邏輯模式下的i行j列元素地址對應物理模式下的第i*M+j個元素。
(3)綜合范例演示:用動畫演示用指針操作二維數(shù)組轉(zhuǎn)置的過程。
1.3 指針和函數(shù)
這部分的重點是指針做函數(shù)的參數(shù)。采用漸進和對比教學法,以及啟發(fā)式討論法。先給出兩個完成相同功能的程序,結(jié)構(gòu)都是主函數(shù)加一個子函數(shù)。兩個程序的子函數(shù)分別采用普通變量做參數(shù),以及指針做參數(shù)。提出以下問題并引導學生分組討論:(1)函數(shù)聲明及定義時形參寫法的區(qū)別。(2)函數(shù)調(diào)用時實參數(shù)據(jù)類型的區(qū)別。(3)傳遞數(shù)組地址和傳遞數(shù)組單元素的區(qū)別。(4)函數(shù)體內(nèi)部對形參處理方式的區(qū)別。(5)函數(shù)計算結(jié)果返回方式的區(qū)別。學生完成分組討論后,做得好的小組給予表揚和獎勵,并在全班同學面前進行展示,最后由教師點評。
2 實驗教學環(huán)節(jié)設計
2.1 關卡式
指針與數(shù)組的實驗設計成關卡式,共三個關卡,由簡單到復雜。實驗內(nèi)容是掃雷游戲的模擬(布雷過程)。
(1)一維區(qū)域布雷。在個一維格子(用一維數(shù)組模擬)里隨機布m個雷,有雷的格子用*表示,無雷的格子用#表示。如圖1。這一關學生可以初步體驗通過指針移動取用數(shù)組元素的原理。
(2)生成對應的數(shù)值矩陣,有雷的格子記9,無雷的格子記該格周圍(左右)所有格子中的雷的數(shù)量。如圖2 。這一關加強指針對一維數(shù)組的操作練習。
(3)二維區(qū)域布雷。從n個元素的一維格子拓展到n*n的二維格子。布雷的規(guī)則同關卡1和關卡2,但計算格子周邊的雷數(shù)目的算法更加復雜。如圖3和圖4。這一關學生練習用指針操作二維矩陣行,列元素。
2.2 對比式(函數(shù))
指針做函數(shù)參數(shù)的編程錯誤率高,容易打擊學生的信心。因此采用程序改錯法,使學生先了解易錯的地方,然后再進行正式編程。
改錯范例:用指針做函數(shù)參數(shù)的方式實現(xiàn)數(shù)組的每個元素加1 。
#include
#define N 3
void addone(float * g); //易錯點1
int main()
{
float number[N]={60,75,80};
addone(number); //易錯點2
for(int i=0;i printf(“%.3f\n”,number[i]); } void addone(float * g) { for(int i=0;i (*(g+i))++; //易錯點3 } 在以上三個易錯點,模擬各種出錯的可能,反復讓學生進行程序調(diào)試和改錯。然后再讓學生改寫這個范例,用void addone(float g[])和float addone(float g)的形式實現(xiàn)同樣的功能。 3 教學效果及結(jié)論 《指針》章節(jié)的單元小測平均分為65.326,比去年提高了7.1%。實驗報告8分以上的同學人數(shù)占比提高10%。藍墨云答疑活動的參與人數(shù)和問題數(shù)量分別增加22%和36%。由此可證本文所述教學設計取得了一定的成效,但是仍需要進一步提高教學方式和實驗內(nèi)容的豐富性、趣味性和系統(tǒng)性。 參考文獻 [1] 霍艷玲,王黨利.c語言中指針使用技巧探[J].邢臺職業(yè)技術學院學報,2006.23(5):71-73. [2] 王必晴.論c語言指針的啟發(fā)式教學[J].福建電腦,2010(8):40-42.