Noob's Space

我要學會 C 語言(七):寫一遍就能用好幾遍好方便的函式

C 語言中,可以把重複的程式提出來寫成函式(function),而需要的時候直接呼叫這個函式就好,也就是模組化的概念。

什麼叫模組化?簡單來說,就是把特定功能分出來當成一個模組,需要的時候只要呼叫這個模組就好;而需要修正的時候也只要修正模組即可。

比方說,有一個可以算 1+2+…+100 的程式如下:

#include <stdio.h>

int main(){
	int i, sum=0;
	for(i=1;i<=100;i++){
		sum += i;
	}
	printf("%d", i);
	return 0;
}

而其中第 4 行到第 8 行是用來計算和輸出的程式碼。我們可以把它獨立出來,寫成一個函式,必且在 main 主程式中呼叫它。例如我們把這個部分命名為 Count1T100:

#include <stdio.h>

void Count1To100(){
	int i, sum=0;
	for(i=1;i<=100;i++){
		sum += i;
	}
	printf("%d", i);
}

int main(){
	Count1To100();
	return 0;
}

這樣就算寫好一個簡單的函式囉!

不過你也許會說,程式好好的幹嘛沒事寫成一個函式?這樣看起來沒感覺,當你程式很多地方都需要重複寫它的時候,你就有感覺了。另外,函式還有更好用的一個地方,就是它可以傳入和回傳值。

傳入值和回傳值是什麼?

這大概要先從數學上的函數開始講起了。 f(x) = x+1,看到這個函數你想到什麼?

在數學的函數中,可以把 x 代入不同的數,得到不同的對應值,例如 f(2)=3、f(3)=4、f(4)=5……等等。以 f(2)=3 來說,2 就是傳入值,3就是回傳值。

而函數的代入值也不見得只有一個,例如 f(x, y) = x+y+2。那就會得到 f(1, 1)=4、f(2, 3)=7  …… 等等。

函式、函數,傻傻分不清楚?

函式和函數在英文都是 function,只是翻譯問題而已。原則上是一樣的東西。

C 語言的函式呢?

C 語言的函式和數學上的函數用法基本上是一樣的。要先看看函式有幾個傳入值,把相對應的傳入值傳進去後,就會做指定動作,然後回傳一個回傳值。

好饒舌啊 QQ,更饒舌的是 C 語言的函數不一定要有傳入值和回傳值

在開始之前,來回顧一下資料型態吧。變數有不同的形態,常見的有 int、double 等等。另外,如果空的話會寫成 void。

那,來看看一個簡易的加法函式好了:

int plus(int a, int b){
	return a+b;
}

首先一開始宣告這個函式的資料型態,也就是要回傳的資料型態,接著打函式的名字,小括號內放的是傳入值的資料型態和名稱。接著就和一般寫程式沒有兩樣了,只是最後要把結果用 return 來回傳。

例如這個函式會回傳 int 型態,名字叫做 plus,使用的時候需要傳入兩個 int,一個叫 a、一個叫 b,最後把 a+b 的結果回傳回去。

那要怎麼用它呢?以下這個範例程式:

#include <stdio.h>

int plus(int a, int b){
	return a+b;
}

int main(){
	int m, n;
	scanf("%d %d", &m, &n);
	int result = plus(m, n);
	printf("%d", result);
}

一開始把 plus 函式寫在前面,main 主程式裡面做的事情是:開兩個整數 m、n,用 scanf 得到兩個使用者輸入的數,分別存到 m、n 變數裡面。

接著我再開一個變數叫 result,存放 plus(m, n) 的計算結果。為什麼 result 要開 int 而不是 double 或其他資料型態?因為 plus 函式的開頭是寫 int,代表回傳值會是 int 類型。

這時,result 裡面存放的已經是 m 和 n 相加結果的值了,可以直接用 printf 把它輸出。

另外,為什麼函式的傳入值是 a、b,但 main 丟的是 m、n?這樣也可以?

在 C 語言裡面,每個變數在自己的函式裡面都是獨立的,main 裡面宣告的變數和其他函式宣告的變數不會互相影響。例如這個例子中 main 在呼叫 plus 函式時,丟的其實是 m、n 的值,而 plus 函式也只是把這個值接過來而已,它們並不在意變數到底怎麼命名的。

要是能夠理解這裡在說什麼的話,其實也可以把函式當作一個變數使用。例如剛剛那個範例的 main 裡面可以改成這樣:

int main(){
	int m, n;
	scanf("%d %d", &m, %n);
	printf("%d", plus(m, n));
	return 0;
}

就不用另外去開一個變數來儲存。

對了,值得注意的是:函式一遇到 return,就會把後面的值傳出去,然後函式裡剩下的東西都不會執行了唷!

OK 到這裡還是不能理解的話,建議你先多看幾遍。函式之間是怎麼運作的比怎麼寫函式還重要!畢竟函式並沒有一定的寫法,你是要把 plus 當成 int 回傳,還是要把 plus 當 void 在裡面直接 printf,這些都是可以視情況而定的,更何況等你熟練了以後還可以直接去套別人寫好的函式來用,根本不用自己寫函式

我要學會 C 語言 目錄

廣告