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