巨同升



摘要:采用傳統的“解釋法”講解c語言函數的編寫方法,不利于學習者的理解和掌握。采用“分解法”和“改寫法”,則可以比較好地解決傳統方法的不足,收到良好的教學效果。
關鍵詞:解釋法;分解法改寫法
中圖分類號:G642 文獻標識碼:A
文章編號:1009-3044(2019)30-0110-03
1概述
在c語言中函數是程序的基本構成要素,是編程時頻繁使用的程序單位,其重要性是不言而喻的。但是從教學效果方面來看,多數學生對于函數的理解掌握并不理想。有的學生雖然能夠用單獨的main函數完成程序,但是要分解為幾個函數,就會感覺無從下手。
這其中有C語言自身特點的客觀原因,比如C語言的函數同時包含了大多數編程語言中子程序和函數這兩種程序單位的功能,在一定程度上提高了編寫函數的難度。另一方面也有來自教材和教學方法方面的原因。綜觀絕大多數C語言程序設計教材,在講述如何定義一個函數時,往往都是采用“解釋法”。也就是直接將函數寫出來,然后再做分析解釋。至于這個函數是如何寫出來的、為什么這么寫,則鮮有分析說明。從而給學習者造成一種神秘、無章可循的感覺。
從講授者的角度,或許覺得這樣編寫函數是理所當然的,無需更多的解釋,或者只可意會,不可言傳。其實如何定義一個函數也是有其內在規律的,甚至可以像數學公式那樣一步一步地推導出來。這就要求講授者能夠發現并歸納出其中的內在規律并傳授給學生。學生一旦有了編寫函數的依據,再來編寫函數也就不再感覺神秘、無章可循了。
下面就來介紹兩種行之有效的編寫函數的方法:分解法和改寫法。
2分解法
所謂分解法,就是首先將整個程序的功能用一個獨立main函數實現,然后再將這個main函數分解為主調函數和被調函數。
為了便于理解,我們將無參函數和有參函數的定義和調用的方法分開來介紹。
2.1無參函數的定義和調用
例1.編寫程序,打印出如下圖形。
首先,我們編寫一個只有main函數的程序來實現上述功能。
我們發現,在這個程序中打印三角形的程序段重復了兩次,但是也不方便將這兩段合并為一個新的循環。因此,為了提高編程效率,避免重復,在本程序中可以將打印三角形的程序段單獨拿出來,定義為一個函數,然后在主函數中調用它。
如何寫出打印三角形的函數呢?只需要用對應的程序段,添加上return語句作為函數體,然后再添加函數頭就可以了。
此處的printstar是自定義函數的名字。函數名之前的void是函數的類型,void也稱為空值類型,表示該函數沒有返回值。當函數體中的return之后直接跟分號時,函數類型就應該定義為void類型。return語句的功能,是返回到主調函數中繼續執行。
由于這個函數運行時,不需要從主調函數中傳遞數據,因此它是一個無參函數,也就是函數名之后有一對空括號。
一旦定義好了用戶函數,就可以像調用庫函數那樣調用它了。因為前面已經定義好了打印一個三角形的被調函數,故可以在主函數中直接調用它。由于函數printstar沒有返回值,因此不能在表達式中調用它;而只能在函數調用之后添加分號,使其成為一條語句,即printstar()。
在該程序中,求階乘的程序段重復了三次,但是觀察這三段程序,發現并不能簡單地將它們合并為一個新的循環。
為了提高編程效率,避免重復,在該程序中可以將求k的階乘的程序段單獨拿出來,定義為一個被調函數,然后在主函數中調用它。
根據在例1中獲得的經驗,構造被調函數的方法是以相應的程序段添加return語句作為函數體,然后再添加函數頭即可。按照這個方法,可以得到如下被調函數。
當我們運行該程序時可以發現,主函數中變量k的值并不能傳遞給被調函數中的變量k,被調函數中變量p的值也不能傳遞給主函數中的變量p。這是因為凡是在函數內部定義的變量都是局部變量,而局部變量只有在定義它的函數中才是有效的。因此,這兩個函數中的變量k是兩個相互獨立、互不相關的變量;變量p也一樣。
那么,如何才能實現主調函數與被調函數之間的數據傳遞呢?為了解決這個問題,在C語言中提供了參數傳遞和返回值的機制。
一方面,將被調函數中用于接受數據的變量的定義,移到函數首部的括號中,稱為被調函數的形式參數(形參)。這種函數運行時,將通過形參從主調函數中傳遞數據,故稱為有參函數。
另一方面,將被調函數中用來向主調函數傳遞數據的變量(或表達式)置于return之后,稱為被調函數的返回值。
函數名前邊的類型說明符,稱為函數的類型,通常與return之后變量(或表達式)的類型相一致。
一旦定義好了求階乘的被調函數,就可以像調用庫函數那樣來調用它了。因此,我們很容易編寫出調用該函數求組合值的主函數。
3改寫法
除了采用上面的分解法編寫函數之外,也可以采用改寫法。所謂改寫法,就是首先編寫一個能夠實現被調函數基本功能的main函數,然后再將這個main函數改寫為被調函數。
例3.已知一個圓環的內外半徑,要求編寫一個求圓面積的被調函數,然后調用該函數求出圓環的面積。
然后再將上述主函數改寫為被調函數。改寫的方法就是將原程序中需要輸入的變量改為形參,將原程序中需要輸出的變量(或表達式)改為函數的返回值。從而得到如下被調函數。