李偉+鄭珊珊+牧劍波
摘 要:“C語言程序設(shè)計”課程是信息類專業(yè)的一門非常重要的基礎(chǔ)課程,其中函數(shù)是該課程的重點和難點之一,該文作者結(jié)合實際教學(xué)情況,對函數(shù)的內(nèi)容安排、函數(shù)的設(shè)計和函數(shù)的參數(shù)傳遞等方面進(jìn)行了探討,實踐證明,該方法取得了良好的效果,學(xué)生通過函數(shù)進(jìn)一步理解了模塊化程序設(shè)計的思想。
關(guān)鍵詞:C語言 ?函數(shù) ?參數(shù)傳遞
中圖分類號:TP312 文獻(xiàn)標(biāo)識碼:A 文章編號:1674-098X(2014)11(a)-0135-02
“C語言程序設(shè)計”課程是信息類專業(yè)的一門非常重要的基礎(chǔ)課程,這門課程的主要目的就是讓學(xué)生以C語言為例了解高級程序設(shè)計語言的結(jié)構(gòu),掌握程序設(shè)計的基本思想,具備初步的分析問題和用計算機(jī)解決問題的能力。函數(shù)是C語言程序設(shè)計課程的重點和難點,它體現(xiàn)了模塊化程序設(shè)計的思想,將一個復(fù)雜的問題分解成一個個小而簡單的問題,通過解決一個個小問題進(jìn)而實現(xiàn)大的復(fù)雜問題的求解。在函數(shù)的教學(xué)中,經(jīng)常會有教師不好教學(xué)生學(xué)不懂的現(xiàn)象,學(xué)生學(xué)完函數(shù)后,基本概念和結(jié)構(gòu)語法都清楚,但是針對具體的問題就無從下手,教學(xué)效果一直不是太好。筆者在多年C語言教學(xué)的實踐基礎(chǔ)上,結(jié)合我校學(xué)生的具體情況,對函數(shù)部分的內(nèi)容組織和教學(xué)方法做了一些探討。
1 教學(xué)內(nèi)容和安排
函數(shù)部分一般按以下內(nèi)容進(jìn)行教學(xué)。
(1)函數(shù)的作用和分類:標(biāo)準(zhǔn)庫函數(shù)和自定義函數(shù)。
(2)函數(shù)定義的基本格式:無參函數(shù)、有參函數(shù)和空函數(shù)。
(3)函數(shù)的參數(shù)傳遞:值傳遞和地址傳遞。
(4)函數(shù)的返回值:無返回值、一個返回值和多個返回值。
(5)函數(shù)的調(diào)用:作為單獨語句、作為表達(dá)式和作為函數(shù)參數(shù)。
(6)函數(shù)的遞歸調(diào)用和嵌套調(diào)用。
(7)函數(shù)的聲明:聲明的位置、格式和省略情況。
(8)變量的作用域:全局變量和局部變量。
(9)變量的存儲類型及生存期:自動變量、靜態(tài)變量、外部變量和寄存器變量。
可以看出,函數(shù)部分的內(nèi)容非常多,而且會有許多新的概念突然介入,有相當(dāng)一部分教材,以譚浩強教授的《C程序設(shè)計》(第四版)為代表,將函數(shù)作為單獨一章放在選擇控制結(jié)構(gòu)和數(shù)組之后,把函數(shù)相關(guān)的上述所有內(nèi)容都放在這一章中介紹,然后在后續(xù)的指針、結(jié)構(gòu)體和文件等章節(jié)中又幾乎沒有函數(shù)的蹤影,程序的主體仍然放到main()函數(shù)中去講解,筆者認(rèn)為這樣的內(nèi)容編排結(jié)構(gòu)不利于學(xué)生對函數(shù)的把握,它會導(dǎo)致函數(shù)和其他內(nèi)容脫節(jié),給學(xué)生造成這是專門的一章,不學(xué)或?qū)W不好對其它內(nèi)容不會產(chǎn)生多大影響的印象,結(jié)果到課程結(jié)束時仍然對函數(shù)知之甚少,平時也幾乎沒用函數(shù)來編寫過程序,導(dǎo)致到了學(xué)期末學(xué)生在編程時仍然習(xí)慣把所有程序都放到一個main()函數(shù)中去編寫,很少有模塊化程序設(shè)計的思想,為以后編寫復(fù)雜程序或者參加團(tuán)隊合作埋下了隱患。
該文作者在講授函數(shù)這一部分時,參考了哈爾濱工業(yè)大學(xué)蘇小紅教授的高教版《C語言程序設(shè)計》(第二版)的內(nèi)容編排,把函數(shù)提到了數(shù)組之前介紹,而且從函數(shù)這一章開始,后面幾乎所有的程序都是按模塊化思想將程序分成一個個小函數(shù),再通過main()函數(shù)調(diào)用這些函數(shù)來實現(xiàn)主體功能,并且在后續(xù)內(nèi)容的講解中,不斷強化學(xué)生對函數(shù)的把握,強化學(xué)生模塊化程序設(shè)計的思想,學(xué)生在學(xué)習(xí)的過程當(dāng)中,不斷地復(fù)習(xí)鞏固著函數(shù)的知識,不斷地感受著模塊化程序設(shè)計的思想,也逐漸養(yǎng)成了用函數(shù)設(shè)計程序的習(xí)慣,實踐表明,到學(xué)期末的時候,大多數(shù)學(xué)生都可以寫一些簡單的函數(shù)并通過main()函數(shù)調(diào)用來進(jìn)行程序設(shè)計。
2 函數(shù)的設(shè)計思想和設(shè)計方法
在進(jìn)行程序設(shè)計時,很多學(xué)生感到困惑、難以理解和掌握的是什么時候需要設(shè)計函數(shù)和該設(shè)計什么樣的函數(shù),形參和返回值該如何設(shè)置。對這個問題,筆者認(rèn)為在講解的時候要著重把握幾點。
首先,在確定什么時候該設(shè)計函數(shù)時,需要先對整個程序的過程有個把握,確定程序的主體功能,這樣,對需不需要設(shè)計函數(shù)及對哪些部分可以設(shè)計函數(shù)就有了較為明確的答案。例如:從鍵盤上輸入一個整數(shù)n(n>1且n<10),輸出1!+2!+3!+...+n!的值。
對程序進(jìn)行分析后,可以得出程序主體可以分成兩個步驟:
輸入一個整數(shù)n;
輸出1!+2!+3!+...+n!的值。
在第2) 步驟中,由于重復(fù)用到了求階乘的功能,所以如果把求階乘這部分設(shè)計成一個函數(shù),將會對第2) 步的編程起到簡化的作用。這樣,經(jīng)過初步分析,可以確定需要設(shè)計一個函數(shù),此函數(shù)的功能是對給定的一個整數(shù)m,求出其階乘。
函數(shù)的功能確定后,接著就可以著手設(shè)計函數(shù)了。具體到函數(shù)設(shè)計時,很多學(xué)生的疑惑是怎么設(shè)計函數(shù)的參數(shù)和返回值,在這里,筆者建議學(xué)生采用“黑匣子”的方法設(shè)計函數(shù),即不需要管函數(shù)的內(nèi)部結(jié)構(gòu),把它看做一個“黑匣子”,只從外部的功能要求來確定函數(shù)應(yīng)該具備什么樣的功能,進(jìn)而確定主函數(shù)在調(diào)用該函數(shù)時需要傳遞給它什么參數(shù),它在返回主調(diào)函數(shù)時又需不需要返回值或需要返回幾個值。在上個例子中,函數(shù)的功能確定是求階乘,在主函數(shù)調(diào)用它時需要告訴它對誰求階乘,即傳遞給該函數(shù)階乘的階數(shù)m,函數(shù)調(diào)用結(jié)束后,需要m的階乘返回主調(diào)函數(shù),即只需要返回一個值,如圖1所示。
由此,我們得出此函數(shù)的相關(guān)內(nèi)容:
函數(shù)功能:求出整數(shù)m的階乘m!
函數(shù)入口參數(shù):一個形參,整形變量m表示階乘的階數(shù)
函數(shù)返回值:一個返回值,返回m!的值
這段信息可以作為注釋放在函數(shù)的開頭以便讓其他程序員有足夠的信息了解如何使用該函數(shù)。然后根據(jù)C語言中函數(shù)的定義格式可以寫出求階乘函數(shù)定義:int fact(int m);考慮到m!的范圍,我們可以將其修改定義為:long fact(int m);endprint
至此,函數(shù)的第一個難點就解決了。
3 函數(shù)的參數(shù)傳遞
在函數(shù)需要有多個返回值時,僅僅一個return就很難滿足要求了,這里就需要利用指針或全局變量將函數(shù)中的多個值傳遞到主調(diào)函數(shù)中,這屬于函數(shù)的參數(shù)傳遞問題。函數(shù)的參數(shù)傳遞是函數(shù)部分的又一個難點,可以分為值傳遞和地址傳遞,因為還關(guān)系到指針的應(yīng)用,學(xué)生一時間很難理解和掌握。鑒于這一點,筆者采用形象類比法結(jié)合內(nèi)存空間講解了值傳遞和地址傳遞的區(qū)別。
函數(shù)在被調(diào)用時新開辟了一段內(nèi)存空間,所有形參和函數(shù)內(nèi)部變量都在這個內(nèi)存空間中被訪問或修改,一旦返回主調(diào)函數(shù)這段內(nèi)存空間也就被釋放掉,形參的值不會傳遞給實參,影響到主調(diào)函數(shù)。即在進(jìn)行值傳遞時相當(dāng)于有一個復(fù)制操作,即將實參的值賦給函數(shù)空間的形參,這是一個單向傳遞,因此,對形參的改變不會影響到實參。而地址傳遞的實質(zhì)是將主調(diào)函數(shù)中的某個或多個地址放到被調(diào)函數(shù)中進(jìn)行訪問,此操作間接訪問到了主調(diào)函數(shù)中的變量,因而影響到了主調(diào)函數(shù)中的變量值。
上述講法需要學(xué)生建立內(nèi)存空間的概念,要對程序的存儲空間有所認(rèn)識,相當(dāng)一部分同學(xué)表示難以理解。筆者結(jié)合大一學(xué)生都學(xué)過計算機(jī)引論的實際情況,將值傳遞比喻為將計算機(jī)中的某一文件file1.doc拷貝給別人,別人拷走后可以隨便修改這個文件的內(nèi)容,這些修改都不會影響到原來的文件file1.doc。當(dāng)傳遞的是地址的時候,即使用指針變量作函數(shù)參數(shù)時,相當(dāng)于把機(jī)器密碼、要修改的文件路徑及文件名(如d:\project\file1.doc)告訴了別人,別人在修改時直接針對file1.doc,進(jìn)行修改后,file1.doc的內(nèi)容肯定也會發(fā)生改變,這就是地址傳遞。經(jīng)過這樣形象的比喻后,學(xué)生多表示容易理解,在寫程序時會有意識地考慮需要進(jìn)行的是值傳遞還是地址傳遞,形參該設(shè)置成普通變量還是指針變量,教學(xué)效果有所改善。
4 結(jié)語
實踐證明,在筆者進(jìn)行的函數(shù)教學(xué)中,相當(dāng)一部分同學(xué)對函數(shù)有了形象的認(rèn)識,更深地理解了模塊化程序設(shè)計的思想,取得了良好的學(xué)習(xí)效果。學(xué)無止境,教亦無止境。除了以上幾點,只函數(shù)部分就還有很多可以繼續(xù)深入挖掘的東西,比如從函數(shù)有無參數(shù)方面,函數(shù)有無返回值或是否有多個返回值方面,變量的存儲類型和生存期方面等等,這些都值得我們教師不斷地研究不斷地探討。但歸根結(jié)底,如何讓學(xué)生容易掌握要點,如何讓學(xué)生發(fā)自內(nèi)心地喜歡學(xué)習(xí)、愛上學(xué)習(xí)并善于主動學(xué)習(xí),筆者認(rèn)為才是教師的最終目的。
參考文獻(xiàn)
[1] 蘇小紅.C語言程序設(shè)計[M].2版.高等教育出版社,2013.
[2] 譚浩強.C程序設(shè)計[M].4版.清華大學(xué)出版社,2011.
[3] 何欽銘.“程序設(shè)計基礎(chǔ)”課程教學(xué)實施方案[J].中國大學(xué)教學(xué),2010(5).
[4] 董鑫正.C語言教學(xué)中函數(shù)參數(shù)傳遞問題探討[J].電腦知識與技術(shù),2012(3).endprint
至此,函數(shù)的第一個難點就解決了。
3 函數(shù)的參數(shù)傳遞
在函數(shù)需要有多個返回值時,僅僅一個return就很難滿足要求了,這里就需要利用指針或全局變量將函數(shù)中的多個值傳遞到主調(diào)函數(shù)中,這屬于函數(shù)的參數(shù)傳遞問題。函數(shù)的參數(shù)傳遞是函數(shù)部分的又一個難點,可以分為值傳遞和地址傳遞,因為還關(guān)系到指針的應(yīng)用,學(xué)生一時間很難理解和掌握。鑒于這一點,筆者采用形象類比法結(jié)合內(nèi)存空間講解了值傳遞和地址傳遞的區(qū)別。
函數(shù)在被調(diào)用時新開辟了一段內(nèi)存空間,所有形參和函數(shù)內(nèi)部變量都在這個內(nèi)存空間中被訪問或修改,一旦返回主調(diào)函數(shù)這段內(nèi)存空間也就被釋放掉,形參的值不會傳遞給實參,影響到主調(diào)函數(shù)。即在進(jìn)行值傳遞時相當(dāng)于有一個復(fù)制操作,即將實參的值賦給函數(shù)空間的形參,這是一個單向傳遞,因此,對形參的改變不會影響到實參。而地址傳遞的實質(zhì)是將主調(diào)函數(shù)中的某個或多個地址放到被調(diào)函數(shù)中進(jìn)行訪問,此操作間接訪問到了主調(diào)函數(shù)中的變量,因而影響到了主調(diào)函數(shù)中的變量值。
上述講法需要學(xué)生建立內(nèi)存空間的概念,要對程序的存儲空間有所認(rèn)識,相當(dāng)一部分同學(xué)表示難以理解。筆者結(jié)合大一學(xué)生都學(xué)過計算機(jī)引論的實際情況,將值傳遞比喻為將計算機(jī)中的某一文件file1.doc拷貝給別人,別人拷走后可以隨便修改這個文件的內(nèi)容,這些修改都不會影響到原來的文件file1.doc。當(dāng)傳遞的是地址的時候,即使用指針變量作函數(shù)參數(shù)時,相當(dāng)于把機(jī)器密碼、要修改的文件路徑及文件名(如d:\project\file1.doc)告訴了別人,別人在修改時直接針對file1.doc,進(jìn)行修改后,file1.doc的內(nèi)容肯定也會發(fā)生改變,這就是地址傳遞。經(jīng)過這樣形象的比喻后,學(xué)生多表示容易理解,在寫程序時會有意識地考慮需要進(jìn)行的是值傳遞還是地址傳遞,形參該設(shè)置成普通變量還是指針變量,教學(xué)效果有所改善。
4 結(jié)語
實踐證明,在筆者進(jìn)行的函數(shù)教學(xué)中,相當(dāng)一部分同學(xué)對函數(shù)有了形象的認(rèn)識,更深地理解了模塊化程序設(shè)計的思想,取得了良好的學(xué)習(xí)效果。學(xué)無止境,教亦無止境。除了以上幾點,只函數(shù)部分就還有很多可以繼續(xù)深入挖掘的東西,比如從函數(shù)有無參數(shù)方面,函數(shù)有無返回值或是否有多個返回值方面,變量的存儲類型和生存期方面等等,這些都值得我們教師不斷地研究不斷地探討。但歸根結(jié)底,如何讓學(xué)生容易掌握要點,如何讓學(xué)生發(fā)自內(nèi)心地喜歡學(xué)習(xí)、愛上學(xué)習(xí)并善于主動學(xué)習(xí),筆者認(rèn)為才是教師的最終目的。
參考文獻(xiàn)
[1] 蘇小紅.C語言程序設(shè)計[M].2版.高等教育出版社,2013.
[2] 譚浩強.C程序設(shè)計[M].4版.清華大學(xué)出版社,2011.
[3] 何欽銘.“程序設(shè)計基礎(chǔ)”課程教學(xué)實施方案[J].中國大學(xué)教學(xué),2010(5).
[4] 董鑫正.C語言教學(xué)中函數(shù)參數(shù)傳遞問題探討[J].電腦知識與技術(shù),2012(3).endprint
至此,函數(shù)的第一個難點就解決了。
3 函數(shù)的參數(shù)傳遞
在函數(shù)需要有多個返回值時,僅僅一個return就很難滿足要求了,這里就需要利用指針或全局變量將函數(shù)中的多個值傳遞到主調(diào)函數(shù)中,這屬于函數(shù)的參數(shù)傳遞問題。函數(shù)的參數(shù)傳遞是函數(shù)部分的又一個難點,可以分為值傳遞和地址傳遞,因為還關(guān)系到指針的應(yīng)用,學(xué)生一時間很難理解和掌握。鑒于這一點,筆者采用形象類比法結(jié)合內(nèi)存空間講解了值傳遞和地址傳遞的區(qū)別。
函數(shù)在被調(diào)用時新開辟了一段內(nèi)存空間,所有形參和函數(shù)內(nèi)部變量都在這個內(nèi)存空間中被訪問或修改,一旦返回主調(diào)函數(shù)這段內(nèi)存空間也就被釋放掉,形參的值不會傳遞給實參,影響到主調(diào)函數(shù)。即在進(jìn)行值傳遞時相當(dāng)于有一個復(fù)制操作,即將實參的值賦給函數(shù)空間的形參,這是一個單向傳遞,因此,對形參的改變不會影響到實參。而地址傳遞的實質(zhì)是將主調(diào)函數(shù)中的某個或多個地址放到被調(diào)函數(shù)中進(jìn)行訪問,此操作間接訪問到了主調(diào)函數(shù)中的變量,因而影響到了主調(diào)函數(shù)中的變量值。
上述講法需要學(xué)生建立內(nèi)存空間的概念,要對程序的存儲空間有所認(rèn)識,相當(dāng)一部分同學(xué)表示難以理解。筆者結(jié)合大一學(xué)生都學(xué)過計算機(jī)引論的實際情況,將值傳遞比喻為將計算機(jī)中的某一文件file1.doc拷貝給別人,別人拷走后可以隨便修改這個文件的內(nèi)容,這些修改都不會影響到原來的文件file1.doc。當(dāng)傳遞的是地址的時候,即使用指針變量作函數(shù)參數(shù)時,相當(dāng)于把機(jī)器密碼、要修改的文件路徑及文件名(如d:\project\file1.doc)告訴了別人,別人在修改時直接針對file1.doc,進(jìn)行修改后,file1.doc的內(nèi)容肯定也會發(fā)生改變,這就是地址傳遞。經(jīng)過這樣形象的比喻后,學(xué)生多表示容易理解,在寫程序時會有意識地考慮需要進(jìn)行的是值傳遞還是地址傳遞,形參該設(shè)置成普通變量還是指針變量,教學(xué)效果有所改善。
4 結(jié)語
實踐證明,在筆者進(jìn)行的函數(shù)教學(xué)中,相當(dāng)一部分同學(xué)對函數(shù)有了形象的認(rèn)識,更深地理解了模塊化程序設(shè)計的思想,取得了良好的學(xué)習(xí)效果。學(xué)無止境,教亦無止境。除了以上幾點,只函數(shù)部分就還有很多可以繼續(xù)深入挖掘的東西,比如從函數(shù)有無參數(shù)方面,函數(shù)有無返回值或是否有多個返回值方面,變量的存儲類型和生存期方面等等,這些都值得我們教師不斷地研究不斷地探討。但歸根結(jié)底,如何讓學(xué)生容易掌握要點,如何讓學(xué)生發(fā)自內(nèi)心地喜歡學(xué)習(xí)、愛上學(xué)習(xí)并善于主動學(xué)習(xí),筆者認(rèn)為才是教師的最終目的。
參考文獻(xiàn)
[1] 蘇小紅.C語言程序設(shè)計[M].2版.高等教育出版社,2013.
[2] 譚浩強.C程序設(shè)計[M].4版.清華大學(xué)出版社,2011.
[3] 何欽銘.“程序設(shè)計基礎(chǔ)”課程教學(xué)實施方案[J].中國大學(xué)教學(xué),2010(5).
[4] 董鑫正.C語言教學(xué)中函數(shù)參數(shù)傳遞問題探討[J].電腦知識與技術(shù),2012(3).endprint