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