文章目錄
第四章 函數
很多人到現在還分不清楚什麼是函數,什麼是方法,非常之困惑。其實,這兩種概念是換湯不換藥,講到都是同一種東西。方法是物件導向的產物,比如,我們說使用某的對象的某個方法;函數是面向過程的產物,比如,我們經常會說執行某個函數。不管是函數還是方法,它們的寫法都是一樣的。本章將向大家詳細介紹函數的相關概念。
本章的學習重點:
◆ 函數的概念
◆ 函數的文法
◆ 函數的調用及執行過程
4.1函數概念
在數學領域,我們經常會聽到函數的概念,比如三角函數中的正弦函數,餘弦函數,正切函數,餘切函數,這些對於我們來說,再熟悉不過了,只要輸入相對應的變數就可以計算出結果。格式為y=f(x)。x稱為自變元,y稱為因變元,f稱為函數名。
今天,在電腦領域,也繼承了這種思維方式,把一段經常需要使用的代碼封裝起來,在需要使用時可以直接調用,並且返回結果。格式為y=f(x)。x稱為參數,y稱為傳回值,f稱為函數名。同時,也再一次說明了電腦與數學的互補關係。
4.1.1函數的概念
函數就是一段準備好的代碼,它可以接受參數,處理邏輯,然後返回某些資料。我們通常使用函數來實現某個單一功能,通過對多個函數的組織和調用來實現整個程式的功能。函數相當於把一個複雜的較大的程式,分解為單一的較小的程式模組。所以,有時我們也把函數成為子程式。
在C#語言中,存在兩種函數,一種是運行時提供的標準庫函數,稱為內建函數。這種函數不需要使用者定義就可以直接使用。比如,Console.Write(),Console.Read()等函數。微軟公司在開發.NET平台的時候已經把我們在編寫程式時經常需要使用的函數,以最優的方式編寫好了,並以類庫的方式提供給使用者使用。使用者使用時只需按內建函數給出的函數名和相關規則直接調用即可。
另一種是使用者自訂的函數,稱為自訂函數。儘管內建函數能為程式設計提供方便,使程式的品質和效率得以提高,但其數量畢竟有限,不能完全滿足使用者的特殊需求。因此,C#語言允許使用者按C#語言的函數文法自己設計函數,來實現更個人化的功能。
作者心得:
函數這一節很重要,可以說一個程式的優劣集中體現在函數上。如果函數使用的恰當,可以讓程式看起來有條理,容易看懂。如果函數使用的亂七八糟,或者是沒有使用函數,程式就會顯得很亂,不僅讓別人無法查看,就連自己也容易暈頭轉向。可以這樣說,如果超過100行的程式中沒有使用函數,那麼這個程式一定很羅嗦(有些絕對,但也是事實)。
4.1.2函數的文法
上一節,我們講到了內建函數和自訂函數,內建函數比較簡單只要知道函數的作用以及調用規則就可以順利的使用了。內建函數的內部實現和自訂函數的實現是一樣的,所以,我們只要理解了自訂函數,自然就明白了內建函數的使用方法。下面我們向大家介紹自訂函數的文法,簡稱函數的文法。
一個函數包括函數頭和語句體兩個部分,語句體比較容易理解,就是指函數的內部實現。函數頭由三個部分組成:傳回值類型,函數名,參數表。格式如下:
傳回值類型 函數名(參數表)
{
語句體;
}
傳回值類型用來定義函數返回的資料是什麼類型的,可以是前面說到的某個內建資料類型、或者是自訂資料類型,在語句體中使用return關鍵字來返回資料。如果沒有傳回值,使用void關鍵字來代替具體的傳回值類型。
函數名用來代表函數的標識,所以在程式中必須是唯一的,不能重複定義。它也必須遵循我們在講述變數時所講的標識符命名規則。
參數表用來向語句體傳送外部資料,可以沒有參數,也可以有多個參數。在函數調用的時候,參數可以是實值型別,也可以是參考型別。語句體對實值型別參數的修改不會影響函數外部的實值型別資料。但是語句體對參考型別參數的修改會影響函數外部的參考型別資料。
語句體可以申明局部變數,並且可以編寫代碼實現功能的邏輯。
我們在前面其實已經接觸過函數了,例如:Console.WriteLine()函數,我們並不知道它的內部是什麼,我們只要會使用它即可。下面我們來看一個範例:
using System;
namespace Microsoft.Example
{
public class TestFunction
{
static int Add(int a, int b, int c) //定義Add函數
{
return a + b + c; //傳回值
}
static void Main(string[] args)
{
int a = 1; //定義int類型的變數a
int b = 2; //定義int類型的變數b
int c = 3; //定義int類型的變數c
int result = Add(a, b, c); //調用Add函數
Console.WriteLine("結果為:" + result);
}
}
}
上述代碼中,第6行定義了一個Add函數,其中int是它的傳回值類型,Add是函數名。這個函數需要輸入三個整數a b c作為參數表。
第8行是函數的語句體,用來實現函數的功能,這裡實現的是三個整數相加。然後使用return關鍵字把結果返回調用函數的語句中。這裡需要注意了,return關鍵字返回的類型要與函數名前面的回返實值型別一致。
最後的輸出結果是:
結果為:6
作者心得:
函數名的命名可大有學問,我們需要記住的第一條就是名稱要有真實意義。看著函數名就知道,函數的作用是什麼,實現什麼功能。在C#語言中一般使用動賓格式來命名,而不是主賓格式。例如:GetAge()函數。
4.1.3函數的調用及執行過程
上一節向大家講述了如何定義一個函數,這一節將向大家講述如何調用一個已經定義了的函數,以及函數調用的相關知識。
函數的調用格式:
函數名(參數表);
需要說明一下,函數名必須與函數定義的函數名一致,這個估計大家不會做錯。參數表也是一樣,必須與函數定義的參數表一致,類型,個數,順序都要一致。當多個參數時,使用逗號相互隔開。作為參數表中的參數可以是常量,有值的變數或者運算運算式。
在C#語言中,函數調用根據在程式中出現的位置來分,可以有以下三種調用方式:
1、以函數調用語句的形式調用。當函數調用不要求傳回值時,可由函數調用加上分號構成來實現,即該函數調用作為一個獨立的語句使用。
例如:test();
test()函數調用相當於執行一段相關程式。
2、函數調用作為一個運算對象直接出現在一個運算式中。例如:
k=sin(x)*cos(y);
該指派陳述式包含兩個函數調用,每個函數調用都是運算式的一個運算對象。因此要求函數應帶回一個確定的值參加運算式的運算,這種運算式稱為函數運算式。
3、將一個函數調用的傳回值作為另一個函數調用的實參。例如:k=sin(cos(x));
下面我們來看一個範例:
using System;
namespace Microsoft.Example
{
public class TestTransfer
{
static int Add(int a, int b, int c) //定義Add函數
{
int sum; //定義一個int變數sum
sum = a * (b + c); //進行計算
Console.WriteLine("a的值為:" + a);
Console.WriteLine("b的值為:" + b);
Console.WriteLine("c的值為:" + c);
return sum; //傳回值
}
static void Main(string[] args)
{
int j, sum; //定義兩個int類型的變數
Console.Write("請輸入J的值:");
int.TryParse(Console.ReadLine(), out j);
sum = Add(j, ++j, ++j); //調用Add函數
Console.WriteLine("計算結果sum是:" + sum);
Console.Write("請輸入J的值:");
int.TryParse(Console.ReadLine(), out j);
sum = Add(++j, ++j, j); //調用Add函數
Console.WriteLine("計算結果sum是:" + sum);
}
}
}
上述代碼中,當輸入j=1,調用函數Add(j,++j,++j)時,按從左至右的順序,先計算運算式的值,相
當於Add(1,2,3)函數調用,Function Compute傳回值 1*(2+3)=5。
當再次輸入j=1,調用函數Add(++j,++j,j)時,按從左至右的順序,先計算運算式的值,相當於Add(2,3,3)函數調用,Function Compute傳回值 2*(3+3)=12。
這裡需要注意的是,C#對於參數為運算式是,使用的是從左至右的計算順序。其他語言可能有所不同,比如C語言使用的是從右至左的計算順序。
最後的輸出結果是:
請輸入J的值:1
a的值為:1
b的值為:2
c的值為:3
計算結果sum是:5
請輸入J的值:1
a的值為:2
b的值為:3
c的值為:3
計算結果sum是:12