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