熊啟軍,谷瓊,屈俊峰
基于案例的C語言數(shù)組教學(xué)
熊啟軍,谷瓊,屈俊峰
(湖北文理學(xué)院數(shù)學(xué)與計算機(jī)科學(xué)學(xué)院,襄陽 441035)
針對數(shù)組在《C語言程序設(shè)計》課程教學(xué)中承上啟下的重要作用,圍繞數(shù)組的概念、基本操作、應(yīng)用和拓展、以及教學(xué)方法等方面,通過實例對易犯錯誤、注意事項、算法及其技巧等展開討論,目的是為了更好地促進(jìn)和啟發(fā)教學(xué),提高教學(xué)效率。
C語言;數(shù)組;算法;教學(xué)方法
程序設(shè)計課程群貫穿于計算機(jī)類專業(yè)的整個學(xué)習(xí)階段,而《C語言程序設(shè)計》則是它們的基礎(chǔ),學(xué)生對該課程的掌握程度直接決定其學(xué)習(xí)興趣、專業(yè)發(fā)展、就業(yè)方向等。因此,對《C語言程序設(shè)計》的教學(xué)研究層出不窮、經(jīng)久不衰。在該課程中,循環(huán)結(jié)構(gòu)是重點、數(shù)組和函數(shù)是升華、指針和結(jié)構(gòu)體是難點,且數(shù)組和函數(shù)承擔(dān)著承上啟下的作用,凸顯了這兩章的重要性。文章將采用案例,圍繞數(shù)組的概念、聲明和定義、操作以及應(yīng)用中的易犯錯誤、重點、難點等問題,綜合運用多種教學(xué)方法展開探討。
數(shù)組的概念是一組類型相同的數(shù)據(jù)組成的一個序列。短短的一句話,表達(dá)出了三個意思:一是數(shù)組中數(shù)據(jù)的個數(shù)是多個(即數(shù)組的容量或?qū)嶋H元素個數(shù)),二是數(shù)組中的數(shù)據(jù)都是同一種類型的(即數(shù)據(jù)元素的類型),三是數(shù)組中的數(shù)據(jù)是有次序的(即元素的值)。這三個方面再加上數(shù)組名(即代表數(shù)組的標(biāo)識符)一起構(gòu)成了數(shù)組的四要素,且這四要素在數(shù)組的基本操作、數(shù)組的應(yīng)用等方面都必須完整地體現(xiàn)出來[1]。這是學(xué)習(xí)者必須深刻理解和領(lǐng)會的。
如何聲明或定義一個數(shù)組、如何訪問數(shù)組、如何輸入輸出數(shù)組元素的值,這些屬于概念性的內(nèi)容,必須記憶和理解。下面以使用最頻繁的一維數(shù)組為例進(jìn)行討論。
2.1 數(shù)組的聲明
數(shù)組的聲明必須體現(xiàn)出數(shù)組四要素中的三個,它們是數(shù)組元素的類型、數(shù)組的名稱、數(shù)組的元素個數(shù)。假定要聲明一個類型為整型、容量為100、名稱是arra?yA的一維數(shù)組,通常使用下述兩種方式:
int arrayA[100];
或者
#define maxSize 100
int arrayA[maxSize];
這兩種聲明數(shù)組的方式都只表達(dá)出了數(shù)組的三個要素:即數(shù)組的類型、數(shù)組的名稱、數(shù)組的容量。由于所有元素沒有值,所以不能參與運算。數(shù)組元素沒有值就去參與運算,這是學(xué)習(xí)者常犯的錯誤之一。
在聲明數(shù)組時,數(shù)組名后方括號中的數(shù)據(jù)只能是一個正整數(shù)或者結(jié)果是正整數(shù)的常量表達(dá)式,絕對不能含有變量、也不能空缺。因為這個正整數(shù)固定了該數(shù)組的最大容量。方括號中使用變量或者空缺,是學(xué)習(xí)者常犯的錯誤之二。
2.2 數(shù)組的定義
一般,把在聲明數(shù)組的同時給數(shù)組的所有元素整體賦值稱為數(shù)組的定義。即將數(shù)組的聲明、賦初值放在一起一步完成。即數(shù)組的定義是將數(shù)組的四要素一并完整地展現(xiàn)出來了。若將聲明和賦值分開,則不能稱之為數(shù)組的定義,且以后只能給數(shù)組的元素一個一個地單獨進(jìn)行賦值。
一維數(shù)組的定義通常使用下述幾種方式(以一維整型數(shù)組為例):
(1)同時指定數(shù)組的容量和所有元素的值。
例如:
int arrayA[10]={1,3,5,7,9,0,2,4,6,8};
這個定義表明:數(shù)組的容量是10(實際元素的個數(shù)也是10)、每個元素都指定了確定的值。
但是,
int arrayB[5]={1,3,5,7,9,0,2,4,6,8};
則是錯誤的。因為數(shù)組的容量不能小于元素的個數(shù)。
(2)同時指定數(shù)組的容量和前部分元素的值。
例如:
int arrayC[10]={1,3,5};
數(shù)組的容量是10(實際元素的個數(shù)是10)、前3個元素指定了確定的值、后7個元素取缺省值0。
或者
int arrayD[10]={};
表示數(shù)組的容量是10(實際元素的個數(shù)是10)、所有元素都取缺省值0。
這種方式要求缺失的、取缺省值的只能是后部分的元素,不能是前面的、中間的元素。譬如:
int arrayE[10]={1,3,5,,8,6};
這個定義就是錯誤的。
(3)指定數(shù)組所有元素的值、同時省略數(shù)組的容量。因為根據(jù)元素值的個數(shù),可以反推數(shù)組的容量。譬如:
int arrayF[]={1,3,5,7,9,0,2,4,6,8};
指定的值有10個,數(shù)組的容量也就是10。
當(dāng)然,
int arrayG[]={};
則是錯誤的。因為無法確定數(shù)組的容量。以上幾種定義數(shù)組的方式,都是把數(shù)組的聲明和賦值合二為一了。即只有在定義數(shù)組時才能對數(shù)組進(jìn)行整體賦值;否則,對數(shù)組元素的賦值只能一個一個地進(jìn)行。
例如:下面的賦值都是錯誤的。
int arrayH[10];
arrayH={1,3,5,7,9,0,2,4,6,8};
或者
int arrayJ[10];
arrayJ={1,3,5};
這表明:聲明數(shù)組、賦值分成兩步進(jìn)行的話,是不能對數(shù)組名賦值的。
數(shù)組的簡單操作包括數(shù)組元素的輸入輸出和訪問。一般情況下,對數(shù)組元素只能一個一個地進(jìn)行相關(guān)操作,且常與循環(huán)配合來完成。數(shù)組元素的輸入輸出和引用,這三種基本操作都涉及到數(shù)組元素的表示,而數(shù)組元素的表示則通過數(shù)組名和下標(biāo)來完成的,數(shù)組的最小下標(biāo)是0,最大下標(biāo)是數(shù)組的容量減1。初學(xué)者常犯的錯誤是數(shù)組的下標(biāo)越界,但這種非法引用,程序編譯時并不會報告語法錯誤、程序運行時也不會報告運行錯誤[2]。
上述三個方面的知識,都屬于概念性和識記性的。數(shù)組的應(yīng)用必然會涉及到上面的基本知識,但關(guān)鍵在于算法設(shè)計。
例如:求一個正整數(shù)n的所有因子。
求解這個問題的算法采取了枚舉法。算法的基本思路是:用i=1~x之間的整數(shù)依次整除x,將能整除的i存儲于指定的數(shù)組之中。難點在于定義數(shù)組的適當(dāng)容量和計數(shù)因子的個數(shù)(即數(shù)組中實際元素的個數(shù)),且后者更重要。因為因子的個數(shù)事先是未知的、只能在試探的過程中根據(jù)模運算的狀態(tài)來遞增,且只能在試探完畢才能最終確定實際因子的個數(shù)(即需要一個計數(shù)器)和各個因子的值。
從“求一個正整數(shù)的所有因子”拓展到“求解一個正整數(shù)的所有質(zhì)因子”,若不使用素數(shù)判斷的功能代碼(或函數(shù)),這個問題該如何解答呢?問題的關(guān)鍵仍在于算法。該算法難度增大了;涉及的知識點也增多了,包括質(zhì)因子的概念、模運算、判斷因子是否重復(fù)、計數(shù)器以及技巧等。算法的基本思想是:以i=2作為最小的除數(shù)開始進(jìn)行模運算,若能整除,則繼續(xù)以i為除數(shù)進(jìn)行模運算,直到被除數(shù)不含i的倍數(shù)為止,且僅保留一份這時的除數(shù)i;若不能整除,則除數(shù)i自增1,再用新的i重復(fù)前面的步驟,直到可用來進(jìn)行模運算的i都試探過為止。
按照上述算法思想,下面是第一種實現(xiàn)方法:
第二種方法是“不存儲1這個虛假的質(zhì)因子”,對上述代碼做幾處修改即可:
將①修改成 int x,result[100],len=0;
將②修改成if(len==0||result[len-1]!=i)
將⑤修改成 for(i=0;i<len;i++)
上面的if語句中,邏輯表達(dá)式的次序不能顛倒,因為存在短路現(xiàn)象;否則,算法就存在Bug了。
第三種方法則是使用標(biāo)記來判斷質(zhì)因子是否重復(fù),與方法一對照的話,需作如下修改:
將①修改成 int x,result[100],len=0,flag=0;
將②修改成if(flag==0||result[len-1]!=i)
將③修改成 { result[len++]=i;flag=1;}
將④修改成 { i++;flag=0; }
將⑤修改成 for(i=0;i<len;i++)
上面②處的if語句中的邏輯表達(dá)式的次序也不能顛倒,原理上與第二種方法一致。
上述三種解答,雖然使用的具體語句有一些差別,但本質(zhì)是一致的。都緊緊地抓住了數(shù)組概念的四要素,特別是數(shù)組實際元素的個數(shù),但最重要的仍是算法。因此,只有抓住事物的本質(zhì),才能真正理解、才會運用、才有拓展和創(chuàng)新。
最后,特別強調(diào)的是:閱讀代碼或檢驗代碼的正確性,必須實踐“三動”——動手、動腦、動眼的學(xué)習(xí)方法[3]。
在教學(xué)中,必然會綜合使用多種教學(xué)方法,如案例法、演示法、類比法、啟發(fā)法、拓展法……以及師生交互手段等。教學(xué)時經(jīng)常強調(diào):一道題,如果你能講出令人信服的道理,那么你的解答思路就是正確的,在排除一些意外的情況下,你給出的答案應(yīng)該是正確的。因此,在解題過程中,概念的嚴(yán)謹(jǐn)性、完整性必然會得到清晰的展現(xiàn),同時,追求嚴(yán)謹(jǐn)、認(rèn)真的態(tài)度是綜合素質(zhì)培養(yǎng)的重要目標(biāo)之一。
[1]熊啟軍,孫文鶴,方磊.C語言程序設(shè)計[M].北京:中國鐵道出版社,2015:97-100.
[2]李文明,陳哲,李緒蓉,黃志球.C程序數(shù)組越界的運行時驗證技術(shù)研究與實現(xiàn)[J].計算機(jī)工程與應(yīng)用,2015(11):190-192.
[3]熊啟軍,袁磊,谷瓊.基于“四期六段”模式的C語言教學(xué)[M].現(xiàn)代計算機(jī)(專業(yè)版),2012(14):42.
Case Teaching for C Language's Array
XIONG Qi-jun,GU Qiong,QU Jun-feng
(College of Mathematics&Computer Science,Hubei University of Arts and Science,Xiangyang 441053)
In the teaching of C Language Programming,array is in an important position.Discusses the concept,basic operation,application,develop?ment and teaching method,and makes some suggestions on how to make mistakes,precautions,algorithms and techniques.These can play a role for teaching in promote and inspire,so as to improve the learning efficiency and teaching quality.
C Language;Array;Algorithm;Teaching Method
湖北省高等學(xué)校省級教學(xué)研究項目(No.2016388)、湖北文理學(xué)院計算機(jī)科學(xué)與技術(shù)省級重點學(xué)科開放基金資助項目(No.2017009)
1007-1423(2017)24-0043-04
10.3969/j.issn.1007-1423.2017.24.010
熊啟軍(1971-),男,湖北仙桃人,研究方向為軟件工程
2017-05-23
2017-08-10